PandaDoc
Generate, send, and track quotes and proposals via the PandaDoc REST API.
This tool lists documents, reads a document's status/details, creates a
document from a template, and sends a document for signature. It uses the
Python standard library only (no requests), and every call returns the raw
PandaDoc response body plus the HTTP status code.
- Base URL:
https://api.pandadoc.com/public/v1 - Auth:
Authorization: API-Key <apiKey>(a single API key — no OAuth flow required)
Operations
| operation | method + path | required inputs | optional inputs |
|---|---|---|---|
list_documents |
GET /documents |
— | status, count, query |
get_document |
GET /documents/{id} |
documentId |
— |
create_document |
POST /documents |
name, templateUuid, recipientEmail |
recipientFirstName, recipientLastName, recipientRole |
send_document |
POST /documents/{id}/send |
documentId |
subject, message, silent |
Notes:
- list_documents status is a PandaDoc status code (0–13); count defaults
to 50, max 100; query searches by name or reference number.
- A document must be in document.draft status before send_document will
send it. create_document is asynchronous — poll get_document until the
status leaves document.uploaded before sending.
- silent: true on send_document suppresses recipient and sender email
notifications.
API key setup
- Sign in to PandaDoc.
- Go to Settings → API & Integrations → API Key.
- Copy the Sandbox key for testing or the Production key for live use.
- Pass it as the
apiKeyinput. The tool sends it asAuthorization: API-Key <apiKey>.
The key is the only credential needed — there is no OAuth/JWT exchange for the API-key flow.
Output
Every operation prints a JSON envelope:
{ "status": "200", "result": "<raw PandaDoc JSON response as a string>" }
On a bad input or a transport failure (DNS, connection refused, timeout) the
tool prints {"error": "<message>"} and exits non-zero so the job step fails.
HTTP 4xx/5xx responses are NOT treated as transport failures — the PandaDoc
error body is returned in result with its real status code so you can see
exactly what PandaDoc rejected.
Examples
List the 10 most recently changed documents:
{
"apiKey": "YOUR_KEY",
"operation": "list_documents",
"count": "10"
}
Search documents by name or reference number:
{
"apiKey": "YOUR_KEY",
"operation": "list_documents",
"query": "Acme Q3 Proposal"
}
Get one document's status/details:
{
"apiKey": "YOUR_KEY",
"operation": "get_document",
"documentId": "ABCdef123..."
}
Create a document from a template:
{
"apiKey": "YOUR_KEY",
"operation": "create_document",
"name": "Acme Q3 Proposal",
"templateUuid": "TEMPLATE_UUID",
"recipientEmail": "[email protected]",
"recipientFirstName": "Jordan",
"recipientLastName": "Lee",
"recipientRole": "signer"
}
Send a (draft) document for signature:
{
"apiKey": "YOUR_KEY",
"operation": "send_document",
"documentId": "ABCdef123...",
"subject": "Your proposal from Acme",
"message": "Hi Jordan — please review and sign.",
"silent": "false"
}