PandaDoc

Lightweight, dependency-free, in-memory PandaDoc API v1 fake for testing e-signature document code.

Default port: 4851

Quick start

import { PandadocServer } from "./services/pandadoc/src/server.js";

const server = new PandadocServer(4851);
await server.start();
// ... run your app/tests ...
await server.stop();

Point a PandaDoc client at http://127.0.0.1:4851. Authenticate with the Authorization: API-Key <key> header (any non-empty key accepted):

const res = await fetch("http://127.0.0.1:4851/public/v1/documents", {
  headers: { Authorization: "API-Key parlel" },
});
const { results } = await res.json();

Implemented operations

All /public/v1/* routes require Authorization: API-Key <key>. State is in-memory. List responses use { results: [] }.

Document status follows the real lifecycle: document.uploadeddocument.draftdocument.sentdocument.completed.

Service & inspection (parlel extensions)

Access via MCP / preview URL

The emulator is reachable at PANDADOC_BASE_URL (http://127.0.0.1:4851). When running in the parlel pool, an MCP tool / preview URL proxies to this base URL — point your PandaDoc client at that URL with the API-Key header and every /public/v1/* endpoint above works as documented.

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
Documents create/get/list/send/delete✅ Supported
Templates listing✅ Supported
{ results: [] } list shape✅ Supported
Authorization: API-Key header✅ Supported
Multipart/file upload create◐ Accepted, body parsed loosely
Real PDF rendering / e-sign ceremony⟳ Roadmap
Webhooks / contacts / members⟳ Roadmap
API-key validity / scopes✓ By design — Any non-empty credential is accepted — no real secrets needed
Rate limiting (429)✓ By design — Never throttles — local tests run at full speed, zero cost

Error codes & shapes

Errors use { type, detail }:

StatusWhen
400document create missing name/template_uuid/url
401missing/invalid API-Key
404unknown document or endpoint

Manifest

See services/pandadoc/manifest.json:

<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

PANDADOC_API_KEY=parlel
PANDADOC_BASE_URL=http://parlel-bridge:4851
<!-- parlel:testenv:end -->