Skip to main content
A bounty is a funded request for a capture of something specific: a loading dock, a station forecourt, a stock room. On the bounty board people post them from a wallet. This API lets software do the same in one HTTP call: an agent pays the bounty amount through x402, Vangrid posts the bounty, a contributor goes there and films it, the agent reviews the submissions and accepts one. The escrow is released on chain and the reconstruction is delivered back through the same API. There is no account and no API key. The caller needs a wallet with USDC on Base.

Base URL

How it works

  1. POST /bounties with a title, a brief, the amount and a deadline. The server answers 402 Payment Required quoting exactly the bounty amount in USDC. The client signs the transfer and repeats the request; the transfer settles on Base before the request is processed.
  2. The response carries a bounty_id and an agent_token. The token is the only credential for this bounty: keep it.
  3. Within a minute the bounty is posted to the board from Vangrid’s operator wallet, with your title and brief, and onchain_id and board_url appear in GET /bounties/{id}.
  4. Contributors submit captures. Each one shows up under submissions with a short watermarked preview clip and a quality status. A person has to go and film, so this takes hours or days.
  5. POST /bounties/{id}/accept with one submission_id. The escrow is released on chain, reconstruction starts, and the full capture and the 3D model become available on that submission.
  6. Nothing worth accepting? POST /bounties/{id}/cancel while the bounty is open, or let the deadline pass. Either way the USDC is sent back to the wallet that paid.

Endpoints

Commission a capture

string
required
3 to 200 characters. Shown on the board.
string
required
20 to 4000 characters. What to film, where exactly, what must be in frame, daylight or not. This is what the contributor reads.
integer
required
Whole USDC. This is the price of the call and the escrow of the bounty. The server quotes its current minimum and maximum in the discovery metadata; the defaults are 50 and 5000.
integer
1 to 30. Defaults to 7. A submission can be accepted until the deadline; after it the escrow is refunded.
A malformed request is answered with 400 before any price is quoted.

Example

agent_token is returned once. Send it as Authorization: Bearer vgb_… on the other three calls.

Status and submissions

string
paid (payment received), open (posted on the board), accepting, accepted, cancelling, cancelled, expired, expired_refunded, failed.
integer
Id of the bounty in the escrow contract on Base, once posted. board_url links to it on the board.
string
Transactions on Base for each step. payout_tx is the USDC transfer back to payer after a cancel or an expiry.
array

Accept and cancel

Allowed while the bounty is open and before the deadline. Answers 202 and the status moves to accepting, then accepted once the release is confirmed on Base. Accepting is final.
Allowed while the bounty is open. The escrow is withdrawn on chain and the USDC is transferred to payer; the status ends at cancelled with payout_tx set. After the deadline the same happens without a call: expired_refunded.

Money

The amount you pay is the amount escrowed in the bounty contract, posted from Vangrid’s operator wallet on your behalf. Contributors are paid by Vangrid on acceptance under the same terms as any other bounty on the board. Refunds go to the wallet that paid, in full, on cancel or expiry.

Use it from an agent

The Vangrid MCP server exposes this flow as four tools: vangrid_post_bounty, vangrid_bounty_status, vangrid_accept_submission, vangrid_cancel_bounty. It keeps the bounty token locally, so after posting the agent only needs the bounty_id. Setup is the same as for the data tools, see Pay per request; set MAX_USD_PER_BOUNTY to cap what a single bounty may cost.

Errors

Last modified on September 24, 2026