Developer API v1

Freight-document extraction inside your own workflow.

Submit PDFs, track durable processing, retrieve structured results, download Excel files, and receive signed completion events.

curl -X POST "https://manifestai.io/api/v1/documents" \
  -H "Authorization: Bearer $MANIFEST_AI_API_KEY" \
  -H "Idempotency-Key: invoice-acme-2026-1042" \
  -F "file=@commercial-invoice.pdf" \
  -F "profile_id=YOUR_PROFILE_ID"

Scoped credentials

One-time reveal, expiry, rotation, and immediate revocation.

Safe retries

Idempotency keys prevent accidental double processing and charging.

Signed events

HMAC-SHA256 webhooks with retry delivery and endpoint controls.

One workspace

API documents, credits, retention, and exports stay visible in the portal.

Quickstart

Your first document

  1. 1

    Create a key

    Scale and Custom workspaces can create a Process + read key in Dashboard → API.

  2. 2

    Submit the PDF

    Send multipart form data with a unique Idempotency-Key for each logical document.

  3. 3

    Get the result

    Poll the document URL or wait for document.completed, then fetch JSON or Excel.

curl -X POST "https://manifestai.io/api/v1/documents" \
  -H "Authorization: Bearer $MANIFEST_AI_API_KEY" \
  -H "Idempotency-Key: invoice-acme-2026-1042" \
  -F "file=@commercial-invoice.pdf" \
  -F "profile_id=YOUR_PROFILE_ID"
Python
import os
import requests

with open("commercial-invoice.pdf", "rb") as document:
    response = requests.post(
        "https://manifestai.io/api/v1/documents",
        headers={
            "Authorization": f"Bearer {os.environ['MANIFEST_AI_API_KEY']}",
            "Idempotency-Key": "invoice-acme-2026-1042",
        },
        files={"file": ("commercial-invoice.pdf", document, "application/pdf")},
        data={"profile_id": "YOUR_PROFILE_ID"},
        timeout=60,
    )

response.raise_for_status()
print(response.json()["data"]["id"])
Node.js
import { openAsBlob } from "node:fs";

const form = new FormData();
form.set("file", await openAsBlob("commercial-invoice.pdf"), "commercial-invoice.pdf");
form.set("profile_id", "YOUR_PROFILE_ID");

const response = await fetch("https://manifestai.io/api/v1/documents", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MANIFEST_AI_API_KEY}`,
    "Idempotency-Key": "invoice-acme-2026-1042",
  },
  body: form,
});

if (!response.ok) throw new Error(await response.text());
console.log((await response.json()).data.id);
Authentication

Bearer keys with least privilege

Send Authorization: Bearer mai_live_…. Keys are shown once, cannot be recovered, and should be stored in a secret manager—not source code or a browser application.

ScopeAllows
documents:readList documents, profiles, status, and retained JSON results.
documents:writeSubmit, pause, resume, cancel, and delete retained content.
exports:readDownload completed Excel workbooks.
Document lifecycle

Durable, credit-aware processing

API submissions use the same encrypted storage, duplicate detection, page credits, saved profiles, processing mode, retention window, and worker checkpoints as portal uploads. Every API record appears in Recent documents with an API label.

curl "https://manifestai.io/api/v1/documents/DOCUMENT_ID" \
  -H "Authorization: Bearer $MANIFEST_AI_API_KEY"

Asynchronous by design

Submission returns HTTP 202. Use the returned links and status instead of holding a request open.

JSON or Excel

Read structured fields from the document resource or download the same reviewed Excel output available in the portal.

Reference

Endpoints

MethodPathPurpose
GET/api/v1/accountCredits, plan limits, and key scopes
GET/api/v1/profilesSaved layout profiles and field mappings
POST/api/v1/documentsSubmit a PDF for durable processing
GET/api/v1/documentsList portal and API documents
GET/api/v1/documents/{id}Status, structured result, and links
POST/api/v1/documents/{id}/actionsPause, resume, or cancel
GET/api/v1/documents/{id}/exportDownload the Excel workbook
DELETE/api/v1/documents/{id}Delete retained customer content

For complete request and response schemas, import the OpenAPI 3.1 specification.

Webhooks

Signed, retry-safe status events

Subscribe to document.completed, document.failed, and document.cancelled. Manifest AI sends metadata and resource links—not extracted customer fields. Retrieve the result using your API key.

const signed = timestamp + "." + rawRequestBody;
const expected = hmacSha256(WEBHOOK_SECRET, signed);

// Reject stale timestamps, then compare signatures
// with a timing-safe equality function.
  • HTTPS endpoints only; private or local network targets are blocked.
  • No redirects are followed during delivery.
  • Verify Manifest-Timestamp and Manifest-Signature against the raw body.
  • Return any 2xx response quickly; failed deliveries retry with backoff.
  • Use Manifest-Event-Id to deduplicate deliveries.
  • Rotate application API keys independently from webhook signing secrets.
Reliability

Errors, limits, and retries

Every JSON response includes X-Request-Id. Authenticated responses also expose X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. HTTP 429 includes Retry-After.

{
  "error": {
    "code": "DOCUMENT_NOT_FOUND",
    "message": "Document not found.",
    "request_id": "a74b0a33-..."
  }
}

Scale

2 active keys · 60 requests/minute · 2 webhook endpoints

Custom

10 active keys · 300 requests/minute · 10 webhook endpoints

Production checklist

Ship the integration safely

  • Keep API keys in a managed server-side secret store.
  • Use one key per application or environment and choose the smallest required scopes.
  • Attach a stable Idempotency-Key to every document submission.
  • Verify webhook signatures from the unmodified raw request body.
  • Treat webhook delivery as at-least-once and deduplicate by event ID.
  • Use request IDs when contacting support and test pause/cancel flows before launch.
Open developer workspace