Developer guide

AnchorRegistry™ for developers

Everything you need to integrate permanent, on-chain artifact provenance into your workflows. One key per account, no per-anchor signing, machine-readable by default. All endpoints return JSON.

Base URL·https://api.anchorregistry.ai

§1 · ACCOUNT

Purchase an ACCOUNT

An ACCOUNT is a one-time purchase that gives you an anchor key and a capacity quota. Register artifacts against the key as many times as your capacity allows — no per-transaction signing, no Stripe, no user accounts.

Starter
$50
50 anchors
Builder
$100
200 anchors

Payment — x402 on Base

Payment uses the x402 protocol — USDC on Base, settled via the Coinbase CDP facilitator. The server returns a 402 with payment requirements for both tiers; sign a USDC transfer authorization via EIP-712 and retry with an X-PAYMENT header. The ACCOUNT is created, and your anchor key is returned once — save it.

Request — step 1 (expect 402)
curl -X POST https://api.anchorregistry.ai/register/account \
  -H "Content-Type: application/json" \
  -d '{"capacity_tier": "starter"}'

# → 402 Payment Required
# Accepts header lists starter ($50) and builder ($100) options.
Response after signed payment
{
  "ar_id":        "AR-2026-XXXXXXX",
  "anchor_key":   "<32-byte hex>",      // shown ONCE — save this
  "capacity":     50,
  "tier":         "starter",
  "tx_hash":      "0x...",
  "block_number": 12345678,
  "rail":         "x402",
  "status":       "confirmed",
  "verify_url":   "https://anchorregistry.ai/AR-2026-XXXXXXX"
}

§2 · Registration

Register an artifact

Use your anchor key as a bearer token. Each successful registration deducts one from your ACCOUNT balance — no per-call payment. The manifest hash should be a SHA-256 over the artifact content or canonical metadata.

POST /register/x402
curl -X POST https://api.anchorregistry.ai/register/x402 \
  -H "Authorization: Bearer <anchor_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "manifest_hash": "<sha256 of artifact>",
    "artifact_type": "CODE",
    "title":         "My Project v1.0",
    "descriptor":    "MY-PROJECT-V1",
    "git_hash":      "abc123",
    "license":       "MIT",
    "language":      "Python",
    "version":       "1.0.0",
    "url":           "https://github.com/org/repo"
  }'
Response
{
  "ar_id":              "AR-2026-YYYYYYY",
  "tx_hash":            "0x...",
  "verify_url":         "https://anchorregistry.ai/AR-2026-YYYYYYY",
  "remaining_capacity": 24,
  "status":             "confirmed"
}

Supported types

CODE · RESEARCH · DATA · MODEL · AGENT · MEDIA · TEXT · POST · ONCHAIN · REPORT · NOTE · WEBSITE · EVENT · RECEIPT · OTHER

Each type carries its own optional fields — pass any type-specific field on the request body and it will be persisted with the anchor.

§3 · Balance & tree

Check balance and top up

Every ACCOUNT is the root of a provenance tree. The balance derives from the capacity of the root plus any top-ups, minus artifacts already registered. Top-ups attach as child ACCOUNT anchors under the same root.

Check remaining capacity
curl https://api.anchorregistry.ai/account/<anchor_key>/balance

# {
#   "root_ar_id":     "AR-2026-XXXXXXX",
#   "total_capacity": 50,
#   "used":           1,
#   "remaining":      49
# }
View the full ACCOUNT tree
curl https://api.anchorregistry.ai/account/<anchor_key>/tree
Top up (starter $50 or builder $100)
curl -X POST https://api.anchorregistry.ai/register/account/topup \
  -H "Content-Type: application/json" \
  -d '{"anchor_key": "<key>", "capacity_tier": "starter"}'

# → 402 (pay via x402, then capacity increases)

§4 · SEAL

Seal a provenance tree

Sealing a tree declares it authentic, complete, and permanent. No new children can be added under a sealed tree. Useful at release boundaries — lock a v1.0 tree before moving to v2.0. The SEAL action is on-chain and irreversible.

POST /registration/seal
curl -X POST https://api.anchorregistry.ai/registration/seal \
  -H "Content-Type: application/json" \
  -d '{
    "ar_id":            "AR-2026-XXXXXXX",
    "reason":           "Release v1.0 finalized",
    "token_commitment": "0x<sha256(anchor_key + ar_id)>",
    "new_tree_root":    ""
  }'

token_commitment is 0x-prefixed SHA-256 of your anchor key concatenated with the AR-ID being sealed. Only the tree root can be sealed. Optionally pass a continuation pointer in new_tree_root to point readers at a successor tree.

§5 · Verify

Resolve any AR-ID

Verification is free and public. Resolve any AR-ID or manifest hash to its full provenance record — no authentication needed. The machine endpoint always returns JSON; the smart URL content-negotiates on Accept.

