Exa’s Nevermined plan ID:
This plan and purchase run on live; use a live-prefixed Nevermined API key. The purchase is for API credits, not for a single search request. $7 covers roughly 1,000 standard searches; see Exa pricing for current rates.
27800462147494506865542649899724877617306579171265399959488097895839186996870This plan and purchase run on live; use a live-prefixed Nevermined API key. The purchase is for API credits, not for a single search request. $7 covers roughly 1,000 standard searches; see Exa pricing for current rates.
Prerequisites (one time, done by the card owner)
- Enroll a card at nevermined.app → Payment Methods.
- Create a delegation on the card: the spending permission an agent pays with. The owner sets the spending limit and duration, and can scope the delegation to a specific API key (recommended; it makes discovery deterministic for that key).
- Generate an API key and give it to the agent. Two ways:
- Embedded login flow (no copy/paste): the agent hosts a callback on
127.0.0.1and sends its human this URL to sign in:https://nevermined.app/auth/cli?callback_url=http://127.0.0.1:<port>/callback. After sign-in, the browser redirects to the callback withnvm_api_key=<api-key>for the agent to read. - Manual: nevermined.app → Account → API Keys → create a key and paste it to the agent (or open
https://nevermined.app/auth/cliwith nocallback_urland copy the key shown on screen).
- Embedded login flow (no copy/paste): the agent hosts a callback on
The flow
Handled with the Nevermined Payments SDK (npm install @nevermined-io/payments; the package is ESM-only; in a fresh npm project set "type": "module" in package.json, or the import fails with ERR_PACKAGE_PATH_NOT_EXPORTED). The package’s bundled TypeScript definitions are the authoritative call reference for every method named below. For broader context, start from the Payments overview and the documentation index.
- Initialize the SDK with your Nevermined API key only (
Payments.getInstance({ nvmApiKey })). The environment is derived from the key prefix; do not pass anenvironmentoption. - Find the delegation to pay with; see Getting a delegation below.
- Mint the x402 access token for the Exa plan ID via
payments.x402.getX402AccessToken, using thenvm:card-delegationscheme and referencing the delegation by ID (delegationConfig: { delegationId }). No agentId is needed for this flow: the method’s arguments are(planId, agentId?, tokenOptions?), so pass the plan ID,undefined, and the token options. Tokens cannot create delegations on the fly; the delegation must exist first. - POST the token to Exa in the
payment-signatureheader (endpoint below). The response contains the Exa API key. Check the HTTP status before reading the body. - Use the key against the standard Exa Search API.
Getting a delegation
Query the delegations accessible to your API key withpayments.delegation.getPurchasingPower() and select one with at least 700 cents of remaining budget. Budget fields are returned as strings, in cents. Purchasing-power results contain only delegations that can still pay; exhausted ones are excluded. With several delegations, discovery is deterministic when the owner key-scoped one to your key; to designate a specific budget among several, reference its ID explicitly.
If discovery returns none, the preferred path is for the card owner to create a delegation in the dashboard (Prerequisites, step 2); the agent then re-runs discovery. Nothing needs to be copied. If no operator is reachable (or the request goes unanswered), a fully autonomous agent can create one programmatically with payments.delegation.createDelegation. Its payload fields:
The response includes the
delegationId to mint with (it also includes a delegationToken; not needed for this flow; treat it as a secret and do not log it). Card selection: listPaymentMethods() carries no ordering guarantee and cards may be indistinguishable by metadata; if several are enrolled and the owner’s intent is unknown, prefer asking the owner; otherwise any Active card of the provider is acceptable, and you should record which payment-method id was chosen. Note the trade-off of this whole path: the agent chooses the card and sets its own budget. Prefer an owner-created delegation whenever an owner is available.
Exa’s purchase contract
- Cost: $7 per purchase, charged to the card behind the delegation referenced by the token.
- New payer:
{ status: "ok", apiKey: "…", expiresAt: null }; a new Exa API key with $7 of credits. - Returning payer: the same API key with $7 more credits added.
- Replayed token: cached result, no new charge.
- Missing/invalid signature:
402 Payment Requiredwith payment requirements in the body.
HTTP 402 with error tag NO_MORE_CREDITS. Mint a fresh x402 token with the same plan ID and delegation, POST it to the same endpoint, and Exa adds another $7 of credits to the same key.
Verifying charges
Usepayments.delegation.listDelegations() to inspect spend per delegation (amountSpentCents, transactionCount, status). Fully spent delegations are marked Exhausted and no longer appear in getPurchasingPower() results; purchasing power lists only delegations that can still pay.