One Bearer token, every endpoint. Push invoices, sync customers, automate payments. No OAuth dance, no client secrets to manage, no Premium tier.
$ curl -X POST "https://api.trailingpaper.com/v1/invoices" \ -H "Authorization: Bearer tp_..." \ -d '{ "customer_id": "cus_riverside", "line_items": [{ "sku": "ipa-case", "qty": 6 }] }' { "id": "inv_2090", "total": 840.00, "status": "open", "payment_link": "https://pay.tp.com/i/2090" }
Generate an API key from your dashboard, drop it into the header, and POST. That's it.
# 1. Create an invoice curl -X POST "https://trailingpaper.com/api/invoices" \ -H "Authorization: Bearer tp_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": 42, "items": [{ "name": "Q2 Retainer", "quantity": 1, "unit_price": 4250.00 }], "send_email": true }'
// 1. Create an invoice (Node + fetch) const res = await fetch( 'https://trailingpaper.com/api/invoices', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.TP_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ customer_id: 42, items: [{ name: 'Q2 Retainer', quantity: 1, unit_price: 4250 }], send_email: true, }), } );
If you can do it in the dashboard, you can do it via API. Push, pull, list, search, update, delete — across every meaningful object in TP.
The TP API isn't a toy. It's the same API our own dashboard uses — battle-tested, idempotent, observable.
Each API key is scoped to a single company you own. Keys can be rotated, revoked, and labeled. We log last_used_at for visibility.
Pass external_source + external_id and we'll dedupe automatically — no double-billing on retries.
Subscribe to invoice.paid, payment.received, refund.processed. HMAC-signed, retried with exponential backoff.
Cursor-based pagination, query parameters for date range / status / customer / amount. Stable ordering.
Every 4xx/5xx returns a JSON body with error, error_code, and a human-readable message.
Use the API from your own browser-side code with proper CORS headers. Or proxy from your server — both supported.
No language lock-in. The TP API is plain HTTPS + JSON, so use whatever you write your code in. Official SDKs coming for the most common stacks.
Full reference docs with example payloads in 4 languages, webhook signature verification guide, error code reference, and a complete entity model.
Open the Developer Docs →Sign up for the trial, generate a key, hit the docs. No tier upgrade required for API access — it's included in the base plan.
Start 7-Day Free Trial →