API overview
The Automette REST API lets you render documents from your templates, retrieve renders, manage webhooks, and generate signed on-demand URLs.
Base URL
https://automette.comAll endpoints are versioned and live under /api/v1.
Conventions
- Content type — Request and response bodies are JSON. Send
Content-Type: application/jsonon everyPOST,PATCH, andDELETE. - Identifiers — Resource IDs (templates, renders, jobs, webhook subscriptions, forms) are CUIDs — 25-character lowercase alphanumeric strings like
cm4rnd7qh0001jx04w8e2t5va. Treat them as opaque. The one exception is event IDs in webhook payloads, which are prefixedevt_. - Timestamps — ISO 8601 UTC strings (
2026-04-22T12:00:00.000Z). selfURL — List and single-resource responses include aselffield with the canonical URL of the resource. Always prefer followingselfover reconstructing URLs by hand.
Authentication
Every request must include an Authorization header with a team-scoped API key:
Authorization: Bearer dg_your_api_keySee Authentication for full details on creating and rotating keys.
Errors
The API returns standard HTTP status codes and a JSON body shaped like:
{ "error": "Human-readable message", "detail": "Optional extra context" }| Code | When |
|---|---|
400 | Invalid JSON body or missing required field |
401 | Missing, malformed, or unrecognized API key |
402 | Insufficient credits for this operation |
404 | Resource does not exist or is not visible to your team (including resources owned by other teams) |
422 | Validation failed (e.g. unknown event, bad URL format) |
425 | Render not yet ready for download |
500 | Server error — safe to retry |
Insufficient-credit errors (402) include extra fields so you can react programmatically:
{
"error": "Insufficient credits",
"required_credits": 1,
"available_credits": 0,
"credit_balance": 0,
"overage_limit": 0
}Rate limits
Render endpoints are gated by your monthly credit balance, not request rate. Most management endpoints (templates, webhooks) have no hard limit but should not be polled aggressively — use webhooks instead.
Idempotency
POST /api/v1/renders is not idempotent — retrying a failed POST will create a new render. To avoid duplicate work after a network error, use async mode and rely on the webhook_url field for completion notification, then dedupe on render_id in your handler.
Versioning
/api/v1 is the only supported version. Breaking changes will be released under a new path (/api/v2) with a deprecation window for v1.