v1 · Stable
SpecMake API
Upload technical documents, fetch structured product data, run compliance checks — all from your own code. REST + JSON, Bearer-token auth. Integrate SpecMake into your existing PIM, ERP, or DPP workflow.
Available on Professional, Enterprise, and Charter Customer plans. Generate keys in your account settings after upgrading.
Authentication
Every request to the API must include your API key in the Authorization header as a Bearer token:
curl https://www.specmake.com/api/v1/documents \
-H "Authorization: Bearer sk_live_••••••••••"Keys are shown once at creation and never displayed again. Lost keys must be revoked and replaced. Treat keys like passwords — never commit them to source control, never share them with third parties.
Timeouts & processing time
POST is synchronous. Plan for a 30–120s response time.
The POST /documents call runs extraction, structuring, and (when enabled) audit in a single request — no polling, no callback. Typical responses land in 30–60s; larger or denser PDFs can take up to 120s.
Default HTTP timeouts in popular integration tools are too short. Before your first call, raise your client’s read timeout to at least 180 seconds:
- Low-code automation platforms typically default to 30–40s — raise to 180s in the HTTP module settings.
curl: pass--max-time 180.- Node
fetch: no default timeout, but reverse proxies and serverless platforms may impose one — verify yours. - Pass
run_audit=falseto skip the audit stage for a ~30% latency reduction when you don’t need the coverage signal.
Async upload + webhook callback is on the v1.1 roadmap. Until then, a synchronous integration is the simplest, most reliable shape.
Rate limits
Limits are enforced per API key, per minute. Over-limit requests return 429 with a Retry-After header. Plan accordingly.
| Endpoint | Pro | Enterprise / Charter |
|---|---|---|
| POST /documents | 10 / min | 20 / min |
| GET /documents/* | 300 / min | 300 / min |
| DELETE /documents/* | 60 / min | 60 / min |
Document uploads also count toward your monthly document quota (same accounting as web-UI uploads). The rate limit is independent of the monthly cap.
Conventions
Versioning
Every response includes an X-API-Version: v1 header. Check this header in your client to detect breaking changes — we will bump it (and announce in advance) when v2 ships. The path prefix /api/v1 also stays for the entire v1 lifecycle.
Naming: snake_case vs camelCase
For historical reasons (our internal schema predates v1), the API uses two conventions in the same response:
- Top-level summary fields use snake_case —
file_type,source_language,detected_domain,created_at. - The nested
documentpayload uses camelCase —sourceLanguage,confidenceReason, etc. This mirrors the internal extraction schema. document.metadatauses snake_case — the keys come from source-document fields (page_count,domain_detected) and follow source convention.
The same data sometimes appears under both keys (e.g. source_language at the top level and document.sourceLanguage inside the payload). Either is canonical — pick whichever is convenient for your client.
Diagrams
When a saved document has extracted diagrams, each entry in document.diagrams[] carries an imageUrl (1-hour signed URL) plus storagePath, width, height, description, and type. The URL is short- lived; re-fetch the document if you need to ingest images after an hour.
Diagrams are extracted only for documents saved via the web UI (or with save_to_library=true via the API today — planned). A stateless API call with save_to_library=false returns an empty diagrams[].
Cost transparency
Every POST response includes the per-call AI cost in meta.tokens (input/output counts) and meta.estimatedCostCents (USD cents). This is the same value we log to our internal usage table — no markup. Use it to forecast your monthly spend or to budget per-document.
Endpoints
Documents
/api/v1/documentsUpload a PDF or DOCX. The document is extracted, structured into canonical JSON, and (optionally) audited. Stateless by default — pass save_to_library=true to persist.
Request
curl https://www.specmake.com/api/v1/documents \
-H "Authorization: Bearer sk_live_••••" \
-F "file=@spec-sheet.pdf" \
-F "save_to_library=false" \
-F "run_audit=true"Form fields
file— PDF or DOCX, max 4.5 MB (required)save_to_library—true|false. When true, the document persists to your library at/products. Default:false.run_audit—true|false. When false, skips the audit stage (~30% latency reduction). Default:true.
Response
{
"id": null, // only set when save_to_library=true
"document": {
"title": "...",
"sourceLanguage": "de", // camelCase inside document
"metadata": { "domain_detected": "hydraulics_pneumatics", ... },
"sections": [
{ "heading": "...", "fields": [
{ "key": "...", "value": "...", "unit": "bar",
"confidence": 0.95, "source": { "page": 2, "quote": "..." } }
]}
],
"diagrams": [] // empty unless save_to_library=true
},
"audit": {
"coverage_score": 87, // 0-100
"data_points_extracted": 47,
"total_data_points_in_source": 54,
"severity_counts": { "low": 6, "medium": 2 },
"findings": [ ... ]
} | null,
"meta": {
"fileType": "pdf",
"fileSize": 230423,
"fileName": "spec-sheet.pdf",
"detectedDomain": "hydraulics_pneumatics",
"processingMs": 31420,
"tokens": { "input": 10601, "output": 5936 },
"estimatedCostCents": 15.82 // USD cents, no markup
}
}/api/v1/documentsList your saved documents, most-recent first. Paginated by created_at.
Query params
limit— 1 to 100. Default 25.before— ISO timestamp cursor. Returns documents created before this time.
Response
{
"documents": [
{ "id": "...", "filename": "spec.pdf", "file_type": "pdf",
"file_size": 230423, "source_language": "de",
"detected_domain": "hydraulics_pneumatics",
"status": "completed", "created_at": "2026-05-16T..." },
...
],
"has_more": true,
"next_cursor": "2026-05-15T18:31:00Z"
}/api/v1/documents/:idFetch one document with full structured_data + audit_data. Diagrams come back with fresh 1h signed URLs; audit includes derived severity_counts.
curl https://www.specmake.com/api/v1/documents/abc-123 \
-H "Authorization: Bearer sk_live_••••"Response
{
"id": "abc-123",
"filename": "spec.pdf",
"file_type": "pdf", // snake_case at top level
"file_size": 230423,
"source_language": "de",
"detected_domain": "hydraulics_pneumatics",
"status": "completed",
"created_at": "2026-05-16T12:00:00Z",
"document": { // camelCase inside
"title": "...",
"sourceLanguage": "de",
"metadata": { ... },
"sections": [ ... ],
"diagrams": [
{ "type": "application_photo",
"width": 2000, "height": 2000,
"description": "Figure 1",
"storagePath": "uuid/0.jpg",
"imageUrl": "https://...signed...?expires=..." } // 1h TTL
]
},
"audit": {
"coverage_score": 87,
"data_points_extracted": 47,
"total_data_points_in_source": 54,
"severity_counts": { "low": 8, "medium": 6 },
"findings": [ ... ]
} | null
}/api/v1/documents/:id/translationsList translations associated with a document. Translations are created via the web UI; the API exposes them for read.
curl https://www.specmake.com/api/v1/documents/abc-123/translations \
-H "Authorization: Bearer sk_live_••••"/api/v1/documents/:idDelete a document (cascades translations, diagrams, source file). Members can delete their own docs; team admins/owners can delete any team doc.
curl -X DELETE https://www.specmake.com/api/v1/documents/abc-123 \
-H "Authorization: Bearer sk_live_••••"Errors
All errors return JSON of the shape { "error": "<code>", "message"?: "<human>" }.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Missing or malformed parameters. |
| 400 | invalid_file | File failed magic-byte validation. |
| 400 | file_too_large | File exceeds 4.5 MB. |
| 400 | unsupported_file_type | Only PDF and DOCX are supported. |
| 401 | unauthorized | Missing, malformed, or revoked API key. |
| 403 | plan_required | API access requires Pro plan or higher. |
| 403 | insufficient_permissions | Team role doesn’t allow this action (viewers cannot upload). |
| 403 | quota_exceeded | Monthly document cap reached. Response includes used, limit, and resets_on. |
| 404 | not_found | Document doesn’t exist or isn’t visible to you. |
| 429 | rate_limited | Slow down. Check Retry-After. |
| 429 | upstream_rate_limited | Upstream provider is rate-limiting us. Try again shortly. |
| 500 | processing_failed | Extraction or audit failed unexpectedly. Retry. |
| 503 | service_unavailable | Temporarily unavailable. We’ve been alerted; try again shortly. |
| 503 | upstream_overloaded | Upstream provider is overloaded. Try again shortly. |
What’s on the roadmap
v1 covers the core: upload, fetch, list, delete. Coming next:
- Webhooks — subscribe to
document.processed/document.failedevents instead of polling. - Translation endpoint — trigger translation jobs programmatically.
- Compliance evidence packet endpoint — generate the PDF artifact via API.
- SDKs — Python and Node thin wrappers when customer demand justifies.
Need something not listed? Get in touch.