Developer Reference

API Reference

The Anchora REST API gives DeFi protocols and RWA builders read access to on-chain attestation history, reliability scores, and attestor network data for any registered physical asset.

Base URLhttps://anchora.markets
NetworkSolana Devnet
Program IDCNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs

Quick start

Get an API key from the developers page, then query attestation history for any asset:

curl https://anchora.markets/api/v1/assets/9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd/attestations \
  -H "Authorization: Bearer ank_your_api_key"

Authentication

All endpoints require an API key passed in the Authorization header.

Header format

Authorization: Bearer ank_<your_key>

Obtain a key at /developers. Keys start with ank_.

Keep your key secret — it is shown only once at creation.

Rate limits

Free tier100 requests / day
Paidfrom $0.001 / request
Billingvia Solana wallet top-up

Free tier resets daily at midnight UTC.

GET GET /api/v1/assets/:assetAddress/attestations

Returns all confirmed on-chain attestations for a given asset. Use the Asset PDA address as the primary identifier; legacy internal IDs and linked mint addresses are accepted only for compatibility.

GET/api/v1/assets/:assetAddress/attestations

Path parameters

assetAddress
stringrequired
Asset PDA address, e.g. 9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd

Query parameters

type
stringoptional
Filter by event type: issuance | valuation | legal_verification | inspection | custody | insurance | audit | redemption
confidence
stringoptional
Minimum confidence tier: low | medium | high | certified
limit
integeroptional
Number of results, default 20, max 100

Response

{
  "asset": {
    "assetAddress": "9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd",
    "assetName": "KZ-ALMATY-2024-001",
    "assetType": "real_estate",
    "location": "Almaty, Kazakhstan"
  },
  "reliabilityScore": {
    "total": 75,
    "label": "Good",
    "breakdown": {
      "coverage": { "score": 40, "max": 40 },
      "quality":  { "score": 20, "max": 40 },
      "recency":  { "score": 15, "max": 20 }
    }
  },
  "attestations": [
    {
      "id": "uuid",
      "eventType": "valuation",
      "documentHash": "a3f1c2d4...",
      "confidence": "high",
      "onChainPda": "7xKz...",
      "txSignature": "4Fh2...",
      "confirmedAt": "2025-03-15T10:22:00Z",
      "explorerUrl": "https://explorer.solana.com/tx/4Fh2...??cluster=devnet",
      "attestor": {
        "name": "Arina Bekova",
        "role": "appraiser",
        "walletAddress": "GkGb...",
        "onChainPda": "3mNp..."
      }
    }
  ],
  "total": 1,
  "programId": "CNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs",
  "network": "devnet"
}

Cached 30s, stale-while-revalidate 60s.

GET GET /api/v1/assets/:assetAddress/score

Returns the reliability score (0–100) for a physical asset. When the Asset PDA exists, the score is served from the on-chain `current_score` snapshot and accompanied by its coverage/quality/recency breakdown.

GET/api/v1/assets/:assetAddress/score

Response

{
  "asset": {
    "assetAddress": "9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd",
    "assetName": "KZ-ALMATY-2024-001",
    "assetType": "real_estate",
    "location": "Almaty, Kazakhstan"
  },
  "score": 75,
  "label": "Good",
  "color": "blue",
  "breakdown": {
    "coverage": { "score": 40, "max": 40 },
    "quality":  { "score": 20, "max": 40 },
    "recency":  { "score": 15, "max": 20 }
  },
  "meta": {
    "confirmedEvents": 3,
    "programId": "CNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs",
    "network": "devnet"
  }
}
Score components: coverage (0–40) — event type completeness; quality (0–40) — strongest per-type confidence plus supporting evidence; recency (0–20) — freshness of core evidence types. Response metadata also shows whether the score came from the on-chain asset snapshot or indexed fallback.

Cached 60s, stale-while-revalidate 120s.

GET GET /api/v1/attestors

Returns all active verified attestors in the Anchora network.

GET/api/v1/attestors

Query parameters

role
stringoptional
Filter by role: appraiser | inspector | legal_verifier | custodian | auditor | insurer

Response

{
  "attestors": [
    {
      "name": "Arina Bekova",
      "role": "appraiser",
      "walletAddress": "GkGb...",
      "onChainPda": "3mNp...",
      "company": "KazValuation LLP",
      "registeredAt": "2024-11-01T08:00:00Z",
      "attestationCount": 12,
      "onChainVerified": true
    }
  ],
  "total": 1,
  "programId": "CNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs",
  "network": "devnet"
}

