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.
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_.
Rate limits
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.
Path parameters
assetAddressQuery parameters
typeconfidencelimitResponse
{
"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.
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"
}
}Cached 60s, stale-while-revalidate 120s.
GET GET /api/v1/attestors
Returns all active verified attestors in the Anchora network.
Query parameters
roleResponse
{
"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.
Path parameters
txSignaturecurl 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 key404Not FoundAsset or transaction not found429Rate LimitedDaily free tier exceeded — top up credits500Server 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
- 1Agent calls any /api/x402/v1/* endpoint without authentication.
- 2Server responds 402 Payment Required with payment details, plus optional payment-identifier idempotency metadata.
- 3Agent signs and broadcasts a USDC transfer on Solana, then retries with X-PAYMENT header.
- 4Server verifies, settles, records the receipt, and returns data with X-PAYMENT-RESPONSE.
Endpoints
/api/x402/v1/assets/:assetAddress/score$0.005Asset reliability score (0–100). Use the Asset PDA address or linked mint address.
/api/x402/v1/assets/by-mint/:mint$0.005Resolve a token mint to the Anchora asset record and on-chain index context.
/api/x402/v1/verify/:txSignature$0.01Verify an attestation transaction by Solana signature.
/api/x402/v1/assets/:assetAddress/proof-package$0.05Underwriting-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.
/api/x402/v1/catalogFreeMachine-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}