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| Param | Type | Description |
|---|---|---|
network | mainnet | devnet | Network to query |
limit | number | Max results (1-50, default 20) |
offset | number | Skip first N agents (default 0) |
order | newest | oldest | Sort order (default newest) |
name | string | Filter by name (case-insensitive substring). Searches all agents, not just the current page. |
owner | string | Filter by owner address |
endpointTypes | string | Comma-separated service types: MCP, A2A, OASF (case-sensitive). Searches all agents. |
includeReputation | true | Include reputation object per agent (slower - extra RPC calls per agent) |
Response:
{
"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=mainnetReturns a single agent with reputation summary.
Response: Same as list item, plus:
{
"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| Param | Type | Description |
|---|---|---|
tag1 | string | Filter by primary tag |
tag2 | string | Filter by secondary tag |
clientAddresses | string | Comma-separated reviewer addresses |
Response:
{
"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=mainnetResponse:
{
"totalAgents": 80,
"groupMint": "satiG7i...",
"authority": "SQ2xx...",
"isImmutable": false
}Reputation scores (from providers)
GET /api/scores/:mint?network=mainnetReturns ReputationScoreV3 attestations published by scoring providers for this agent.
Response:
{
"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=mainnetReturns an SVG badge (shields.io style) showing the agent's reputation score. Embed in README files:
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| Param | Type | Description |
|---|---|---|
limit | number | Max results (1-200, default 50) |
offset | number | Skip first N entries (default 0) |
clientAddress | string | Filter by reviewer address |
tag1 | string | Filter by primary tag |
tag2 | string | Filter by secondary tag |
outcome | number | Filter by outcome: 0 = Negative, 1 = Neutral, 2 = Positive |
Response:
{
"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=2Same 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
}| Field | Type | Description |
|---|---|---|
agentMint | string | Required. Agent mint address |
value | number | Required. Numeric score |
network | string | mainnet | devnet (default mainnet) |
valueDecimals | number | Decimal places for value (default 0) |
tag1 | string | Primary tag |
tag2 | string | Secondary tag |
message | string | Human-readable feedback message |
endpoint | string | Endpoint reviewed |
outcome | number | 0 = Negative, 1 = Neutral (default), 2 = Positive |
Server acts as counterparty and pays transaction fees. Rate limited per IP.
Response:
{
"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
rpcUrlandphotonRpcUrl
Notes
- Queries both FeedbackV1 and FeedbackPublicV1 schemas automatically
- Reputation
summaryValueaverages only entries with avaluefield;countincludes all entries outcomevalues: 0 = Negative, 1 = Neutral, 2 = Positive- Agent IDs follow CAIP-2 format:
solana:{genesis_hash}:{mint_address} createdAtis a Unix timestamp (seconds), approximate based on Solana slot times (~400ms/slot)schemafield indicates whether feedback is blind (FeedbackV1) or public (FeedbackPublicV1)compressedAddressis a base58-encoded string, usable as a stable identifier for feedback entriesclientAddressin the REST API corresponds tocounterpartyin the SDK (the reviewer's wallet address)endpointTypesfilter is case-sensitive - useMCP,A2A,OASF(not lowercase)