Cached 60s.

GET GET /api/v1/verify/:txSignature

Verifies a specific attestation by Solana transaction signature. Performs a live RPC check against the chain — use this when you need proof of a specific event.

GET/api/v1/verify/:txSignature

Path parameters

txSignature
stringrequired
Solana transaction signature (base58)
curl https://anchora.markets/api/v1/verify/4Fh2xK9mP... \
  -H "Authorization: Bearer ank_your_api_key"

Response

{
  "verified": true,
  "verification": {
    "mode": "semantic-onchain",
    "checks": {
      "rpcConfirmed": true,
      "anchoraInstructionFound": true,
      "signerMatched": true,
      "attestorPdaMatched": true,
      "eventPdaMatched": true,
      "eventAccountOwnedByProgram": true
    },
    "failureReasons": []
  },
  "attestation": {
    "txSignature": "4Fh2xK9mP...",
    "assetAddress": "9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd",
    "assetName": "KZ-ALMATY-2024-001",
    "eventType": "valuation",
    "documentHash": "a3f1c2d4e5b6...",
    "confidence": "high",
    "onChainPda": "7xKz...",
    "confirmedAt": "2025-03-15T10:22:00Z",
    "explorerUrl": "https://explorer.solana.com/tx/4Fh2...??cluster=devnet"
  },
  "attestor": {
    "name": "Arina Bekova",
    "role": "appraiser",
    "walletAddress": "GkGb...",
    "onChainPda": "3mNp...",
    "company": "KazValuation LLP"
  },
  "asset": {
    "assetAddress": "9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd",
    "assetName": "KZ-ALMATY-2024-001",
    "assetType": "real_estate",
    "location": "Almaty, Kazakhstan"
  },
  "programId": "CNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs",
  "network": "devnet"
}

verified: true means semantic on-chain verification passed: signer, PDA linkage, program ownership, and decoded event contents all matched the indexed record.

Errors

All errors return JSON with an error field.

401UnauthorizedMissing or invalid API key
404Not FoundAsset or transaction not found
429Rate LimitedDaily free tier exceeded — top up credits
500Server ErrorInternal error, retry with backoff
{ "error": "Attestation not found" }

402x402 Agent API

The x402 endpoints allow autonomous agents to pay per call in USDC on Solana — no API key or account required. The protocol follows the HTTP 402 Payment Required standard.

