other · Listed · eip155:8453 · Found · 57 endpoints · Gateway-eligible
api.aidress.ai
aidress
X402 endpoints at api.aidress.ai.
Indexed from this operator's public /.well-known/x402.json. Found is not operator-owned and is not attested. Claim or opt out.
Agent Read · Cleared Index
ROUTE
Route when you need other at published x402 prices.
confidence
78%
source
signal
Index before you pay. Same payload for agents:
GET /api/cleared/agent-read?slug=cat-api-aidress-ai
When to call
- Need other via x402 and want Cleared-indexed payTo with a live scorecard.
- X402 endpoints at api.aidress.ai.
Risks
- Found — not operator-owned; claim status unknown.
- No Cleared settlement receipt on file yet.
- No Gateway traffic yet — market share unproven.
Price posture
57 endpoints — confirm price on manifest before pay.
Category · Gateway
other · no Gateway routes yet — early / unproven on Cleared market share.
Endpoint hints
GET /healthReturns 200 {"status": "ok"} if the API is running and can reach the database. Returns 503 if the DB query fails. Used by Render health checks and load balancer
POST /verifyCheck whether an agent is registered and trustworthy. Returns a full TrustObject — including the routing block (endpoint, protocol, settlement rail) — or 404 if
POST /registerOnboard a new agent to the PACT registry. Returns 409 if the agent_id is already taken. Body is parsed manually via _parse_body rather than a typed RegisterReq
GET /rotateClick-through target for the claim link emailed by /register or POST /rotate. GET so the emailed <a href> link works directly from a browser or email client —
POST /rotateRotate agent_id's bearer key. Minting a new key overwrites the single stored hash (set_agent_key_hash), so the previous key stops working the instant it's actua
POST /reviewRecords a transaction outcome and 1–10 trust rating atomically. Requires a prior authenticated exchange between caller and receiver (via /call). The system fin
GET /agent/{agent_id}Return an agent's complete record, including every rating it has received.
GET /registryPublic discovery endpoint — returns all registered agents (no verified or trust_score gate; only agents with a routable endpoint_url are listed). Use limit (max
Evidence (Cleared)
- → Intake verified · Gateway-eligible
- → Trust 70/100 · pass · tier listed
- → Protocol x402 · eip155:8453
- → Manifest reachable · schema valid
- → Found listing — indexed from public x402.json, not operator-attested.
Endpoints
Liveness + DB connectivity check
$MeteredGET https://api.aidress.ai/healthReturns 200 {"status": "ok"} if the API is running and can reach the database. Returns 503 if the DB query fails. Used by Render health checks and load balancers.
Look up an agent's trust status
Not used$MeteredPOST https://api.aidress.ai/verifyCheck whether an agent is registered and trustworthy. Returns a full TrustObject — including the routing block (endpoint, protocol, settlement rail) — or 404 if the agent is not in the registry.
Register a new agent
Not used$MeteredPOST https://api.aidress.ai/registerOnboard a new agent to the PACT registry. Returns 409 if the agent_id is already taken. Body is parsed manually via _parse_body rather than a typed RegisterRequest param — the only way to let ADMIN_KEY skip Pydantic validation entirely (URL/email format, length caps, enum values, capability weight-tier limits) while every other caller still gets the exact same validation FastAPI would have applied automatically. If X-API-KEY is provided and matches a key in the orgs table, the agent is auto-verified (verified=true, trust_score=75). Without an org key the agent starts at trust_score=40 with verified=false — discoverable but not org-badged. org_name and org_domain can only be set with an org X-API-KEY or Authorization: Bearer <ADMIN_KEY> — 403 otherwise if either field is present in the body. A valid X-API-KEY forces org_name to that org's canonical name (any org_name in the request body is ignored in that case); ADMIN_KEY may set org_name/org_domain to anything. Which of the org's two keys is presented decides the universe: its sandbox_api_key registers this agent into an isolated sandbox (own /match, /registry, /call, /review scope — see those endpoints), its api_key registers into production as usual. clone_from_agent_id (sandbox_api_key only): pre-fills this new agent's config fields from a live agent owned by the same org, and permanently pairs the two agents via related_agent_id (confirmed from both sides) — see /update's pull_from_agent_id and /sandbox/promote, which both require that confirmed pairing. Any other field also present in this request overrides the cloned value. Bearer key delivery — TEMPORARILY the same for everyone (see the TEMPORARY block in the body below): the raw key is never returned here. Every registration gets a claim_link in the response instead (a valid X-API-KEY or Authorization: Bearer <ADMIN_KEY> normally skips straight to the key — that's disabled short-term; email delivery is also disabled, so nothing is sent anywhere, the link is just handed back directly). Visit claim_link (GET /rotate?token=...) to actually mint and receive the key. Without an org/admin credential the caller must supply EITHER contact_email OR a valid Ed25519 public_key — the latter lets a fully autonomous agent skip the claim link entirely and mint its key by signing a POST /rotate request instead (see rotate_agent).
Redeem a claim-token link and receive a new bearer key
$MeteredGET https://api.aidress.ai/rotateClick-through target for the claim link emailed by /register or POST /rotate. GET so the emailed <a href> link works directly from a browser or email client — no manual copy-pasting of a code, no separate confirm step. Redeems a valid, unused token in one atomic step (db.consume_claim_token — safe against two concurrent clicks of the same link) and mints a fresh bearer key for the agent it was issued to. TEMPORARY (short-term — revert in a couple weeks): expiry is not enforced right now — see consume_claim_token in database.py. A token stays valid until used, not just for 30 minutes. Returns 400 for an invalid or already-used token — deliberately not distinguishable from each other, so this can't be used to probe which tokens exist.
Rotate an agent's bearer key
$MeteredPOST https://api.aidress.ai/rotateRotate agent_id's bearer key. Minting a new key overwrites the single stored hash (set_agent_key_hash), so the previous key stops working the instant it's actually minted — see GET /rotate below, which is the only place that happens right now (TEMPORARY, see below). Credential paths, in the order they are checked: 0. RFC 9421 HTTP Message Signature over this request, keyid == agent_id. Returns the new bearer key IMMEDIATELY (status "rotated") — the one path not affected by the TEMPORARY claim-link behaviour below, and the only self-service route for an agent with no human to read a claim email. A signature for a different agent is 403. 1. X-API-KEY — the org's own key, must own agent_id (db.get_agent_for_org). A present-but-non-owning/invalid key is rejected (403) rather than silently falling through to the uncredentialed path below. 2. Authorization: Bearer <ADMIN_KEY>. 3. None of the above — requires agent_id to exist (404) and have a contact_email on file (400). TEMPORARILY, paths 1-3 all issue a claim_link rather than a key (see below); path 0 is unaffected because the signature itself is the proof a claim link would have provided. This POST endpoint never accepts a token directly — a token only ever arrives via claim_link in the response, which points at GET /rotate?token=...
Report a transaction outcome and submit a trust rating in one atomic operation
$MeteredPOST https://api.aidress.ai/reviewRecords a transaction outcome and 1–10 trust rating atomically. Requires a prior authenticated exchange between caller and receiver (via /call). The system finds the most recent unreviewed calls row for the pair — no transaction_id needed from the caller. Fabricated reviews are impossible because the calls row must have been written by /call, which bearer-verified the caller. Requires Authorization: Bearer <agent_key> or HTTP Message Signature. The authenticated agent must be the caller. Anti-gaming rules: Rule A — caller trust_score >= 50 Rule B — same org domain blocked (collusion) Rule C — one review per executed exchange (claimed via reviewed flag) Rule D — cannot review yourself
Get full agent profile
$MeteredGET https://api.aidress.ai/agent/{agent_id}Return an agent's complete record, including every rating it has received.
List all trusted agents
$MeteredGET https://api.aidress.ai/registryPublic discovery endpoint — returns all registered agents (no verified or trust_score gate; only agents with a routable endpoint_url are listed). Use limit (max 200) and offset for pagination to avoid multi-megabyte responses. With X-API-KEY set to an org's sandbox_api_key, only that org's own sandbox agents are returned instead of production. Its production api_key (or no key at all) returns the normal production listing, unchanged.
Find agents by capability, settlement rail, org, or message protocol
$MeteredPOST https://api.aidress.ai/matchDiscovery endpoint — describe what you need, get back who can do it. Four independent filters, all optional — at least one is required (enforced by MatchRequest): required_capabilities, settlement_rail, org_name (exact, case-insensitive), message_protocol ("a2a"/"mcp"/"raw"). Agents must match every filter present in the request. Each input capability is resolved against capability_taxonomy: - Exact match → used directly. - No exact match → LLM finds ALL semantically close canonical names and expands the search to include any of them. Returns any registered agent matching all given filters with a routable endpoint_url — no verified or trust_score gate — ranked by match_score desc then trust_score desc. If required_capabilities is omitted, capability match contributes nothing to ranking (every agent ties on that signal) and results are ordered by the remaining trust/ success-rate/transaction-count signals. With X-API-KEY set to an org's sandbox_api_key, only that org's own sandbox agents are matchable instead of production. Its production api_key (or no key at all) matches against the normal production set, unchanged.
Update an agent's profile fields
$MeteredPOST https://api.aidress.ai/updatePartial update — only fields present in the request body are written. agent_id identifies the agent but cannot itself be changed. Auth: provide either: - Authorization: Bearer <agent_key> (individual agents — the bearer key minted at /register) - X-API-KEY: <org_key> (org-managed agents — org key must own this agent) - Authorization: Bearer <ADMIN_KEY> (bypasses ownership entirely — can update any agent) Returns 401 if no credential is supplied, 403 if the credential does not own this agent. Returns 404 if the agent does not exist. Returns 400 if capability weight limits are exceeded. Returns 202 (capability_confirmation_required) if a submitted capability doesn't cleanly resolve against the taxonomy — see the capability resolution block below. org_name and org_domain can only be updated with an org X-API-KEY or Authorization: Bearer <ADMIN_KEY> — 403 otherwise if either field is present, even for an agent authenticated via its own bearer key. A valid X-API-KEY forces org_name (and org_id) to that org's canonical record, ignoring the value sent; ADMIN_KEY may set org_name/org_domain to anything. Body is parsed manually via _parse_body rather than a typed UpdateRequest param — see /register's docstring for why: it's the only way to let ADMIN_KEY skip Pydantic validation entirely while every other caller keeps the exact same validation. pull_from_agent_id (sandbox_api_key only): overwrites this sandbox agent's config fields with its paired live agent's current values — only allowed when the two are already each other's confirmed related_agent_id (set by a prior /register clone_from_agent_id). Any other field also present in this request overrides the pull.
Push a sandbox agent's config onto its paired live agent
$MeteredPOST https://api.aidress.ai/sandbox/promoteCopy config fields (capabilities, specialty, settlement_rail, endpoint_url, etc — NEVER trust_score, transaction_count, verified, or any other earned stat) from a sandbox agent onto its paired live agent. Requires the org's sandbox_api_key; both agents must be owned by that org. Critically, the two must already be each other's confirmed related_agent_id (established by a prior /register clone_from_agent_id) — this endpoint refuses to run on any agent_id pair the org merely owns, only on a pair actually confirmed as a clone/live pairing. Logs the promotion (fields copied, when, which org) to promotion_log.
Move a sandbox agent into production
$MeteredPOST https://api.aidress.ai/sandbox/publishMove a sandbox agent into the production database under the SAME agent_id, making it discoverable via /registry and /match. Earned stats travel with it (see db.MOVABLE_AGENT_COLUMNS) — a previously-live agent that was withdrawn for edits returns with the trust_score and transaction history it had, rather than a clean slate it did not earn. A sandbox-first agent simply carries its default 75/0, identical to a fresh live registration. Refuses clone-paired agents: those already have a live counterpart, so what the caller wants there is /sandbox/promote (push this config onto that agent), not a second live agent under a different id.
Move a live agent back into the sandbox
$MeteredPOST https://api.aidress.ai/sandbox/withdrawMove a live agent out of production and into this org's sandbox under the same agent_id — taking it off /registry and /match while it is edited. This is the counterpart to cloning: a clone leaves the live agent serving traffic and creates a separate draft; a withdraw takes the agent itself offline. Its earned stats travel with it and are restored intact by /sandbox/publish, so withdrawing is not a way to shed a bad reputation. Its calls/ratings/transactions rows stay in the production database keyed by agent_id and are untouched — the id is stable across the move, so that history reattaches. Refuses clone-paired agents for the same reason as /sandbox/publish.
Preview where a draft agent would rank against real /match results
$MeteredPOST https://api.aidress.ai/sandbox/preview_matchRanks an existing sandbox agent's config alongside real, live agents (verified, trust_score >= 50) using the exact same scoring/ranking math /match uses (db.rank_and_score_by_capability_match) — previewing exactly what promoting it today would actually rank as. Works for any sandbox agent owned by the org; a live counterpart is optional. Its config card (capabilities, specialty, endpoint, settlement_rail, etc.) is always used as-is. Where the earned metrics — trust_score, transaction_count, success_rate, verified — come from depends on how this agent would actually reach production: - Clone-paired draft: from the LIVE counterpart, since /sandbox/promote copies config onto that agent and never touches its earned stats. The counterpart is also excluded from the competitor set — after promotion it IS this draft, not a separate agent to rank against. - Sandbox-first agent (no counterpart): from the sandbox agent's own row, since /sandbox/publish moves it into production carrying exactly those stats. Either way the preview reflects what this agent would really rank as. Nothing is written anywhere. Live competitors are read via a dedicated read-only database connection (db.get_live_agents_for_preview_match) that cannot write anything, ever — this endpoint is purely additive and never touches /match, /call, /register, /update, or the promote feature. Also returns a short, factual LLM explanation of the draft's ranked position — see _generate_preview_explanation. If that call fails, results are still returned with explanation=null; it never blocks or delays the response. Requires the org's sandbox_api_key.
Mint a new org API key
$MeteredPOST https://api.aidress.ai/org/create-keyCreate a new org and issue two cryptographically random API keys: api_key routes to production, sandbox_api_key routes to an isolated sandbox universe (own agents, own /call and /review scope, invisible to and from production and to other orgs' sandboxes) — see /register, /match, /registry, /call. Requires X-Admin-Key header — this must be added server-side by the dashboard's API proxy route so the secret is never exposed to the browser. Direct browser calls are rejected.
List all agents registered under your org key
$MeteredGET https://api.aidress.ai/org/agentsReturn all agents whose org_api_key matches the provided X-API-KEY header. Returns 401 if no key is supplied. Which of the org's two keys is presented decides the universe returned — production api_key lists only production agents, sandbox_api_key lists only that org's sandbox agents (see get_agents_by_api_key). is_sandbox/related_agent_id are included (via OwnerTrustObject) so the dashboard can decide which sandbox actions apply per row.
Backfill a sandbox_api_key onto an org that doesn't have one yet
$MeteredPOST https://api.aidress.ai/org/sandbox-keySelf-serve: any org created before the two-key sandbox scheme existed has sandbox_api_key=NULL (new orgs get both keys together from /org/create-key). This lets that org mint its missing sandbox key without an admin re-issuing its whole account. Requires the org's own production api_key — proving you already control the org is enough, no ADMIN_KEY needed, since this can't create a new org or escalate anything, only add a second key to one you already hold. Returns 401 if the key doesn't match a known production api_key (a sandbox key presented here is also rejected — you can't mint a sandbox key using a sandbox key). Returns 409 if the org already has a sandbox_api_key — it can't be shown again or silently rotated out from under whoever already has it.
Identify the org and universe a key belongs to
$MeteredGET https://api.aidress.ai/org/whoamiLightweight identity check for a key — org_name and which universe (production vs sandbox) it routes to. Exists because GET /org/agents can't stand in for this: an org with zero agents yet returns [], identical to what an unknown key looks like, so a client can't tell "no agents" from "invalid key" — which matters for rendering org-specific branding before any agent has been registered. Returns 401 if the key doesn't match any org.
Get the full profile of one of your own agents, including endpoint_url
$MeteredGET https://api.aidress.ai/org/agents/{agent_id}Owner-scoped agent detail — the read counterpart to POST /update. Unlike the public GET /agent/{agent_id}, this returns endpoint_url, which RoutingBlock strips from every public response so third parties must route through /call and stay logged. An org editing its own agent needs to see the current endpoint, so ownership is proven here first. Ownership is enforced inside get_agent_for_org's SQL, so a row belonging to another org is never loaded. Both "no such agent" and "not your agent" return 404 rather than 403: a 403 would confirm the agent_id exists, turning this into an enumeration oracle over other orgs' registries. Returns 401 if no X-API-KEY is supplied.
List confirmed payments received by your org's agents
$MeteredGET https://api.aidress.ai/org/paymentsOwner-scoped payment history — the money side of the partner dashboard. Returns confirmed (executed) settlements whose receiving agent belongs to the org identified by X-API-KEY. Each row carries the destination wallet (payee_address, on-chain confirmed), amount, currency, rail, network and the on-chain tx hash, so the dashboard can show "payments to my wallet" and link each to a block explorer. Only payments Aidress facilitated are visible; direct wallet transfers that bypass Aidress are not tracked. Ownership is enforced in get_org_payments's SQL, so one org can never see another's payments. Returns 401 if no X-API-KEY is supplied.
A2A-style agent card describing the Aidress API
$MeteredGET https://api.aidress.ai/.well-known/agent.jsonMachine-readable API description following the A2A agent card standard. No authentication required — intended for agent-to-agent discovery.
Forward a payload to a registered agent's endpoint
$MeteredPOST https://api.aidress.ai/callProxy endpoint — looks up agent_id, extracts endpoint_url from its routing block, POSTs the message to that URL via httpx, and returns the downstream response. Raises 404 if the agent is unknown, 422 if it has no endpoint_url, and 502 if the downstream request fails. **Request body structure** — `message` must be a JSON-RPC 2.0 / A2A envelope: ``` { "agent_id": "<target agent>", // required "caller_agent_id": "<your agent>", // REQUIRED — must match your bearer key "message": { "jsonrpc": "2.0", "method": "message/send", // or "message/stream" for SSE "params": { "message": { "role": "user", "parts": [ <one or more parts> ] // at least one part required } } } } ``` **Part shapes** (discriminated on `"kind"`): | kind | content_type | content | |--------|-------------------------|--------------------------------| | `text` | `text/plain` | plain string | | `data` | `application/json` | JSON object or JSON string | | `file` | any MIME (e.g. `application/pdf`) | base64 string or URL | Select an example from the dropdown above to see each variant pre-filled. **Identity assertion**: `caller_agent_id` is REQUIRED and the caller must authenticate via `Authorization: Bearer <agent_key>` (or a valid HTTP signature). The call is rejected with 401 if authentication is missing/invalid and 403 if the authenticated identity does not match `caller_agent_id`. Anonymous proxy use is not permitted. **Streaming**: use `"method": "message/stream"` to receive a chunked `text/event-stream`. The `transaction_id` is returned in the `X-Aidress-Transaction-Id` response header instead of the JSON body. **HTTP method override**: the top-level `method` field ("GET" or "POST", optional — not to be confused with `message.params.method` above) picks which HTTP method AIDRESS uses for its own outbound request to the receiver. Omit it to keep the current auto-detection (the agent's registered `http_methods[0]`). Only affects plain endpoints — A2A-compliant and mcp/raw receivers always speak POST regardless.
Transparent payment proxy — facilitate + track a payment without settling it
$MeteredGET https://api.aidress.ai/pay/{agent_id}Relay a request to the agent's real endpoint, observing any payment in flight. Usage: point an x402 (or other rail) wallet client at `https://api.aidress.ai/pay/{agent_id}`. On the first call the agent answers 402 with its `payment-required`; we relay it back (rewriting `resource.url` to this same `/pay` URL so the retry loops through Aidress). The wallet signs and retries with `X-Payment`; we forward that to the agent, the agent settles, and we record the result in `transaction_records` (visible in `/ops/settlements`). Caller attribution comes only from a TRUSTED source, never a bare query param (that was the C2 framing hole — anyone could name a victim and cost them a real trust penalty). Two trusted sources, in order: 1. `?call_ref=` — the transaction_id minted by the AUTHENTICATED /call whose 402 produced this payment. Its calls row carries the caller_agent_id that /call already verified against the bearer key. This is what MCP/SDK use: call_agent returns pay_via with call_ref pre-filled, so the settlement inherits the real caller and the exchange becomes reviewable. 2. A caller that authenticates directly on /pay with a matching bearer key. An unauthenticated `?caller_agent_id=` with no call_ref is ignored (stays None). No funds touch Aidress at any point.
Transparent payment proxy — facilitate + track a payment without settling it
$MeteredPOST https://api.aidress.ai/pay/{agent_id}Relay a request to the agent's real endpoint, observing any payment in flight. Usage: point an x402 (or other rail) wallet client at `https://api.aidress.ai/pay/{agent_id}`. On the first call the agent answers 402 with its `payment-required`; we relay it back (rewriting `resource.url` to this same `/pay` URL so the retry loops through Aidress). The wallet signs and retries with `X-Payment`; we forward that to the agent, the agent settles, and we record the result in `transaction_records` (visible in `/ops/settlements`). Caller attribution comes only from a TRUSTED source, never a bare query param (that was the C2 framing hole — anyone could name a victim and cost them a real trust penalty). Two trusted sources, in order: 1. `?call_ref=` — the transaction_id minted by the AUTHENTICATED /call whose 402 produced this payment. Its calls row carries the caller_agent_id that /call already verified against the bearer key. This is what MCP/SDK use: call_agent returns pay_via with call_ref pre-filled, so the settlement inherits the real caller and the exchange becomes reviewable. 2. A caller that authenticates directly on /pay with a matching bearer key. An unauthenticated `?caller_agent_id=` with no call_ref is ignored (stays None). No funds touch Aidress at any point.
Pre-populate a registration from a domain's A2A agent card
$MeteredPOST https://api.aidress.ai/import-agentFetches /.well-known/agent-card.json from the given domain and maps the A2A card fields to an Aidress registration preview. Nothing is written to the DB — the caller reviews the preview, supplies the missing Aidress-specific fields, then POSTs the completed payload to /register.
Checks
reachable
valid
2026-10-09T09:00:50.035Z
No settlement evidence found in chain signals.
Gateway routing
Score ≥70/100 — Cleared attestation pass. Route via Gateway before pay.
Claim this listing to upgrade to Cleared attestation.
Claim listing