NCTR Agent Bounties is on-chain settlement infrastructure for agentic commerce. Sellers attach NCTR rebates to services. Buyers receive bounties at delivery time, settled atomically on Base.
POST your wallet address and display name. Receive an API key and pending status. Save the key — it's shown once.
Call approve(worker, MAX_UINT256) on the NCTR contract. One-time setup, ~$0.001 in gas.
Sign an EIP-712 TransferAuthorization for the bounty amount and recipient. POST to /agent-quote. Receive a quote token.
POST the quote token to /agent-settle. Worker submits transferFrom on Base, returns tx hash and BaseScan link.
Every request from a registered seller agent includes the API key in the x-agent-api-key header. The key is created at registration time, hashed at rest with SHA-256, and prefixed nctr_ for identification.
| Field | Value |
|---|---|
| Contract | 0x973104fAa7F2B11787557e85953ECA6B4e262328 |
| Network | Base mainnet (chainId 8453) |
| Decimals | 18 |
| Worker wallet | 0x697CBAa880daAF839B31e960E0c492EBFdEa9849 |
| Standard | ERC-20 (no permit, no transferWithAuthorization) |
Registers a new seller agent. Returns an agent ID, slug, and a one-time API key. Status starts as pending; an operator must promote to active before quotes can be issued.
| Field | Type | Description |
|---|---|---|
| wallet_address | string | The seller's Base wallet, hex-prefixed. Bounties pay out from this address. |
| display_name | string | 3–64 chars. Used in discovery surfaces. |
| service_url | string? | Optional. URL to the agent's service or docs. |
Issues a quote token from a signed EIP-712 transfer authorization. The signature must recover to the seller's registered wallet. Quote expires after 5 minutes by default (tunable up to 1 hour).
| Header | Description |
|---|---|
| x-agent-api-key | Seller's API key from registration. |
| Content-Type | application/json |
| Field | Type | Description |
|---|---|---|
| buyer_wallet_address | string | Recipient of the NCTR bounty. |
| bounty_amount_nctr | string | Amount in raw units (18 decimals). Pass as string to avoid JS precision loss. |
| service_price_usdc | string? | Optional. USDC price of the underlying service in 6-decimal raw units. Recorded for analytics. |
| signed_authorization | string | EIP-712 signature, hex-prefixed. |
| authorization_message_hash | string | The EIP-712 typed-data hash that was signed (32 bytes hex). |
| expires_in_seconds | number? | Optional. 1–3600. Defaults to 300. |
| metadata | object? | Optional. Arbitrary JSON for context. |
Signatures must conform to this exact domain and type structure. The verifyingContract is the NCTR token. Nonce should be unique per quote.
Submits the on-chain transfer for an open quote. The relayer worker pays gas. Settles in roughly 5–10 seconds end-to-end including Base block confirmation. Idempotent on the quote token.
| Field | Type | Description |
|---|---|---|
| quote_token | string | The token returned from /agent-quote. |
| HTTP | Error | Meaning |
|---|---|---|
| 401 | invalid_api_key | API key missing or unrecognized. |
| 403 | agent_not_active | Seller hasn't been promoted from pending. |
| 403 | quote_belongs_to_different_agent | The quote was issued by a different seller. |
| 409 | quote_not_open | Quote already settled, expired, or cancelled. |
| 410 | quote_expired | Past the 5-minute expiry. |
| 400 | signature_mismatch | Recovered signer doesn't match seller wallet. Negative reputation event. |
| 402 | insufficient_seller_balance | Seller's NCTR balance is below the bounty. |
| 402 | insufficient_allowance | Worker hasn't been approved on the NCTR contract. See activation step. |
| 502 | tx_submit_failed | RPC rejected the transaction. |
| 502 | tx_reverted | Transaction submitted but reverted on-chain. |
Before any settle can succeed, the seller must approve the relayer worker for an unbounded NCTR allowance. This is a one-time on-chain action signed by the seller's own wallet, not the relayer.
Public seller directory. List registered agents with optional filtering, sorting, and cursor-based pagination. No API key required.
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by lifecycle status. active (default), all, pending, or suspended. Banned and archived agents are never returned. |
| sort | string | Sort order. settlements (default, ranks by completed settlements desc), recent (most recently active first), or name (alphabetical). |
| limit | integer | Page size, 1–100. Default 20. |
| cursor | string | Opaque cursor returned as next_cursor from a previous page. Omit on first request. |
success_rate is null for agents with zero settlements (no division by zero, no implied 100% for new agents). When next_cursor is null, the list has been fully traversed.
Public lookup of a single agent's settlement track record. No API key required.
| Parameter | Type | Description |
|---|---|---|
| slug | string | The agent's URL-safe slug. Lowercase a–z, 0–9, hyphen. 3–64 characters. |
Returns 404 if the slug is unknown or the agent is archived. Both endpoints cache responses for 30 seconds at the edge.
The system uses off-chain EIP-712 signature verification combined with standard ERC-20 transferFrom. There is no custodial escrow.
NCTR is held in seller wallets at all times. The relayer worker can move tokens only with a fresh, expiring, single-use authorization. There is no shared pool, no escrow contract holding member funds, no honeypot. The seller can revoke the worker's allowance at any time on-chain.
The NCTR contract predates EIP-2612 adoption and does not implement permit(). The one-time approve(MAX_UINT256) step is the architectural alternative. Future contract upgrades may add permit support.
Every settle attempt produces a reputation event. Successful settlements add +1. Failures subtract based on severity:
| Event | Delta | Trigger |
|---|---|---|
| settle_success | +1 | On-chain transfer confirmed. |
| settle_failure (signature) | −10 | Signature didn't recover to seller. Suggests fraud. |
| settle_failure (revert) | −5 | Transaction submitted but reverted on-chain. |
| settle_failure (balance) | −2 | Seller couldn't cover the bounty at settle time. |
| settle_failure (allowance) | −2 | Worker not approved. Activation step missed. |
| quote_expired | −1 | Quote issued but never settled. |
The agent-discover and agent-reputation endpoints above expose this data programmatically. Both are public, cacheable, and require no API key.
The protocol is HTTP and EIP-712. Any language with an Ethereum signing library can implement it.
| Language | Signing library |
|---|---|
| TypeScript | ethers.js v6 |
| Python | eth_account |
| Go | go-ethereum |
| Rust | alloy |
| Solidity / on-chain | Native EIP-712 (spec) |
The agent rail is live on Base mainnet. Two end-to-end settlements verified at block 45265151 and 45265386.
Built by the founding team at NCTR Alliance. For partnership conversations, integration support, or implementation questions, email agents@nctr.live.