By AR-ID
curl https://api.anchorregistry.ai/verify/AR-2026-XXXXXXX
By manifest hash
curl https://api.anchorregistry.ai/verify/hash/<sha256>
Machine-readable (always JSON, no headers required)
curl https://anchorregistry.ai/machine/AR-2026-XXXXXXX
Content negotiation on the smart URL
curl -H "Accept: application/json" \
  https://anchorregistry.ai/AR-2026-XXXXXXX

Embed tags

Drop an SPDX-Anchor tag into your README, paper, or model card — any human or AI encountering it can resolve the full provenance tree in one request.

shell
SPDX-Anchor: https://anchorregistry.ai/AR-2026-XXXXXXX

§6 · MCP Server

Native AI agent integration

AnchorRegistry ships a public, authless MCP server at mcp.anchorregistry.ai/mcp. Any MCP-compatible AI client — Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, or any custom agent — can install it and resolve AR-IDs, manifest hashes, and full provenance trees in a single tool call. The server is published in the Official MCP Registry as io.github.AnchorRegistry/ar-mcp and listed on Smithery.

Tools (v0.1)

ar_verify_arid

Resolve an AR-ID to its full provenance record. Use when an SPDX-Anchor or DAPX-Anchor tag is encountered in a README, paper, model card, or website.

input: ar_id (e.g. AR-2026-qnPOJ1z)

ar_verify_by_hash

Resolve an artifact by SHA-256 manifest hash. Use when the artifact is in hand but no AR-ID is known.

input: manifest_hash (64-char hex, no 0x prefix)

ar_resolve_tree

Resolve the full provenance tree for any AR-ID — root anchor plus all descendants with relationships, types, manifest hashes, and timestamps.

input: ar_id (any anchor in the tree)

All three tools are read-only and authless — no API key, no anchor key, no rate limit beyond defaults. Free to use. Future versions will add registration, balance lookup, and seal tools once the MCP credential pattern stabilizes.

Install

Claude Code
claude mcp add --transport http anchorregistry https://mcp.anchorregistry.ai/mcp
Claude Desktop, Cursor, VS Code, Windsurf
{
  "mcpServers": {
    "anchorregistry": {
      "type": "http",
      "url":  "https://mcp.anchorregistry.ai/mcp"
    }
  }
}

For Claude Desktop and Cursor, add via Settings → Connectors / MCP → Add custom connector with URL https://mcp.anchorregistry.ai/mcp. For testing without an installed client, use the MCP Inspector — a browser-based tool that connects to any MCP server URL and exercises its tools interactively.

Try it

Once installed, ask any MCP-aware AI client a question that requires provenance lookup. The agent will discover and call the appropriate AnchorRegistry tool automatically.

Example prompt

“Look at https://github.com/AnchorRegistry/ar-contracts-v1 — find any AR-ID in the README and resolve it.”

Expected output

Found and resolved. Here’s what’s anchored at AR-2026-qnPOJ1z:

AnchorRegistry V1 — the genesis CODE anchor for the v1 contracts repo.

  • Author: Ian Moore
  • Descriptor: ANCHORREGISTRY-V1-GENESIS
  • Manifest hash: 664034ff7b3517ef8f2708b81646414a6482d8cc362d52144a877648f94ceae6
  • License / language / version: BUSL-1.1 · Solidity · v1
  • URL: https://github.com/AnchorRegistry/ar-contracts-v1
  • Registrant: 0xC7a7AFde1177fbF0Bb265Ea5a616d1b8D7eD8c44
  • Registry contract: 0x3eC509393425BCAa48224FB90C710e100ADA1D2A
  • Anchored: 2026-04-11 15:48:47 UTC, block 44,566,590
  • Tx: 0xdf1b1acbc1899110abe5126a4bc550a8a8648521dc3e92d363d062b13a865434
  • Status: root anchor (depth 0), not sealed, not retracted

Tree children (depth 1):

  • AR-2026-jVPvp5Q — RESEARCH — Trustless Provenance Trees: A Game-Theoretic Framework for Operator-Gated Blockchain Registries (the arXiv paper)
  • AR-2026-pJ53j6K — CODE — AnchorRegistry Python Package

The agent fetches the repo, finds the SPDX-Anchor tag, calls ar_verify_arid, and returns the full provenance record — title, author, type, manifest hash, registrant address, transaction hash, block number, anchored timestamp, and seal status.

For deeper provenance lookups, agents reach for the other two tools as the situation calls for. ar_resolve_tree returns the full descendant graph rooted at any AR-ID — useful when the agent needs to verify not just one artifact but every component of a release tree (e.g., a paper plus the code plus the dataset that produced it). ar_verify_by_hash is the inverse path: when the artifact is in hand but no AR-ID has been observed, the agent computes a SHA-256 of the content and resolves the anchor directly from the hash — useful for integrity-checking a downloaded model weight, a research PDF, or a code archive against the registry without trusting any tag the file might carry.

