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.

EndpointProEnterprise / Charter
POST /documents10 / min20 / min
GET /documents/*300 / min300 / min
DELETE /documents/*60 / min60 / 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 document payload uses camelCase sourceLanguage, confidenceReason, etc. This mirrors the internal extraction schema.
  • document.metadata uses 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

POST/api/v1/documents

Upload 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_librarytrue | false. When true, the document persists to your library at /products. Default: false.
  • run_audittrue | 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
  }
}
GET/api/v1/documents

List 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"
}
GET/api/v1/documents/:id

Fetch 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
}
GET/api/v1/documents/:id/translations

List 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_••••"
DELETE/api/v1/documents/:id

Delete 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>" }.

StatusCodeMeaning
400invalid_requestMissing or malformed parameters.
400invalid_fileFile failed magic-byte validation.
400file_too_largeFile exceeds 4.5 MB.
400unsupported_file_typeOnly PDF and DOCX are supported.
401unauthorizedMissing, malformed, or revoked API key.
403plan_requiredAPI access requires Pro plan or higher.
403insufficient_permissionsTeam role doesn’t allow this action (viewers cannot upload).
403quota_exceededMonthly document cap reached. Response includes used, limit, and resets_on.
404not_foundDocument doesn’t exist or isn’t visible to you.
429rate_limitedSlow down. Check Retry-After.
429upstream_rate_limitedUpstream provider is rate-limiting us. Try again shortly.
500processing_failedExtraction or audit failed unexpectedly. Retry.
503service_unavailableTemporarily unavailable. We’ve been alerted; try again shortly.
503upstream_overloadedUpstream 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.failed events 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.