How it works

  1. 1Agent calls any /api/x402/v1/* endpoint without authentication.
  2. 2Server responds 402 Payment Required with payment details, plus optional payment-identifier idempotency metadata.
  3. 3Agent signs and broadcasts a USDC transfer on Solana, then retries with X-PAYMENT header.
  4. 4Server verifies, settles, records the receipt, and returns data with X-PAYMENT-RESPONSE.

Endpoints

GET/api/x402/v1/assets/:assetAddress/score$0.005

Asset reliability score (0–100). Use the Asset PDA address or linked mint address.

GET/api/x402/v1/assets/by-mint/:mint$0.005

Resolve a token mint to the Anchora asset record and on-chain index context.

GET/api/x402/v1/verify/:txSignature$0.01

Verify an attestation transaction by Solana signature.

GET/api/x402/v1/assets/:assetAddress/proof-package$0.05

Underwriting-grade proof package with policy-aware verdicts, signed trust snapshots, and machine-readable decision context. Use the Asset PDA address or linked mint address. Optional query: ?policy=collateral_screening|marketplace_listing|insurance_review. Invalid policy returns 400 before payment is requested.

GET/api/x402/v1/catalogFree

Machine-readable catalog with endpoint prices, payment requirements, and idempotency settings.

Proof-package response

The proof-package endpoint returns a decision-ready trust object: evidence coverage, issuer and control-plane context, weighted automation penalty signals, policy-aware thresholds, and a signed snapshot artifact for downstream verification. Signature status is explicit: `signed`, `unconfigured`, or `misconfigured` if the runtime key pair is broken.

{
  "asset": {
    "assetAddress": "9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd",
    "assetName": "KZ-ALMATY-2024-001",
    "assetType": "real_estate",
    "location": "Almaty, Kazakhstan"
  },
  "legalWrapper": {
    "entityName": "Anchora SPV I",
    "entityType": "spv",
    "ownershipType": "beneficial",
    "jurisdiction": "AIFC",
    "documentNumber": "SPV-2026-001",
    "wrapperModel": "spv",
    "completeness": "complete"
  },
  "issuerContext": {
    "issuerName": "Anchora SPV I",
    "issuerType": "spv",
    "wrapperModel": "spv",
    "beneficiaryName": "Anchora SPV I",
    "operatorNames": ["North Servicing"],
    "servicerNames": ["North Servicing"],
    "trusteeNames": ["AIFC Trustee Co"],
    "documentPublisherNames": ["proof.shared-provider.example.com"],
    "completeness": "complete"
  },
  "freshness": {
    "status": "aging",
    "daysSinceLastConfirmed": 124,
    "staleThresholdDays": 180,
    "hasStaleCoreEvidence": false,
    "hasExpiredCoreEvidence": false
  },
  "evidence": {
    "coverage": {
      "valuation": true,
      "inspection": true,
      "legalVerification": true,
      "custody": true,
      "audit": false,
      "coreMissing": [],
      "optionalMissing": ["audit"]
    },
    "requirements": [
      {
        "eventType": "valuation",
        "category": "core",
        "required": true,
        "status": "confirmed",
        "confidence": "certified",
        "reviewNote": null
      },
      {
        "eventType": "audit",
        "category": "optional",
        "required": false,
        "status": "missing",
        "confidence": null,
        "reviewNote": "Optional evidence is not yet present"
      }
    ],
    "diversity": {
      "distinctCoreAttestors": 3,
      "distinctCoreCompanies": 1,
      "dominantCoreAttestorWallet": "GkGb...",
      "dominantCoreEvidenceCount": 2,
      "dominantCoreEvidenceShare": 0.67,
      "dominantCoreCompanyName": "KazValuation LLP",
      "dominantCoreCompanyEvidenceCount": 3,
      "dominantCoreCompanyEvidenceShare": 1,
      "singleAttestorDependency": false,
      "concentrationHigh": true,
      "singleCompanyDependency": true,
      "companyConcentrationHigh": true
    },
    "temporal": {
      "coreConfirmedCount": 3,
      "earliestCoreConfirmedAt": "2026-04-01T10:00:00.000Z",
      "latestCoreConfirmedAt": "2026-04-01T18:00:00.000Z",
      "spreadDays": 0.33,
      "spreadHours": 8,
      "distinctCoreConfirmationDays": 1,
      "clustered": true,
      "narrowSpread": true
    },
    "sourceCorrelation": {
      "heuristic": "metadata_host_or_company_fallback",
      "distinctCoreMetadataHosts": 1,
      "distinctCoreSourceClusters": 1,
      "dominantCoreMetadataHost": "proof.shared-provider.example.com",
      "dominantCoreMetadataHostEvidenceCount": 3,
      "dominantCoreMetadataHostEvidenceShare": 1,
      "dominantCoreSourceCluster": "proof.shared-provider.example.com",
      "dominantCoreSourceClusterEvidenceCount": 3,
      "dominantCoreSourceClusterEvidenceShare": 1,
      "singleSourceClusterDependency": true,
      "sourceClusterConcentrationHigh": true
    },
    "controlPlaneCorrelation": {
      "heuristic": "role_data_control_plane_or_source_fallback",
      "distinctCoreControlPlanes": 1,
      "distinctCoreBeneficiaries": 1,
      "dominantCoreControlPlane": "North Servicing",
      "dominantCoreControlPlaneEvidenceCount": 3,
      "dominantCoreControlPlaneEvidenceShare": 1,
      "dominantCoreBeneficiary": "Anchora SPV I",
      "dominantCoreBeneficiaryEvidenceCount": 3,
      "dominantCoreBeneficiaryEvidenceShare": 1,
      "singleControlPlaneDependency": true,
      "controlPlaneConcentrationHigh": true
    }
  },
  "underwritingPolicy": {
    "profile": "collateral_screening",
    "profileLabel": "Collateral screening",
    "policyVersion": "anchora-underwriting-v3",
    "requiredCoreEvidence": ["valuation", "inspection", "legal_verification", "custody"],
    "requiredLegalWrapperCompleteness": "complete",
    "automatedScreeningMinScore": 70,
    "manualReviewMinScore": 25,
    "minDistinctCoreAttestors": 2,
    "maxCoreEvidenceSharePerAttestor": 0.5,
    "minDistinctCoreCompanies": 2,
    "maxCoreEvidenceSharePerCompany": 0.5,
    "minDistinctCoreSourceClusters": 2,
    "maxCoreEvidenceSharePerSourceCluster": 0.5,
    "minDistinctCoreControlPlanes": 2,
    "maxCoreEvidenceSharePerControlPlane": 0.5,
    "minCoreSpreadDays": 7,
    "maxCoreClusterHours": 24,
    "automationPenaltyReviewThreshold": 15,
    "automationPenaltyBlockThreshold": 45
  },
  "verdict": {
    "status": "eligible_with_conditions",
    "reason": "Evidence is usable, but warnings should be reviewed before automated collateral decisions"
  },
  "risk": {
    "warnings": [
      "No confirmed audit attestation",
      "Core evidence is overly concentrated in one attestor",
      "Core evidence depends on a single company",
      "Core evidence is overly concentrated in one company",
      "Core evidence depends on a single operational source cluster",
      "Core evidence is overly concentrated in one operational source cluster",
      "Core evidence depends on a single operator or control plane",
      "Core evidence is overly concentrated in one operator or control plane",
      "Core evidence was confirmed within a tightly clustered time window",
      "Core evidence lacks temporal spread across independent confirmation windows"
    ],
    "warningCodes": [
      "missing_optional_audit",
      "core_attestor_concentration_high",
      "core_single_company_dependency",
      "core_company_concentration_high",
      "core_single_source_cluster_dependency",
      "core_source_cluster_concentration_high",
      "core_single_control_plane_dependency",
      "core_control_plane_concentration_high",
      "core_temporal_clustered",
      "core_temporal_spread_too_narrow"
    ],
    "warningDetails": [
      {
        "code": "core_single_company_dependency",
        "message": "Core evidence depends on a single company",
        "severity": "high",
        "penalty": 25
      },
      {
        "code": "core_company_concentration_high",
        "message": "Core evidence is overly concentrated in one company",
        "severity": "high",
        "penalty": 25
      },
      {
        "code": "core_attestor_concentration_high",
        "message": "Core evidence is overly concentrated in one attestor",
        "severity": "medium",
        "penalty": 15
      },
      {
        "code": "core_single_source_cluster_dependency",
        "message": "Core evidence depends on a single operational source cluster",
        "severity": "high",
        "penalty": 25
      },
      {
        "code": "core_source_cluster_concentration_high",
        "message": "Core evidence is overly concentrated in one operational source cluster",
        "severity": "medium",
        "penalty": 15
      },
      {
        "code": "core_single_control_plane_dependency",
        "message": "Core evidence depends on a single operator or control plane",
        "severity": "high",
        "penalty": 25
      },
      {
        "code": "core_control_plane_concentration_high",
        "message": "Core evidence is overly concentrated in one operator or control plane",
        "severity": "medium",
        "penalty": 15
      },
      {
        "code": "core_temporal_spread_too_narrow",
        "message": "Core evidence lacks temporal spread across independent confirmation windows",
        "severity": "medium",
        "penalty": 15
      },
      {
        "code": "core_temporal_clustered",
        "message": "Core evidence was confirmed within a tightly clustered time window",
        "severity": "medium",
        "penalty": 10
      },
      {
        "code": "missing_optional_audit",
        "message": "No confirmed audit attestation",
        "severity": "low",
        "penalty": 5
      }
    ],
    "blockers": [],
    "blockerCodes": [],
    "blockerDetails": [],
    "automationPenaltyScore": 175
  },
  "decisionSummary": {
    "automationReadiness": "blocked",
    "recommendedAction": "route_to_manual_review",
    "missingCoreEvidence": [],
    "missingOptionalEvidence": ["audit"],
    "reviewTriggers": [
      "No confirmed audit attestation",
      "Core evidence is overly concentrated in one attestor",
      "Core evidence depends on a single company",
      "Core evidence is overly concentrated in one company",
      "Core evidence depends on a single operational source cluster",
      "Core evidence is overly concentrated in one operational source cluster",
      "Core evidence depends on a single operator or control plane",
      "Core evidence is overly concentrated in one operator or control plane",
      "Core evidence was confirmed within a tightly clustered time window",
      "Core evidence lacks temporal spread across independent confirmation windows"
    ],
    "reviewTriggerCodes": [
      "missing_optional_audit",
      "core_attestor_concentration_high",
      "core_single_company_dependency",
      "core_company_concentration_high",
      "core_single_source_cluster_dependency",
      "core_source_cluster_concentration_high",
      "core_single_control_plane_dependency",
      "core_control_plane_concentration_high",
      "core_temporal_clustered",
      "core_temporal_spread_too_narrow"
    ],
    "automationPenaltyScore": 175,
    "automationPenaltyReasons": [
      "Core evidence depends on a single company",
      "Core evidence is overly concentrated in one company",
      "Core evidence depends on a single operational source cluster",
      "Core evidence is overly concentrated in one operational source cluster",
      "Core evidence depends on a single operator or control plane",
      "Core evidence is overly concentrated in one operator or control plane",
      "Core evidence is overly concentrated in one attestor",
      "Core evidence lacks temporal spread across independent confirmation windows",
      "Core evidence was confirmed within a tightly clustered time window",
      "No confirmed audit attestation"
    ],
    "nextActions": [
      "Add a confirmed audit attestation",
      "Reduce concentration by sourcing core evidence from another attestor",
      "Add core evidence from an independent company",
      "Reduce concentration by sourcing core evidence from another company",
      "Add core evidence from an independent operational source cluster",
      "Reduce operational concentration by sourcing evidence through another source cluster",
      "Add evidence that originates from an independent operator or control plane",
      "Reduce dependence on a single operator or servicing workflow",
      "Collect a repeat core confirmation outside the current time cluster",
      "Add a temporally independent re-verification after a wider interval",
      "Resolve the highest-severity trust issues before enabling automated decisions"
    ]
  },
  "integrity": {
    "snapshotVersion": "proof-package-v6",
    "snapshotHash": "9d3f...sha256...",
    "signaturePayloadHash": "f31a...sha256...",
    "signature": {
      "status": "signed",
      "algorithm": "ed25519",
      "keyId": "proof-package-ed25519-v1",
      "publicKey": "-----BEGIN PUBLIC KEY-----...",
      "signedAt": "2026-04-22T12:00:00.000Z",
      "value": "MEUCIQ...",
      "reason": null
    }
  },
  "provenance": {
    "programId": "CNMJZ327d1RXb236W7AR557SoG7D9HFyRR5iT7he1kPs",
    "network": "devnet",
    "generatedAt": "2026-04-22T12:00:00.000Z"
  }
}

402 response body

HTTP/1.1 402 Payment Required
Content-Type: application/json

{
  "x402Version": 1,
  "accepts": [{
    "scheme": "exact",
    "network": "solana",
    "maxAmountRequired": "5000",
    "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "payTo": "GkGbgb1a6jSvFYDG1ZnjAHA55gFf4CP9ZNXP3ewMFv9a",
    "resource": "https://anchora.markets/api/x402/v1/assets/9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd/score",
    "extra": {
      "name": "USDC",
      "version": "2"
    }
  }],
  "paymentRequirements": [{
    "scheme": "exact",
    "network": "solana",
    "maxAmountRequired": "5000",
    "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "payTo": "GkGbgb1a6jSvFYDG1ZnjAHA55gFf4CP9ZNXP3ewMFv9a",
    "resource": "https://anchora.markets/api/x402/v1/assets/9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd/score",
    "extra": {
      "name": "USDC",
      "version": "2"
    }
  }],
  "extensions": {
    "payment-identifier": {
      "info": { "required": false }
    }
  }
}

X-PAYMENT header

After paying, pass the payment payload as a base64-encoded JSON string in the X-PAYMENT header on retry. Include the optional payment-identifier extension for safe retries; the same identifier and same request returns a cached paid response.

curl https://anchora.markets/api/x402/v1/assets/9knTbbayAKkB2iMmiLWTTq8dDcptHfqR42Wr8Rb2VmUd/score \
  -H "X-PAYMENT: <base64-encoded-payment-payload>"

# Successful paid responses include:
# X-PAYMENT-RESPONSE: {"success":true,"network":"solana","transaction":"<settlement_tx>","paymentIdentifier":"pay_...","cached":false}

Settlement

NetworkSolana mainnet
AssetUSDC (EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)
Schemax402 exact
Timeout300s max

Compatible clients

Coinbase AgentKitx402 TypeScript SDK (x402/client)Any custom HTTP agent
Try x402 on developers page →
Anchora API Reference← User Guide