curl -X POST "https://api.credprotocol.com/api/v2/agents/18/reputation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
const response = await fetch('https://api.credprotocol.com/api/v2/agents/18/reputation', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
})
});
const data = await response.json();
console.log(`Submission ${data.submission_id} — status: ${data.status}`);
console.log(`Poll: ${data.status_url}`);
import requests
response = requests.post(
'https://api.credprotocol.com/api/v2/agents/18/reputation',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={'address': '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'}
)
data = response.json()
print(f"Submission {data['submission_id']} — status: {data['status']}")
print(f"Poll: {data['status_url']}")
{
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"agent_id": 18,
"status": "pending",
"estimated_completion_seconds": 45,
"status_url": "/api/v2/agents/18/reputation/status/550e8400-e29b-41d4-a716-446655440000",
"tags": ["creditScore", "sybilRisk", "identityCount"]
}
{
"detail": "address is required in the request body — the Ethereum address to score for this agent"
}
{
"detail": {
"error": "subject_consent_required",
"message": "Reputation can only be published about an address whose controller consented: the agent's own owner or agentWallet address, or a request signed in with a wallet token (dApp JWT) for that same address."
}
}
{
"detail": "Agent 999 does not exist in the Identity Registry"
}
{
"detail": {
"error": "reputation_recently_published",
"message": "Reputation for this agent and address was published (or is being published) within the last 7 days. Nothing was charged; retry after the window.",
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "confirmed",
"published_at": "2026-11-03T12:00:00+00:00",
"retry_after_seconds": 518400
}
}
{
"detail": {
"error": "wallet_publication_limit",
"message": "This wallet has published its 3 free reputation entries for this day (UTC). Retry after the window resets, or publish from the agent's own address with an API key.",
"limit": 3,
"window": "day",
"retry_after_seconds": 21600
}
}
Agents
Submit Reputation Feedback
Submit on-chain reputation feedback for an AI agent
POST
/
api
/
v2
/
agents
/
{agent_id}
/
reputation
curl -X POST "https://api.credprotocol.com/api/v2/agents/18/reputation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
const response = await fetch('https://api.credprotocol.com/api/v2/agents/18/reputation', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
})
});
const data = await response.json();
console.log(`Submission ${data.submission_id} — status: ${data.status}`);
console.log(`Poll: ${data.status_url}`);
import requests
response = requests.post(
'https://api.credprotocol.com/api/v2/agents/18/reputation',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={'address': '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'}
)
data = response.json()
print(f"Submission {data['submission_id']} — status: {data['status']}")
print(f"Poll: {data['status_url']}")
{
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"agent_id": 18,
"status": "pending",
"estimated_completion_seconds": 45,
"status_url": "/api/v2/agents/18/reputation/status/550e8400-e29b-41d4-a716-446655440000",
"tags": ["creditScore", "sybilRisk", "identityCount"]
}
{
"detail": "address is required in the request body — the Ethereum address to score for this agent"
}
{
"detail": {
"error": "subject_consent_required",
"message": "Reputation can only be published about an address whose controller consented: the agent's own owner or agentWallet address, or a request signed in with a wallet token (dApp JWT) for that same address."
}
}
{
"detail": "Agent 999 does not exist in the Identity Registry"
}
{
"detail": {
"error": "reputation_recently_published",
"message": "Reputation for this agent and address was published (or is being published) within the last 7 days. Nothing was charged; retry after the window.",
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "confirmed",
"published_at": "2026-11-03T12:00:00+00:00",
"retry_after_seconds": 518400
}
}
{
"detail": {
"error": "wallet_publication_limit",
"message": "This wallet has published its 3 free reputation entries for this day (UTC). Retry after the window resets, or publish from the agent's own address with an API key.",
"limit": 3,
"window": "day",
"retry_after_seconds": 21600
}
}
Overview
Computes Cred Protocol credit score, sybil risk, and identity attestations for the given address, then submits the results as on-chain feedback to the ERC-8004 Reputation Registry on Base.Subject consent
Published entries are permanent. An on-chain
giveFeedback entry and the feedback document pinned to IPFS can never be removed or edited. Cred therefore only publishes about an address whose controller consented.address in the body must be one of:
- The agent’s own address: the agent’s owner (
ownerOf) or its verifiedagentWalletin the Identity Registry. An agent publishing about itself; any payment method works. - The signed-in wallet: the request carries a dApp wallet token for that same address as its Bearer token (sign in with
/wallet/messageand/wallet/verify, see Authentication). The wallet owner publishes their own reputation; no Cred Units are charged.
subject_consent_required. The check runs before payment: an x402 or MPP payment is not settled and an API key is not charged for a refused submission. (Before November 2026 any address was accepted; integrations that published about third-party addresses must switch to one of the two forms above.)
What is published
The pinned document carries the score with its range and model version, the sybil score and risk level, and the identity attestation count. It does not carry the score decile, the score factors or the list of attestations. It also recordsconsent_basis (agent_self, wallet_owner or correction) and a correction_policy.
Corrections
If the address owner disputes an input to their score and the dispute is resolved as corrected, Cred publishes a superseding entry for every agent that has a creditScore entry about the address, at Cred’s cost. The earlier entry stays on-chain; the newer one replaces it for readers that take the latest entry.Limits
Republish window
A submission for the same agent and address that shares a requested tag with an entry published, still in flight, or skipped as unchanged within the last 7 days is refused with 409reputation_recently_published. The check runs before payment, like the consent check: x402 and MPP payments are not settled, API keys and MCP calls are not charged. The response names the earlier submission and when you may retry (retry_after_seconds, also sent as Retry-After). A failed earlier submission does not block, and corrections are never refused.
Free submissions per wallet
Submissions made with a wallet token are free to the caller while Cred pays the gas and the IPFS pin, so they are capped per subject address, across all agents: 3 per UTC day and 10 per UTC calendar month. Over the cap the endpoint returns 429wallet_publication_limit with the limit, the window (day or month) and retry_after_seconds (also sent as Retry-After). A refused request does not count toward the cap. Paid submissions about the agent’s own address and corrections are not capped.
Unchanged scores are not republished for free
A wallet-token submission whose published values (credit score, sybil score and identity count, for the tags requested) all equal the latest confirmed entry for the same agent ends with statusskipped_unchanged: nothing is pinned or sent on-chain, the status response names the entry it repeats in duplicate_of, and it does not count toward the cap. Paid submissions always publish a fresh, timestamped entry once the republish window has passed; corrections always publish.
The submission happens asynchronously — this endpoint returns immediately with a tracking ID. Use the status endpoint to poll for completion.
This endpoint costs 10 Cred Units per submission (covers computation + on-chain gas on Base).
Authentication
| Method | Header | Cost |
|---|---|---|
| API Token | Authorization: Bearer YOUR_API_KEY | 10 Cred Units (agent’s own address only) |
| x402 Payment | X-PAYMENT: <signed_payment> | $0.10 USDC (agent’s own address only) |
| MPP Payment | Authorization: Payment <credential> | $0.10 (agent’s own address only) |
| dApp wallet token | Authorization: Bearer <wallet JWT> | Free (the token’s own wallet only) |
Path Parameters
integer
required
ERC-8004 agent ID from the Identity Registry. Must be >= 1.
Request Body
string
required
The subject to score: the agent’s owner or
agentWallet, or the wallet of the dApp token sending the request (see Subject consent)array
Which feedback types to submit. Defaults to all three if omitted.Options:
creditScore, sybilRisk, identityCountFeedback Tags
| Tag | Description | Value Range |
|---|---|---|
creditScore | Andromeda credit score | 300–1000 |
sybilRisk | Sybil detection risk score | 0 (human) – 100 (bot) |
identityCount | Number of verified identity attestations | 0+ |
Response
Returns HTTP 202 Accepted with a tracking ID.string
UUID tracking this submission
integer
The ERC-8004 agent ID
string
Initial status (always
pending)integer
Estimated time to on-chain confirmation (typically ~45 seconds)
string
Relative URL to poll for submission status
array
Feedback types being submitted
curl -X POST "https://api.credprotocol.com/api/v2/agents/18/reputation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
const response = await fetch('https://api.credprotocol.com/api/v2/agents/18/reputation', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
})
});
const data = await response.json();
console.log(`Submission ${data.submission_id} — status: ${data.status}`);
console.log(`Poll: ${data.status_url}`);
import requests
response = requests.post(
'https://api.credprotocol.com/api/v2/agents/18/reputation',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={'address': '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'}
)
data = response.json()
print(f"Submission {data['submission_id']} — status: {data['status']}")
print(f"Poll: {data['status_url']}")
{
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"agent_id": 18,
"status": "pending",
"estimated_completion_seconds": 45,
"status_url": "/api/v2/agents/18/reputation/status/550e8400-e29b-41d4-a716-446655440000",
"tags": ["creditScore", "sybilRisk", "identityCount"]
}
{
"detail": "address is required in the request body — the Ethereum address to score for this agent"
}
{
"detail": {
"error": "subject_consent_required",
"message": "Reputation can only be published about an address whose controller consented: the agent's own owner or agentWallet address, or a request signed in with a wallet token (dApp JWT) for that same address."
}
}
{
"detail": "Agent 999 does not exist in the Identity Registry"
}
{
"detail": {
"error": "reputation_recently_published",
"message": "Reputation for this agent and address was published (or is being published) within the last 7 days. Nothing was charged; retry after the window.",
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "confirmed",
"published_at": "2026-11-03T12:00:00+00:00",
"retry_after_seconds": 518400
}
}
{
"detail": {
"error": "wallet_publication_limit",
"message": "This wallet has published its 3 free reputation entries for this day (UTC). Retry after the window resets, or publish from the agent's own address with an API key.",
"limit": 3,
"window": "day",
"retry_after_seconds": 21600
}
}
Submission Lifecycle
The submission progresses through these statuses:| Status | Description |
|---|---|
pending | Submission received, queued for processing |
scoring | Computing credit score, sybil risk, and identity attestations |
uploading | Uploading feedback JSON to IPFS |
submitting | Sending giveFeedback transaction to Base |
confirmed | Transaction confirmed on-chain |
failed | An error occurred (check the error field) |
skipped_unchanged | Free submission with the same values as the latest confirmed entry; nothing published (see duplicate_of) |
Performance
- Response Time: Immediate (HTTP 202)
- End-to-End Completion: ~45 seconds (scoring + IPFS upload + on-chain confirmation)