skills/panda-doc-upload-docs/SKILL.md
Work with PandaDoc via its Public API: create and send documents from templates or PDFs, list and track documents, and use webhooks for status changes.
npx skillsauth add tippyentertainment/skills panda-doc-upload-docsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You use this skill whenever the user wants to generate or manage documents, proposals, quotes, contracts, or e‑signatures using PandaDoc workspaces, templates, or PDFs via the PandaDoc Public API.
Your goals:
The user will usually be a developer or power user, comfortable with JSON and APIs.
Before using this skill, assume the following configuration is already set up by the platform, not by you:
PANDADOC_API_KEY.You never print or request the raw API key.
You only describe:
Default base URL:
https://api.pandadoc.com/public/v1
All requests must include (platform responsibility):
Authorization: Bearer {PANDADOC_API_KEY}.Content-Type: application/json for JSON requests.If the user mentions OAuth2, you may refer them to PandaDoc OAuth docs, but prefer API key for server‑to‑server integrations.
Use this skill when the user asks for things like:
Do not use this skill when:
Below are the canonical workflows. Adapt IDs/fields to the user's context.
Use when the user has a PandaDoc template and wants to generate a document with variables (tokens), recipients, and send options.
Endpoint
POST/documentsRequired headers
Authorization: Bearer {PANDADOC_API_KEY}Content-Type: application/jsonTypical request body (template source)
{
"name": "Sales Proposal for {{customer_name}}",
"template_uuid": "TEMPLATE_UUID_HERE",
"recipients": [
{
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"role": "Client"
}
],
"tokens": [
{ "name": "customer_name", "value": "Acme Corp" },
{ "name": "proposal_amount", "value": "25000" }
],
"metadata": {
"external_id": "crm-opportunity-12345",
"source": "taskingtech-bot"
},
"send": true
}
Response (201 Created)
{
"id": "DOCUMENT_UUID",
"name": "Sales Proposal for Acme Corp",
"status": "document.draft",
"recipients": [...],
"tokens": [...],
"date_created": "2025-01-15T10:30:00Z",
"date_modified": "2025-01-15T10:30:00Z"
}
Key fields
template_uuid: The UUID of the PandaDoc template to use.recipients: Array of signer objects with email, name, and role.tokens: Array of variable name/value pairs to fill template [REDACTED]s.metadata: Optional external tracking ID.send: If true, sends immediately after creation.Use when the user has a PDF file (e.g., generated by [REDACTED]) and wants to upload it to PandaDoc for e‑signature.
Endpoint
POST/documentsRequired headers
Authorization: Bearer {PANDADOC_API_KEY}Content-Type: multipart/form-data`Request body (multipart form)
file: The PDF file binary.name: Document name (optional, defaults to filename).recipients[]: JSON array of recipient objects.metadata: JSON object for external tracking.Example using http_post
{
"url": "https://api.pandadoc.com/public/v1/documents",
"method": "POST",
"headers": {
"Authorization": "Bearer {PANDADOC_API_KEY}"
},
"body": {
"file": "[PDF_BINARY_DATA]",
"name": "Contract for Acme Corp",
"recipients": [
{
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"role": "Client"
}
]
}
}
Response (201 Created)
Same structure as template-based creation.
Use when the user wants to see all documents in their workspace.
Endpoint
GET/documentsQuery parameters (optional)
status: Filter by status (e.g., document.draft, document.sent, document.completed).q: Search query (document name or ID).count: Number of results (default 50, max 100).page: Page number for pagination.Example request
{
"url": "https://api.pandadoc.com/public/v1/documents?status=document.sent&count=20",
"method": "GET",
"headers": {
"Authorization": "Bearer {PANDADOC_API_KEY}"
}
}
Response (200 OK)
{
"count": 20,
"next": "https://api.pandadoc.com/public/v1/documents?page=2",
"previous": null,
"results": [
{
"id": "DOCUMENT_UUID",
"name": "Sales Proposal for Acme Corp",
"status": "document.sent",
"date_created": "2025-01-15T10:30:00Z",
"date_modified": "2025-01-15T10:35:00Z"
},
...
]
}
Use when the user wants full details of a specific document.
Endpoint
GET/documents/{DOCUMENT_ID}Response (200 OK)
{
"id": "DOCUMENT_UUID",
"name": "Sales Proposal for Acme Corp",
"status": "document.completed",
"recipients": [
{
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"role": "Client",
"status": "completed",
"date_completed": "2025-01-16T14:22:00Z"
}
],
"tokens": [...],
"metadata": {...},
"date_created": "2025-01-15T10:30:00Z",
"date_modified": "2025-01-16T14:22:00Z"
}
Use when a document was created in draft mode and the user wants to send it now.
Endpoint
POST/documents/{DOCUMENT_ID}/sendRequest body
{
"subject": "Please sign this proposal",
"message": "Hi Jane,\n\nPlease review and sign the attached proposal.\n\nBest,\nRyan",
"silent": false
}
Response (200 OK)
{
"id": "DOCUMENT_UUID",
"status": "document.sent",
"message": "Document sent successfully"
}
Use when the user wants a direct link to view or download the document.
Endpoint
POST/documents/{DOCUMENT_ID}/sessionRequest body
{
"recipient": "[email protected]",
"lifetime": 3600
}
Response (201 Created)
{
"id": "SESSION_UUID",
"document_id": "DOCUMENT_UUID",
"url": "https://app.pandadoc.com/s/SESSION_UUID",
"expires_at": "2025-01-15T11:30:00Z"
}
Use when the user wants the signed document as a PDF file.
Endpoint
GET/documents/{DOCUMENT_ID}/download/pdfResponse
Binary PDF file with Content-Type: application/pdf.
Use when the user wants to remove a document from PandaDoc.
Endpoint
DELETE/documents/{DOCUMENT_ID}Response (204 No Content)
Empty body on success.
PandaDoc can send webhook events to a public HTTPS endpoint when document status changes.
| Event | Description |
|-------|-------------|
| document_completed | All recipients have signed |
| document_viewed | A recipient opened the document |
| document_sent | Document was sent for signature |
| document_declined | A recipient declined to sign |
| recipient_completed | A specific recipient signed |
{
"event": "document_completed",
"data": {
"id": "DOCUMENT_UUID",
"name": "Sales Proposal for Acme Corp",
"status": "document.completed",
"date_created": "2025-01-15T10:30:00Z",
"date_modified": "2025-01-16T14:22:00Z",
"recipients": [...]
},
"timestamp": "2025-01-16T14:22:00Z"
}
The user must:
https://yourserver.com/webhooks/pandadoc).[REDACTED] can help by:
http_post to send data to other services when webhooks arrive.PandaDoc API returns standard HTTP status codes:
| Code | Meaning | |------|---------| | 200 | Success | | 201 | Created | | 204 | No Content (successful delete) | | 400 | Bad Request (invalid JSON, missing fields) | | 401 | Unauthorized (invalid or missing API key) | | 403 | Forbidden (insufficient permissions) | | 404 | Not Found (document or template doesn't exist) | | 429 | Rate Limited (too many requests) | | 500 | PandaDoc Server Error |
Error response body
{
"detail": "Invalid template_uuid provided"
}
Always check the detail field for error messages.
Set send: true in the create request body to immediately send after creation.
send: false./documents/{id}/send when ready.Use metadata.external_id to link PandaDoc documents to CRM records, deals, or tasks.
If webhooks aren't set up, poll /documents/{id} periodically to check status.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| action | string | Yes | One of: create, upload, list, get, send, session, download, delete |
| document_id | string | Conditional | Document UUID (required for get, send, session, download, delete) |
| template_uuid | string | Conditional | Template UUID (required for create from template) |
| name | string | No | Document name |
| recipients | array | Conditional | Array of recipient objects |
| tokens | array | No | Array of token name/value pairs |
| metadata | object | No | External tracking metadata |
| send | boolean | No | Send immediately after creation (default: false) |
| file | binary | Conditional | PDF file for upload (required for upload action) |
| status | string | No | Filter by status (for list action) |
| q | string | No | Search query (for list action) |
| count | integer | No | Number of results (for list action) |
| page | integer | No | Page number (for list action) |
| Action | Success Response |
|--------|------------------|
| create | { id, name, status, recipients, tokens, date_created, date_modified } |
| upload | { id, name, status, recipients, date_created, date_modified } |
| list | { count, next, previous, results: [...] } |
| get | { id, name, status, recipients, tokens, metadata, date_created, date_modified } |
| send | { id, status, message } |
| session | { id, document_id, url, expires_at } |
| download | Binary PDF file |
| delete | Empty (204 No Content) |
{
"action": "create",
"template_uuid": "abc123-template-uuid",
"name": "Q1 Sales Proposal",
"recipients": [
{
"email": "[email protected]",
"first_name": "Alice",
"last_name": "Johnson",
"role": "Client"
}
],
"tokens": [
{ "name": "company_name", "value": "Acme Corp" },
{ "name": "deal_value", "value": "50000" },
{ "name": "proposal_date", "value": "2025-01-15" }
],
"metadata": {
"external_id": "crm-deal-789",
"source": "taskingtech"
},
"send": true
}
{
"action": "upload",
"file": "[PDF_BINARY]",
"name": "Service Agreement",
"recipients": [
{
"email": "[email protected]",
"first_name": "Bob",
"last_name": "Williams",
"role": "Signer"
}
]
}
{
"action": "list",
"status": "document.sent",
"count": 50
}
{
"action": "session",
"document_id": "doc-uuid-123",
"recipient": "[email protected]",
"lifetime": 3600
}
{
"action": "download",
"document_id": "doc-uuid-123"
}
This skill integrates seamlessly with other [REDACTED] capabilities:
generate_pdf to create a contract, then upload it for e‑signature.To use this skill, the user must:
https://api.pandadoc.com/public/v1/sandbox for testing.https://api.pandadoc.com/public/v1 for live documents.| Issue | Solution | |-------|----------| | 401 Unauthorized | Check API key is valid and has correct permissions | | 404 Not Found | Verify template_uuid or document_id exists in the workspace | | Invalid tokens | Ensure token names match template [REDACTED]s exactly | | Rate limited | Wait and retry, implement exponential backoff | | Webhook not received | Verify endpoint is public HTTPS, check PandaDoc dashboard for delivery status |
Full PandaDoc Public API documentation: https://developers.pandadoc.com/reference
This skill enables [REDACTED] to create, send, track, and manage e‑signature documents via PandaDoc's Public API.
development
A top-tier product/UI designer skill that uses Tailwind v4 plus Google Gemini Nano Banana image models to craft visually stunning, “award‑winning” marketing sites and apps with strong art direction, motion, and systems thinking.
development
Meticulously detect and fix missing React/TSX imports, undefined components, and bundler runtime errors in the WASM SPA build/preview pipeline. Ensures JSX components, icons, and hooks are properly imported or defined before running the browser preview, so the runtime safety-net rarely triggers.
development
Debug and auto-fix Vite projects running inside WebContainers: resolve mount/root issues, alias/path errors, missing scripts, and other common dev-time problems so the app boots cleanly.
tools
Diagnose and fix Vite + React 19 configuration issues for TypeScript SPA and WASM preview builds. Specializes in React 19’s JSX runtime, @vitejs/plugin-react, path aliases, SPA routing, and dev-server behavior so the app and in-browser preview bundle cleanly without manual trial-and-error.