API Reference
Project, Merchant, and Payment Intent endpoints.
Base URL and interactive reference
https://api.naven.networkProject management responses use Naven's { code, message, data } envelope.
Payment Intent endpoints return the Payment Intent or x402 object directly.
Credentials
Privy identity token
Used only by the signed-in Naven Workspace:
Authorization: Bearer <privy-identity-token>Project API key
Used only by your backend:
Authorization: Bearer naven_api_...Project management
| Method | Path | Description |
|---|---|---|
GET | /v1/projects | List the current user's Projects, key metadata, and Merchants |
POST | /v1/projects | Create a Project and one default Project API key |
POST | /v1/projects/:projectId/api-keys | Create another Project API key |
POST | /v1/projects/:projectId/merchants | Create a Merchant with an isolated payTo |
The complete API key secret is returned exactly once. Later Project responses include only its prefix and metadata.
Create Payment Intent
POST /v1/payment-intents
Authorization: Bearer naven_api_...
Content-Type: application/json| Field | Required | Description |
|---|---|---|
merchantId | yes | Merchant belonging to the authenticated Project |
amountUsdCents | yes | Integer from 100 through 100000000 |
externalId | yes | Merchant-scoped order ID, maximum 200 characters |
customerRef | no | Your customer ID, maximum 200 characters |
description | no | Human-readable payment purpose, maximum 500 characters |
metadata | no | JSON object, maximum serialized size 16 KiB |
The request cannot override payTo, asset, network, facilitator, token
metadata, or payment timeout.
Idempotency
(merchantId, externalId) is unique. Retrying the same request returns the
existing intent with 200 OK. Reusing the same external ID with different
amount, customer reference, description, or metadata returns 409 Conflict.
Get Payment Intent
GET /v1/payment-intents/:intentId
Authorization: Bearer naven_api_...Returns 404 when the intent does not exist or belongs to another Project.
This endpoint is the authoritative source for business fulfillment.
failureCode and failureMessage are nullable and describe the latest
definitive failure or reconciliation condition.
Reconcile Payment Intent
POST /v1/payment-intents/:intentId/reconcile
Authorization: Bearer naven_api_...Idempotently checks a settling Robinhood USDG authorization against Naven's
indexed facilitator transactions. It returns the current Payment Intent and
may move it to settled, or return an expired unused authorization to
pending while the Payment Intent itself remains valid. Normal recovery is
automatic; this endpoint is available for manual operational recovery.
Pay Payment Intent
POST /v1/payment-intents/:intentId/payThis endpoint is public and must not receive the Project API key.
Initial response:
402 Payment Required
PAYMENT-REQUIRED: <encoded-x402-v2-requirement>
Cache-Control: no-storePaid retry:
POST /v1/payment-intents/:intentId/pay
PAYMENT-SIGNATURE: <encoded-x402-v2-payment>Successful response:
200 OK
PAYMENT-RESPONSE: <encoded-settlement-response>
Cache-Control: no-store{
"id": "pi_01JABC",
"status": "settled",
"amountUsdCents": 9900,
"currency": "USD",
"settlement": {
"transaction": "0x...",
"network": "eip155:4663",
"payer": "0x...",
"settledAt": "2026-07-21T13:16:12.000Z"
}
}Statuses
| Status | Meaning |
|---|---|
pending | Intent may be paid |
settling | Verified payment is being settled or reconciled |
settled | Settlement succeeded and the unique transaction was saved |
failed | Settlement returned a definitive failure |
expired | The intent expired before settlement |
Error codes
| HTTP | Code | Meaning |
|---|---|---|
400 | invalid_request | Request body failed validation |
401 | project_unauthorized | Project API key is missing or invalid |
403 | project_disabled | Project or API key is disabled |
403 | merchant_disabled | Merchant was disabled after intent creation |
404 | merchant_not_found | Merchant is not part of the authenticated Project |
404 | intent_not_found | Intent was not found within the access boundary |
409 | intent_conflict | External ID or current state conflicts with the request |
409 | settlement_in_progress | Another request is settling this intent |
409 | payment_already_used | Transaction already belongs to another intent |
409 | payment_authorization_already_used | Authorization belongs to another intent |
410 | intent_expired | Payment window ended |
429 | rate_limited | Too many public payment attempts |
503 | facilitator_unavailable | Verification or settlement is temporarily unavailable |
503 | settlement_result_unknown | Settlement is being reconciled |
503 | reconciliation_unavailable | Manual reconciliation is temporarily unavailable |