Transport

Streamable HTTP at /mcp (canonical, recommended). Legacy SSE at /sse for older clients. Both transports proxy to the same Cloudflare Worker deployment — a thin pass-through over the AnchorRegistry verify endpoints. Source under MIT at github.com/AnchorRegistry/ar-mcp.

§7 · Python Package

Read the registry directly from Base

No API key. No account. No dependency on AnchorRegistry infrastructure. Just an RPC endpoint and the contract address. The anchorregistry Python package reads on-chain event logs directly — trustless by construction. If anchorregistry.com goes offline tomorrow, every anchor remains queryable with this package and any Ethereum RPC provider.

Install
pip install anchorregistry
Configure for Base mainnet (default)
from anchorregistry import configure

configure(network="base")
Look up an anchor by AR-ID
from anchorregistry import get_by_arid

record = get_by_arid("AR-2026-x1llnO1")
print(record["artifact_type_name"])   # CODE
print(record["manifest_hash"])        # sha256 of the artifact
print(record["contract_address"])     # which deployment holds it
Authenticate a full provenance tree
from anchorregistry import authenticate_tree

result = authenticate_tree(
    ownership_token="0x1a2b3c...",
    root_ar_id="AR-2026-x1llnO1",
)
print(result["authenticated"])      # True
print(result["anchors_verified"])   # 3
print(result["anchors_failed"])     # 0
Verify an anchor + check file integrity
from anchorregistry import verify

result = verify("AR-2026-x1llnO1", file_path="./my_artifact.py")
print(result["verified"])     # True
print(result["hash_match"])   # True
Generate the correct embed tag
from anchorregistry import watermark

tag = watermark("AR-2026-x1llnO1")
# "SPDX-Anchor: anchorregistry.ai/AR-2026-x1llnO1"
Check if a tree is sealed
from anchorregistry import is_sealed

status = is_sealed("AR-2026-x1llnO1")
print(status["sealed"])         # True
print(status["continuation"])   # AR-2026-YYYYYYY

Full documentation: anchorregistry.readthedocs.io

§8 · Testnet

A shared sandboxed AnchorRegistry environment

AnchorRegistry runs a single shared testnet — one UI, one API, one contract on Base Sepolia, used by every developer with access. It mirrors the mainnet surface end-to-end: same endpoints, same AR-ID format, same verify flow, full V1.5 feature parity including the x402 rail, ACCOUNT anchors, and SEAL. Separate state from production, separate keys, no real money.

Hosted access is by request only. Email support@anchorregistry.com with a brief description of what you’re building and we’ll grant you access to the shared testnet UI and API.

Endpoints

Testnet UIhttps://testnet.anchorregistry.com/ (access by request)
Testnet APIhttps://ar-api-testnet-production.up.railway.app
NetworkBase Sepolia

What testnet gives you

  • Stripe rail in test mode — $5 / $9 / $12 individual anchor purchases with Stripe’s published test card numbers. No real charges.
  • x402 rail — ACCOUNT anchors, batch registration, top-ups, Starter and Builder tiers. Uses Sepolia USDC.
  • SEAL end-to-end, including the H(K ∥ C_seal) token commitment flow.
  • All 24 artifact types, including the gated types (LEGAL, ENTITY, PROOF) for testing only.
  • Full verify surface, ownership token flow, and tree resolution.

Read testnet from Python

The anchorregistry Python package reads on-chain logs directly and works against testnet without any hosted dependency. Point it at Base Sepolia:

Configure for Base Sepolia
from anchorregistry import configure, get_by_arid

configure(network="base-sepolia")

record = get_by_arid("AR-2026-XXXXXXX")
print(record["artifact_type_name"])
print(record["contract_address"])     # 0xB0435faA...

What’s different from production

  • AR-IDs issued on testnet are not portable to mainnet. They share the AR-{YYYY}-{hashid} format but are scoped to the testnet contract address.
  • Testnet uses Base Sepolia ETH for gas and Sepolia USDC for x402. Both are freely available from public faucets.
  • Testnet state may be reset between major version upgrades. Production is immutable; testnet is not.
  • Testnet anchors carry no real provenance weight and should not be embedded in published artifacts as proof of authorship.

Requesting access

Email support@anchorregistry.com and include:

  • — Your name, GitHub handle, or organization
  • — A short description of what you’re integrating (anchorid CLI, custom client, agent, etc.)
  • — The wallet address you’ll use for x402 testing on Base Sepolia (if applicable)

Testnet is a shared environment — every approved developer registers against the same contract and the same database. Treat anything you publish there as visible to other testers.

Need more?

Full API surface is listed at api.anchorregistry.ai/docs. Source for the Python client lives at github.com/anchorregistry/ar-python. Questions: support@anchorregistry.com.