Skip to content

REST API

The SATI dashboard exposes a public REST API at https://sati.cascade.fyi. Use it to query agents, feedback, and reputation without pulling in the full SDK.

Base URL: https://sati.cascade.fyi

All endpoints accept a ?network=mainnet|devnet query parameter (defaults to mainnet).

Endpoints

List agents

GET /api/agents?network=mainnet&limit=20&offset=0&order=newest&name=search&owner=ADDRESS&endpointTypes=MCP,A2A&includeReputation=true
ParamTypeDescription
networkmainnet | devnetNetwork to query
limitnumberMax results (1-50, default 20)
offsetnumberSkip first N agents (default 0)
ordernewest | oldestSort order (default newest)
namestringFilter by name (case-insensitive substring). Searches all agents, not just the current page.
ownerstringFilter by owner address
endpointTypesstringComma-separated service types: MCP, A2A, OASF (case-sensitive). Searches all agents.
includeReputationtrueInclude reputation object per agent (slower - extra RPC calls per agent)

Response:

json
{
  "agents": [
    {
      "mint": "AgentMint...",
      "agentId": "solana:5eykt4...:AgentMint...",
      "owner": "Owner...",
      "name": "MyAgent",
      "description": "AI assistant",
      "image": "https://...",
      "uri": "ipfs://Qm...",
      "memberNumber": 1,
      "nonTransferable": false,
      "active": true,
      "services": [{"name": "MCP", "endpoint": "https://..."}],
      "supportedTrust": ["reputation"],
      "x402Support": false
    }
  ],
  "count": 1,
  "totalAgents": 80
}

Get agent

GET /api/agents/:mint?network=mainnet

Returns a single agent with reputation summary.

Response: Same as list item, plus:

json
{
  "nonTransferable": false,
  "registrations": [{"agentId": "...", "agentRegistry": "..."}],
  "reputation": {
    "count": 42,
    "summaryValue": 85,
    "summaryValueDecimals": 0
  }
}

reputation.count is total feedback entries. summaryValue is the average of entries that have a value field (divided by value count, not total count).

Get reputation

GET /api/reputation/:mint?network=mainnet&tag1=starred&tag2=chat&clientAddresses=ADDR1,ADDR2
ParamTypeDescription
tag1stringFilter by primary tag
tag2stringFilter by secondary tag
clientAddressesstringComma-separated reviewer addresses

Response:

json
{
  "count": 42,
  "summaryValue": 85,
  "summaryValueDecimals": 0
}

count is total feedback entries matching filters. summaryValue averages only entries with a value field set.

Registry stats

GET /api/stats?network=mainnet

Response:

json
{
  "totalAgents": 80,
  "groupMint": "satiG7i...",
  "authority": "SQ2xx...",
  "isImmutable": false
}

Reputation scores (from providers)

GET /api/scores/:mint?network=mainnet

Returns ReputationScoreV3 attestations published by scoring providers for this agent.

Response:

json
{
  "scores": [
    {
      "provider": "Provider...",
      "agentMint": "Agent...",
      "outcome": 2,
      "content": {
        "score": 85,
        "methodology": "weighted_average",
        "feedbackCount": 42
      }
    }
  ],
  "count": 1
}

content is the parsed JSON from the scoring provider's attestation. Structure varies by provider but typically includes score, methodology, and feedbackCount.

Reputation badge

GET /api/badge/:mint?network=mainnet

Returns an SVG badge (shields.io style) showing the agent's reputation score. Embed in README files:

markdown
![SATI Reputation](https://sati.cascade.fyi/api/badge/YOUR_MINT?network=mainnet)

Badge shows score/100 with review count, color-coded: green (70+), yellow (40-69), red (<40), gray (no reviews). Cached for 5 minutes.

List feedback (per agent)

GET /api/feedback/:mint?network=mainnet&limit=50&offset=0&clientAddress=ADDR&tag1=starred&tag2=chat&outcome=2
ParamTypeDescription
limitnumberMax results (1-200, default 50)
offsetnumberSkip first N entries (default 0)
clientAddressstringFilter by reviewer address
tag1stringFilter by primary tag
tag2stringFilter by secondary tag
outcomenumberFilter by outcome: 0 = Negative, 1 = Neutral, 2 = Positive

Response:

json
{
  "feedbacks": [
    {
      "compressedAddress": "Attest...",
      "clientAddress": "Reviewer...",
      "agentMint": "Agent...",
      "value": 87,
      "valueDecimals": 0,
      "tag1": "starred",
      "tag2": "chat",
      "message": "Great response time",
      "endpoint": "https://...",
      "outcome": 2,
      "createdAt": 1709654400,
      "schema": "FeedbackPublicV1",
      "isRevoked": false
    }
  ],
  "count": 1,
  "total": 42
}

count is the number of items in this page. total is the total matching items across all pages. compressedAddress is a base58-encoded compressed account address (stable identifier). Fields like value, tag1, tag2, message, endpoint are null when not set (not 0 or empty string).

List feedback (global)

GET /api/feedback?network=mainnet&limit=50&offset=0&clientAddress=ADDR&tag1=starred&outcome=2

Same parameters and response as per-agent endpoint, but returns feedback across all agents. Useful for indexers and scoring providers.

Submit feedback

POST /api/feedback
Content-Type: application/json

{
  "network": "mainnet",
  "agentMint": "AgentMint...",
  "value": 85,
  "valueDecimals": 0,
  "tag1": "starred",
  "tag2": "chat",
  "message": "Great response time",
  "endpoint": "https://...",
  "outcome": 2
}
FieldTypeDescription
agentMintstringRequired. Agent mint address
valuenumberRequired. Numeric score
networkstringmainnet | devnet (default mainnet)
valueDecimalsnumberDecimal places for value (default 0)
tag1stringPrimary tag
tag2stringSecondary tag
messagestringHuman-readable feedback message
endpointstringEndpoint reviewed
outcomenumber0 = Negative, 1 = Neutral (default), 2 = Positive

Server acts as counterparty and pays transaction fees. Rate limited per IP.

Response:

json
{
  "success": true,
  "txSignature": "5Kj...",
  "attestationAddress": "Attest..."
}

Rate limits

  • Read endpoints: best-effort per-IP rate limiting (Cloudflare Worker isolate-level)
  • RPC proxy (/api/rpc/:network): ~120 requests/min per IP
  • Photon proxy (/api/photon/:network): ~120 requests/min per IP
  • For production workloads, use the SDK with your own Helius/Triton RPC via rpcUrl and photonRpcUrl

Notes

  • Queries both FeedbackV1 and FeedbackPublicV1 schemas automatically
  • Reputation summaryValue averages only entries with a value field; count includes all entries
  • outcome values: 0 = Negative, 1 = Neutral, 2 = Positive
  • Agent IDs follow CAIP-2 format: solana:{genesis_hash}:{mint_address}
  • createdAt is a Unix timestamp (seconds), approximate based on Solana slot times (~400ms/slot)
  • schema field indicates whether feedback is blind (FeedbackV1) or public (FeedbackPublicV1)
  • compressedAddress is a base58-encoded string, usable as a stable identifier for feedback entries
  • clientAddress in the REST API corresponds to counterparty in the SDK (the reviewer's wallet address)
  • endpointTypes filter is case-sensitive - use MCP, A2A, OASF (not lowercase)

Released under the Apache 2.0 License.