API REFERENCE
Hashproof v1 HTTP API
Endpoints below are grouped by resource. For full request and response schemas plus a try-it-now console, open the interactive Swagger UI.
Auth
The API supports two auth modes:
- API key. Pass
x-api-keyorAuthorization: Bearer hpsk_…. Used by SDKs and the CLI. - Supabase session JWT. Pass
Authorization: Bearer <jwt>. Used by the dashboard. Routes marked API key or session accept either; the API resolves the user's managed signing key on the session path.
Errors
Errors are JSON with a stable shape:
{
"error": "human-readable message",
"code": "STABLE_ERROR_CODE",
"statusCode": 400
}Match on code, not the message. Codes are stable across versions; messages may improve.
Rate limits
Free tier: 60 requests / minute. Growth: 300 / min. Scale: 1,000 / min. Enterprise: 5,000 / min. Limits are keyed on x-api-key (or remote IP for unauthenticated routes). 429 responses include the retryAfter field in seconds.
Manifests
Store, retrieve, and list C2PA manifests.
- POST
/v1/manifestsAPI key or sessionUpload a file and store its C2PA manifest
- GET
/v1/manifestsAPI key or sessionList manifests for the calling key (paginated)
- GET
/v1/manifests/:idAPI key or sessionGet a manifest by ID
- GET
/v1/manifests/:id/rawAPI key or sessionDownload the raw CBOR-encoded manifest
- GET
/v1/manifests/:id/proofAPI keyGet the Merkle inclusion proof
- GET
/v1/manifests/cid/:cidAPI key or sessionLookup by IPFS CID
Signing
Managed C2PA signing with PQ-hybrid (ES256 + ML-DSA-65) on every tier.
- POST
/v1/signAPI key or sessionSign a file and store the manifest
Verify
Public verification + ZK and forensic variants.
- POST
/v1/verifyPublicVerify a file (embedded → hard → soft)
- POST
/v1/verify/privateAPI keyZK-proof variant (beta)
- POST
/v1/verify/forensicAPI keyForensic verification with EXIF + manipulation signals
Resolve
Soft-binding lookups for re-encoded content.
- POST
/v1/resolveAPI keyMultipart file upload OR JSON soft_binding
- GET
/v1/resolveAPI keyPre-computed fingerprint lookup
- POST
/v1/fingerprintAPI keyCompute a perceptual fingerprint without resolving
Webhooks
Subscribe to provenance events. HMAC-SHA256 signed deliveries with retry.
- POST
/v1/webhooksAPI key or sessionRegister a webhook endpoint
- GET
/v1/webhooksAPI key or sessionList active subscriptions
- GET
/v1/webhooks/:idAPI key or sessionGet a subscription detail
- PATCH
/v1/webhooks/:idAPI key or sessionUpdate url, events, or active state
- DELETE
/v1/webhooks/:idAPI key or sessionSoft-delete (deactivate)
- GET
/v1/webhooks/:id/deliveriesAPI key or sessionPaginated delivery log
- POST
/v1/webhooks/:id/deliveries/:deliveryId/retryAPI key or sessionRe-enqueue a failed delivery
Compliance
EU AI Act Article 50 reports.
- POST
/v1/compliance/reportsAPI key or sessionGenerate and persist a report
- GET
/v1/compliance/reportsAPI key or sessionList reports
- GET
/v1/compliance/reports/:idAPI key or sessionGet full detail
- DELETE
/v1/compliance/reports/:idAPI key or sessionDelete a report
Billing
Stripe-backed subscription management.
- GET
/v1/billing/subscriptionAPI key or sessionCurrent tier, limits, and period
- POST
/v1/billing/checkout-sessionAPI key or sessionStart a Stripe Checkout flow
- POST
/v1/billing/portal-sessionAPI key or sessionOpen the Stripe Customer Portal
- POST
/v1/billing/webhookPublicStripe webhook receiver (no auth)
Account
- GET
/v1/api-keysAPI keyList API keys
- POST
/v1/api-keysAPI keyCreate an API key
- DELETE
/v1/api-keys/:idAPI keyRevoke an API key
- GET
/v1/usageAPI key or sessionCurrent-period usage metrics
- GET
/v1/statsAPI key or sessionDashboard summary stats
- GET
/healthPublicHealth probe
Try it now
The Swagger UI lets you call any endpoint with your own API key. It is generated from the same Fastify schemas the server uses, so the shapes never drift.
Open Swagger UI