Scoped credentials
One-time reveal, expiry, rotation, and immediate revocation.
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"One-time reveal, expiry, rotation, and immediate revocation.
Idempotency keys prevent accidental double processing and charging.
HMAC-SHA256 webhooks with retry delivery and endpoint controls.
API documents, credits, retention, and exports stay visible in the portal.
Scale and Custom workspaces can create a Process + read key in Dashboard → API.
Send multipart form data with a unique Idempotency-Key for each logical document.
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"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"])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);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.
| Scope | Allows |
|---|---|
| documents:read | List documents, profiles, status, and retained JSON results. |
| documents:write | Submit, pause, resume, cancel, and delete retained content. |
| exports:read | Download completed Excel workbooks. |
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"Submission returns HTTP 202. Use the returned links and status instead of holding a request open.
Read structured fields from the document resource or download the same reviewed Excel output available in the portal.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/account | Credits, plan limits, and key scopes |
| GET | /api/v1/profiles | Saved layout profiles and field mappings |
| POST | /api/v1/documents | Submit a PDF for durable processing |
| GET | /api/v1/documents | List portal and API documents |
| GET | /api/v1/documents/{id} | Status, structured result, and links |
| POST | /api/v1/documents/{id}/actions | Pause, resume, or cancel |
| GET | /api/v1/documents/{id}/export | Download the Excel workbook |
| DELETE | /api/v1/documents/{id} | Delete retained customer content |
For complete request and response schemas, import the OpenAPI 3.1 specification.
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.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-..."
}
}2 active keys · 60 requests/minute · 2 webhook endpoints
10 active keys · 300 requests/minute · 10 webhook endpoints