Developers

Three ways in. Same people, same checks, same Solana settlement.

Use the remote MCP server from Claude or ChatGPT, call the REST API, or pay per request with x402 and no account at all. During the pilot, API keys (pm_test_…) are issued by the operator; x402 needs none.

1. MCP — Claude Code, claude.ai, ChatGPT, Cursor

Claude Code (API key in a header)

claude mcp add --transport http proofmarket https://proofmarket.fun/mcp \
  --header "Authorization: Bearer pm_test_..."

claude.ai / ChatGPT connectors (OAuth 2.1)

Add a custom connector with the URL below. The consent page is ours: paste the API key there once. The server advertises dynamic client registration and PKCE at /.well-known/oauth-authorization-server. In ChatGPT, turn on Developer mode first (Settings → Apps → Advanced).

https://proofmarket.fun/mcp
request_reality_verification
Ask. Returns a verification_id at once; the result comes later.
get_reality_verification
Read state and result. wait_seconds (≤ 20) waits for a change.
cancel_reality_verification
Cancel while nobody has started. The bounty returns to the balance.
dispute_reality_verification
Doubt a result? One recheck within 24 h, by default two agreeing witnesses.
watch_reality_verification
Keep checking at an interval until a verified answer matches stop_when.
list_reality_verification_watches
Watches and recurring checks, with why they stopped and what matched.
stop_reality_verification_watch
Stop one. Runs already created keep going.

A person has to do the work, so results usually take 10–60 minutes. The tool descriptions tell the model never to invent an outcome before the status is VERIFIED, REJECTED or EXPIRED.

2. x402 — pay per request, no sign-up

Any agent with a Solana wallet and Devnet USDC. The operator co-signs as fee payer, so the agent needs no SOL.

# 1st call: 402 with the payment terms in PAYMENT-REQUIRED
curl -i -X POST https://proofmarket.fun/v1/x402/verifications \
  -H "Content-Type: application/json" -d @request.json

# 2nd call: same body, plus the signed USDC transfer
curl -X POST https://proofmarket.fun/v1/x402/verifications \
  -H "Content-Type: application/json" -d @request.json \
  -H "PAYMENT-SIGNATURE: <base64 PaymentPayload>"

# or run the sample agent end to end (any of the 17 types)
pnpm --filter @proofmarket/scripts run run x402-agent.ts --base-url https://proofmarket.fun \
  --type DOCUMENT_TRANSCRIPTION --question "Copy the total line of the paper invoice in front of you"

The 201 response carries the verification_id, a scoped API key for reading that result, and the Explorer URL of the payment. The same transaction can never create two requests. Cap per request: 5 USDC.

3. REST

curl -X POST https://proofmarket.fun/v1/verifications \
  -H "Authorization: Bearer $PROOFMARKET_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "SIGN_TRANSCRIPTION",
    "question": "Transcribe the opening-hours notice at the entrance exactly as written.",
    "answer_schema": { "type": "text", "max_chars": 500 },
    "location": { "lat": 35.6595, "lng": 139.7005, "radius_m": 80 },
    "deadline": "2026-10-12T09:00:00Z",
    "freshness": { "max_age_seconds": 300 },
    "evidence_requirements": { "photo": true, "task_nonce": true },
    "assurance": { "level": "standard" },
    "bounty": { "asset": "USDC", "amount": "0.30", "network": "solana-devnet" },
    "principal_ref": "prn_..."
  }'

curl https://proofmarket.fun/v1/verifications/ver_... -H "Authorization: Bearer $PROOFMARKET_API_KEY"

OpenAPI: packages/core/openapi.json in the repository. Webhooks for every state change, result reuse (allow_reuse / reuse), disputes, schedules and watches are all on the same key.

What you can ask for

At a place, choice answer
PLACE_STATUS_VERIFICATION · QUEUE_LENGTH · NOTICE_POSTED · CROWD_LEVEL · SEAT_AVAILABILITY · PARKING_AVAILABILITY · STOCK_CHECK
At a place, number / text
PRICE_CHECK · SIGN_TRANSCRIPTION · SITE_REPORT
Anywhere (work from home)
DOCUMENT_TRANSCRIPTION · DOCUMENT_QA · PRODUCT_INSPECTION · PHONE_INQUIRY · MEASUREMENT · CUSTOM_CHOICE · CUSTOM_TASK

Answers are a fixed choice, a number (with unit and range) or free text (requester-only; never public).assurance picks fast (1 witness), standard (2 agreeing) or high (2 of 3).

What comes back, and what you can show your user

  • result.checks — geofence, freshness, task nonce, replay, duplicate, media and vision_consistency (the AI review). All of them are inside result_hash.
  • result.reviews — per accepted submission: verdict, reason and what the photo showed. Requester-only.
  • result.attestation — the Solana signature, task account and Explorer URL.
  • result.proof — a public page, a badge image and ready-made Markdown. Hand it to the person you are answering: it shows a human checked this, when, by how many people, with the on-chain record.
"proof": {
  "url": "https://proofmarket.fun/r/ver_01J9Z4K8...",
  "badge_url": "https://proofmarket.fun/r/ver_01J9Z4K8.../badge.svg",
  "markdown": "[![人が確認](…/badge.svg)](…/r/ver_01J9Z4K8...)"
}

Add "publish": true to put a verified fact about a public place on the public map for 72 hours. Full Japanese reference with every field: /developers.

Get a key

During the pilot the operator issues API keys by hand. Request one here (the form is in Japanese: role, e-mail, a note). Or skip the key entirely and use x402 with Devnet USDC from the Circle faucet.