Skip to content

Error Codes Reference

Error Codes Reference

This document provides a complete runbook-style reference for all error, warning, and info codes used by 8004scan's parsing system. Each code has a unique anchor for direct linking (e.g., #EA001).

Overview

Code Format

All error codes follow the format <Severity><Object><Number>:

ComponentValuesDescription
SeverityE W IError (critical), Warning (non-critical), Info (recommendation)
ObjectA FAgent metadata, Feedback data
Number001-999Sequence number within category

Severity Levels

LevelRFC 2119Parse ResultUser Action
Error (E)MUST fixParse fails, agent not indexedRequired to index agent
Warning (W)SHOULD fixParse succeeds with issuesRecommended to fix
Info (I)MAY fixParse succeedsOptional improvement

Linking to Error Codes

Each error code can be directly linked:

text
https://best-practices.8004scan.io/docs/implementation/error-codes.html#EA001
https://best-practices.8004scan.io/docs/implementation/error-codes.html#WA070

Field Name Migration Note

Important: As of January 2026, the official EIP-8004 specification uses services instead of endpoints for the top-level array field in agent metadata. However:

  • Error codes referencing endpoints: Still valid - parsers must support both field names for backward compatibility
  • Example code below: Updated to use services (current best practice)
  • Legacy field support: The endpoints field name will continue to work, triggering warning code WA031

See Agent Metadata Standard - Field Migration for complete details.


Agent Errors (EA001-EA099)

Critical issues that prevent agent metadata parsing. These MUST be fixed for the agent to be indexed.


EA001

Empty or invalid URI

PropertyValue
CodeEA001
SeverityError
FieldagentURI
Parse ResultFails
ERC-8004 ReferencetokenURI() function (ERC-721 interface)

Description

The agent's metadata URI is empty, null, or not a valid string. Without a valid URI, there is no metadata to parse.

Common Causes

  1. Agent registered without metadata: The register() transaction was called but no agentURI was set
  2. Subgraph sync issue: The subgraph returned null for tokenURI
  3. Contract misconfiguration: Custom registry doesn't implement ERC-721 metadata interface correctly

Diagnostic Steps

  1. Check the on-chain tokenURI(tokenId) return value:

    solidity
    // Etherscan > Read Contract > tokenURI
    tokenURI(123) // Should return a valid URI string
  2. Verify the agent was registered:

    solidity
    ownerOf(tokenId) // Should return a valid address
  3. Check subgraph indexing status at the Graph Explorer

Resolution

Option 1: Set the agentURI on-chain (if contract supports it):

solidity
registry.setAgentURI(tokenId, "ipfs://Qm...");

Option 2: Re-register the agent with a valid URI

Option 3: If using a custom registry, ensure it implements:

solidity
function tokenURI(uint256 tokenId) external view returns (string memory);

Example API Response

json
{
  "parse_status": {
    "status": "error",
    "errors": [
      {
        "code": "EA001",
        "field": "agentURI",
        "message": "Empty or invalid URI: null"
      }
    ]
  }
}

EA002

Invalid JSON syntax

PropertyValue
CodeEA002
SeverityError
FieldagentURI
Parse ResultFails
ERC-8004 ReferenceAgent metadata MUST be valid JSON

Description

The metadata content fetched from the URI is not valid JSON. The parser cannot extract any agent information.

Common Causes

  1. Malformed JSON: Syntax errors like missing quotes, trailing commas, or unescaped characters
  2. HTML error page: Server returned an error page instead of JSON (e.g., 404, 500)
  3. Encoding corruption: Character encoding issues corrupted the JSON structure
  4. Truncated response: Network issues caused incomplete data transfer

Diagnostic Steps

  1. Fetch the URI content manually:

    bash
    curl -s "https://your-agent-uri.com/metadata.json" | jq .
  2. Validate JSON syntax:

    bash
    curl -s "https://..." | python -m json.tool
  3. Check Content-Type header:

    bash
    curl -I "https://..." | grep -i content-type
    # Expected: application/json

Resolution

  1. Fix JSON syntax: Use a JSON linter (jsonlint.com, VSCode)
  2. Check server configuration: Ensure server returns Content-Type: application/json
  3. Escape special characters: In data URIs, ensure proper escaping
  4. Re-upload to IPFS: If content was corrupted, re-upload the correct JSON

Valid JSON Example

json
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "My Agent",
  "description": "Agent description"
}

Common JSON Errors

json
// ❌ Trailing comma (invalid)
{ "name": "Agent", }

// ❌ Single quotes (invalid)
{ 'name': 'Agent' }

// ❌ Unquoted keys (invalid)
{ name: "Agent" }

// ❌ Unescaped newlines in strings (invalid)
{ "description": "Line 1
Line 2" }

EA003

Invalid base64 encoding

PropertyValue
CodeEA003
SeverityError
FieldagentURI
Parse ResultFails
ReferenceRFC 4648 (Base64 Data Encodings)

Description

The data URI claims to be base64-encoded (data:application/json;base64,...) but contains invalid base64 characters or incorrect padding.

Common Causes

  1. Incorrect padding: Base64 strings must be padded with = to make length a multiple of 4
  2. Invalid characters: Non-base64 characters (anything outside A-Z, a-z, 0-9, +, /)
  3. Whitespace: Line breaks or spaces within the encoded string
  4. URL-safe encoding mismatch: Using URL-safe base64 (-_) with standard decoder

Diagnostic Steps

  1. Extract and test the base64 portion:

    bash
    # Extract base64 content (after the comma)
    echo "eyJ0eXBlIjoi..." | base64 -d
  2. Check for invalid characters:

    bash
    echo "eyJ0eXBlIjoi..." | grep -P '[^A-Za-z0-9+/=]'
  3. Verify padding:

    python
    import base64
    data = "eyJ0eXBlIjoi..."
    # Should have length divisible by 4 (with padding)
    print(len(data) % 4)  # Should be 0

Resolution

  1. Re-encode correctly:

    python
    import base64
    import json
    
    metadata = {"type": "...", "name": "..."}
    encoded = base64.b64encode(json.dumps(metadata).encode()).decode()
    data_uri = f"data:application/json;base64,{encoded}"
  2. Remove whitespace: Ensure no line breaks in the encoded string

  3. Fix padding: Add = characters if needed:

    python
    # Fix padding
    data = data + '=' * (4 - len(data) % 4) if len(data) % 4 else data

Example

text
# ✅ Valid base64 data URI
data:application/json;base64,eyJ0eXBlIjoiaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBzL2VpcC04MDA0I3JlZ2lzdHJhdGlvbi12MSIsIm5hbWUiOiJUZXN0In0=

# ❌ Invalid (contains spaces)
data:application/json;base64,eyJ0eXBl Ijoi...

# ❌ Invalid (missing padding)
data:application/json;base64,eyJ0eXBlIjoiaHR0cHM6Ly9laXBz

EA004

Decompression security error (possible zip bomb)

PropertyValue
CodeEA004
SeverityError
FieldagentURI
Parse ResultFails
SecurityZip bomb protection

Description

The compressed data would decompress to more than 100KB, which is rejected as a security measure against zip bomb attacks.

Why This Limit Exists

A zip bomb is a malicious compressed file designed to crash or overwhelm systems when decompressed. A small compressed file (few KB) can expand to gigabytes or terabytes of data.

Common Causes

  1. Actual attack: Malicious agent attempting to DoS the indexer
  2. Excessive metadata: Agent metadata far exceeds reasonable size
  3. Embedded large data: Binary data (images) embedded in JSON

Resolution

  1. Reduce metadata size: Agent metadata should typically be 1-10KB

  2. Use external references: Store large data (images, files) externally:

    json
    {
      "image": "ipfs://Qm...", // ✅ External reference
      "image": "data:image/png;base64,..." // ❌ Embedded (large)
    }
  3. Use IPFS/HTTP for large metadata: Instead of data URI compression

Size Guidelines

ContentRecommended Max Size
Total metadata JSON50KB
Compressed data URI20KB
Decompressed limit100KB (hard limit)

EA005

Decompression failed

PropertyValue
CodeEA005
SeverityError
FieldagentURI
Parse ResultFails
ReferenceData URI Compression Extension

Description

The compressed data could not be decompressed with the specified algorithm. The enc= parameter doesn't match the actual compression format.

Supported Algorithms

AlgorithmParameterLibrary
Zstandardenc=zstdzstandard
Gzipenc=gzipgzip
Brotlienc=brbrotli
LZ4enc=lz4lz4

Common Causes

  1. Algorithm mismatch: URI says enc=zstd but data is gzip-compressed
  2. Corrupted data: Compression stream was truncated or corrupted
  3. Double compression: Data was compressed twice
  4. Unsupported format: Using an algorithm not in the supported list

Diagnostic Steps

  1. Check the declared algorithm:

    text
    data:application/json;enc=zstd;base64,...
                          ^^^^^^^^
  2. Try decompressing with different algorithms:

    python
    import zstandard, gzip, brotli
    
    # Test each algorithm
    try:
        zstandard.ZstdDecompressor().decompress(data)
    except:
        pass

Resolution

  1. Verify algorithm: Ensure enc= matches actual compression
  2. Re-compress: Create a fresh compressed data URI
  3. Test locally: Verify decompression works before deploying

Example

python
import zstandard as zstd
import base64
import json

# Correct compression
metadata = {"type": "...", "name": "..."}
json_bytes = json.dumps(metadata).encode()

cctx = zstd.ZstdCompressor()
compressed = cctx.compress(json_bytes)
encoded = base64.b64encode(compressed).decode()

data_uri = f"data:application/json;enc=zstd;base64,{encoded}"

EA006

Unsupported URI format

PropertyValue
CodeEA006
SeverityError
FieldagentURI
Parse ResultFails
ERC-8004 ReferenceURI format flexibility

Description

The URI scheme is not recognized or supported by the parser.

Supported URI Formats

FormatExampleNotes
IPFSipfs://Qm...Content-addressed, immutable
Arweavear://...Permanent storage
HTTPShttps://...Standard web URL
HTTPhttp://...⚠️ Insecure, not recommended
Data URI (base64)data:application/json;base64,...Inline, immutable
Data URI (plain)data:application/json,...Inline, URL-encoded

Common Unsupported Formats

text
# ❌ Unsupported schemes
ftp://example.com/metadata.json
file:///local/path/metadata.json
custom://my-protocol/metadata

# ❌ Malformed URIs
//example.com/metadata.json  (missing scheme)
example.com/metadata.json    (missing scheme)

Resolution

Convert to a supported format:

json
// ✅ IPFS (recommended for immutability)
"ipfs://bafkreiabc123..."

// ✅ HTTPS (easy to update)
"https://api.myagent.com/metadata.json"

// ✅ Data URI (fully onchain)
"data:application/json;base64,eyJ0eXBlIjoi..."

EA007

IPFS fetch failed

PropertyValue
CodeEA007
SeverityError
FieldagentURI
Parse ResultFails
Gateways Triedipfs.io, cloudflare-ipfs.com, gateway.pinata.cloud

Description

Failed to fetch content from all IPFS gateways. The content may not be pinned or available.

Common Causes

  1. Content not pinned: The CID exists but no node is serving it
  2. Gateway timeout: All gateways timed out (>10s each)
  3. Invalid CID: The CID format is incorrect
  4. Network issues: Temporary gateway unavailability

Diagnostic Steps

  1. Test CID accessibility:

    bash
    # Try multiple gateways
    curl -I "https://ipfs.io/ipfs/YOUR_CID"
    curl -I "https://cloudflare-ipfs.com/ipfs/YOUR_CID"
    curl -I "https://gateway.pinata.cloud/ipfs/YOUR_CID"
  2. Verify CID format:

    bash
    # CIDv0 starts with Qm (46 chars)
    # CIDv1 starts with bafy... or bafk...
  3. Check pinning status on your pinning service dashboard

Resolution

  1. Pin content: Use a pinning service (Pinata, Infura, web3.storage)

    bash
    # Using Pinata CLI
    pinata pin ./metadata.json
  2. Verify pinning: Check that at least one gateway can serve the content

  3. Consider alternatives: For critical agents, also host on HTTPS as backup

ServiceFree TierNotes
Pinata1GBPopular, reliable
web3.storage5GBFilecoin-backed
InfuraLimitedEnterprise-grade
Filebase5GBMulti-protocol

EA008

HTTP fetch failed

PropertyValue
CodeEA008
SeverityError
FieldagentURI
Parse ResultFails
Timeout10 seconds

Description

Failed to fetch content from the HTTP/HTTPS URL. Server may be down, URL may be invalid, or there may be SSL/TLS issues.

Common Causes

  1. Server unavailable: 5xx errors, server down
  2. Resource not found: 404 error
  3. SSL certificate issues: Expired or invalid certificate
  4. Timeout: Server didn't respond within 10 seconds
  5. CORS/Access issues: Server blocks requests from indexer IP

Diagnostic Steps

  1. Test URL accessibility:

    bash
    curl -v "https://your-url.com/metadata.json"
  2. Check HTTP status:

    bash
    curl -I "https://your-url.com/metadata.json"
    # Should return: HTTP/2 200
  3. Verify SSL certificate:

    bash
    openssl s_client -connect your-url.com:443 -servername your-url.com

Resolution

  1. Fix server issues: Ensure server is running and healthy
  2. Verify URL: Check for typos, ensure path is correct
  3. Fix SSL: Renew certificate, ensure proper chain
  4. Use CDN: For better reliability and global availability
  5. Consider IPFS: For immutable, decentralized hosting
PracticeBenefit
Use HTTPSSecurity, required for most use cases
Use CDNReliability, speed
Set proper headersContent-Type: application/json
Monitor uptimeDetect issues early

EA009

Arweave fetch failed

PropertyValue
CodeEA009
SeverityError
FieldagentURI
Parse ResultFails
Gatewayarweave.net

Description

Failed to fetch content from Arweave gateway. Transaction may not be confirmed or ID may be invalid.

Common Causes

  1. Transaction not confirmed: Arweave transactions can take minutes to hours
  2. Invalid transaction ID: Typo or incorrect format
  3. Gateway issues: Temporary unavailability

Diagnostic Steps

  1. Check transaction status:

    bash
    curl "https://arweave.net/tx/YOUR_TX_ID/status"
  2. Try fetching content:

    bash
    curl "https://arweave.net/YOUR_TX_ID"

Resolution

  1. Wait for confirmation: New transactions need time to propagate
  2. Verify transaction ID: Check for typos
  3. Use alternative gateway: https://ar-io.net/YOUR_TX_ID

EA010

Non-dict metadata root

PropertyValue
CodeEA010
SeverityError
FieldagentURI
Parse ResultFails
ERC-8004 ReferenceMetadata MUST be a JSON object

Description

The parsed JSON is not an object (dict). ERC-8004 metadata must be a JSON object with key-value pairs, not an array or primitive value.

Common Causes

  1. Array instead of object: [{"name": "..."}] instead of {"name": "..."}
  2. Primitive value: Just a string "hello" or number 123
  3. Null value: The JSON is literally null

Resolution

Ensure metadata is a JSON object:

json
// ❌ Invalid: Array
[{"name": "Agent", "description": "..."}]

// ❌ Invalid: Primitive
"Agent metadata"

// ✅ Valid: Object
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "Agent",
  "description": "..."
}

Agent Warnings (WA001-WA099)

Issues that don't prevent parsing but may affect functionality or interoperability. These SHOULD be fixed.


WA001

Missing required field: type

PropertyValue
CodeWA001
SeverityWarning
Fieldtype
Parse ResultSucceeds
ERC-8004 ComplianceSHOULD (recommended)

Description

The type field is missing from metadata. This field identifies the metadata schema version and helps parsers understand the format.

ERC-8004 Specification

Per the Agent Metadata Profile:

The type field is SHOULD (recommended) for schema identification. Omitting it reduces interoperability with explorers and tools.

Impact

  • Explorers may not recognize the metadata format
  • Schema validation may fail
  • Future compatibility issues if format changes

Resolution

Add the type field:

json
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "My Agent",
  "description": "..."
}

API Response Example

json
{
  "parse_status": {
    "status": "warning",
    "warnings": [
      {
        "code": "WA001",
        "field": "type",
        "message": "Missing required field: type"
      }
    ]
  }
}

WA002

Invalid type field value

PropertyValue
CodeWA002
SeverityWarning
Fieldtype
Parse ResultSucceeds
Expected Valuehttps://eips.ethereum.org/EIPS/eip-8004#registration-v1

Description

The type field exists but doesn't match the expected ERC-8004 schema URL.

Resolution

Use the standard type value:

json
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1"
}

WA003

Missing required field: name

PropertyValue
CodeWA003
SeverityWarning
Fieldname
Parse ResultSucceeds
ERC-8004 ComplianceSHOULD (recommended)

Description

The name field is missing. This is a SHOULD field per ERC-8004 and is essential for agent display in explorers.

Impact

  • Agent displays as "Unknown" or "Unnamed" in explorers
  • Poor user experience when browsing agents
  • Reduced discoverability

Resolution

json
{
  "name": "My Agent Name"
}

Best Practices

PracticeExample
Be descriptive"DataAnalyst Pro" ✅
Avoid generic"Agent #123" ❌
Keep it short3-50 characters

WA004

Missing required field: description

PropertyValue
CodeWA004
SeverityWarning
Fielddescription
Parse ResultSucceeds
ERC-8004 ComplianceSHOULD (recommended)

Description

The description field is missing. Users won't understand what your agent does.

Resolution

json
{
  "description": "A specialized AI agent that performs advanced data analysis on blockchain transactions, providing insights and anomaly detection."
}

WA005

Invalid image URL format

PropertyValue
CodeWA005
SeverityWarning
Fieldimage
Parse ResultSucceeds
ERC-8004 ComplianceSHOULD use absolute URI

Description

The image field contains a URL that doesn't start with a valid scheme.

Valid Schemes

SchemeExample
https://https://cdn.example.com/logo.png
http://http://example.com/logo.png (⚠️ insecure)
ipfs://ipfs://Qm.../logo.png
ar://ar://tx_id
data:data:image/png;base64,...

Invalid Examples

json
// ❌ Invalid: relative path
{ "image": "/images/logo.png" }

// ❌ Invalid: missing scheme
{ "image": "www.example.com/logo.png" }

// ❌ Invalid: local file
{ "image": "file:///path/to/logo.png" }

Resolution

Use an absolute URL with a valid scheme:

json
{ "image": "https://cdn.example.com/agents/logo.png" }

WA006

endpoints field is not an array

PropertyValue
CodeWA006
SeverityWarning
Fieldendpoints
Parse ResultSucceeds
ERC-8004 ComplianceMUST be array if present

Description

The endpoints (or services) field exists but is not an array.

Resolution

json
{
  "services": [
    { "name": "MCP", "endpoint": "https://..." },
    { "name": "A2A", "endpoint": "https://..." }
  ]
}

WA007

Endpoint object is not valid

PropertyValue
CodeWA007
SeverityWarning
Fieldendpoints
Parse ResultSucceeds

Description

An item in the endpoints (or services) array is not an object.

Resolution

Each service must be an object:

json
{
  "services": [
    { "name": "MCP", "endpoint": "https://..." } // ✅ Object
  ]
}

WA008

Missing endpoint URL field

PropertyValue
CodeWA008
SeverityWarning
Fieldendpoints
Parse ResultSucceeds

Description

An endpoint object is missing the endpoint field (the actual URL).

Resolution

json
{
  "name": "MCP",
  "endpoint": "https://your-agent.com/mcp" // Required
}

WA009

Empty endpoint URL value

PropertyValue
CodeWA009
SeverityWarning
Fieldendpoints
Parse ResultSucceeds

Description

An endpoint has an empty string "" for the endpoint field.

Impact

Clients won't be able to connect to this endpoint.


WA010

registrations field is not an array

PropertyValue
CodeWA010
SeverityWarning
Fieldregistrations
Parse ResultSucceeds

Description

The registrations field exists but is not an array.


WA011

Registration object is not valid

PropertyValue
CodeWA011
SeverityWarning
Fieldregistrations
Parse ResultSucceeds

Description

An item in the registrations array is not an object.


WA012

Missing agentRegistry field

PropertyValue
CodeWA012
SeverityWarning
Fieldregistrations
Parse ResultSucceeds
ERC-8004 ComplianceMUST if registrations present

Description

A registration is missing the required agentRegistry field.

Resolution

json
{
  "registrations": [
    {
      "agentId": 1,
      "agentRegistry": "eip155:84532:0x8004a6090Cd10A7288092483047B097295Fb8847"
    }
  ]
}

WA013

Invalid agentRegistry format (should be CAIP-2)

PropertyValue
CodeWA013
SeverityWarning
Fieldregistrations
Parse ResultSucceeds
ReferenceCAIP-2 Specification

Description

The agentRegistry field is not in CAIP-2 format.

Expected Format

text
{namespace}:{chainId}:{contractAddress}

Examples

ChainCAIP-2 Format
Ethereum Mainneteip155:1:0x8004a6090Cd10A7288092483047B097295Fb8847
Base Sepoliaeip155:84532:0x8004a6090Cd10A7288092483047B097295Fb8847
Arbitrum Oneeip155:42161:0x8004a6090Cd10A7288092483047B097295Fb8847

WA014

supportedTrust field is not an array

PropertyValue
CodeWA014
SeverityWarning
FieldsupportedTrust
Parse ResultSucceeds

Description

The supportedTrust field exists but is not an array.


WA015

active field is not boolean

PropertyValue
CodeWA015
SeverityWarning
Fieldactive
Parse ResultSucceeds

Description

The active field should be a boolean (true or false), not a string or number.

Resolution

json
{
  "active": true // ✅ Boolean
}
json
{
  "active": "true" // ❌ String
}

WA016

x402Support field is not boolean

PropertyValue
CodeWA016
SeverityWarning
Fieldx402Support
Parse ResultSucceeds

Description

The x402Support field should be a boolean.


WA020

Found 'endpoint' (singular), should be 'endpoints'

PropertyValue
CodeWA020
SeverityWarning
Fieldendpoint
Parse ResultSucceeds
TypeCommon typo detection

Description

The field endpoint (singular) was found but the spec uses services (or legacy endpoints) (plural).

Resolution

Rename endpoint to services and ensure it's an array:

json
{
  "services": [...]  // ✅ Plural, array
}

WA021

Found 'registration' (singular), should be 'registrations'

PropertyValue
CodeWA021
SeverityWarning
Fieldregistration
Parse ResultSucceeds
TypeCommon typo detection

Description

The field registration (singular) was found but the spec uses registrations (plural).


WA030

agentWallet must be CAIP-10 format

PropertyValue
CodeWA030
SeverityWarning
FieldagentWallet
Parse ResultSucceeds
ReferenceCAIP-10 Specification

Description

The agentWallet endpoint is not in CAIP-10 format.

Expected Format

text
{namespace}:{chainId}:{address}

Example

json
{
  "name": "agentWallet",
  "endpoint": "eip155:1:0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb7"
}

WA031

Using legacy 'endpoints' field (recommend migrating to 'services')

PropertyValue
CodeWA031
SeverityWarning
Fieldendpoints
Parse ResultSucceeds
ERC-8004 ComplianceLegacy field name (still supported)
AddedJan 2026 (EIP-8004 field name migration)

Description

The agent metadata uses the legacy endpoints field name instead of the current services field name. While both are supported for backward compatibility, services is the official field name per EIP-8004 January 2026 update.

Background

In January 2026, the official EIP-8004 specification updated the field name from endpoints to services to better align with industry terminology. The change only affects the top-level array field name; individual service objects still use the endpoint property for their URLs.

Impact

  • Parsing: No impact - metadata parses successfully
  • Compatibility: Full backward compatibility maintained
  • Recommendation: Migrate to services for consistency with current spec

Resolution

Update the field name from endpoints to services:

diff
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "My Agent",
-  "endpoints": [
+  "services": [
    {
      "name": "MCP",
      "endpoint": "https://mcp.myagent.com",
      "version": "2025-06-18"
    }
  ]
}

Important: Only the array field name changes. Individual service object properties remain unchanged:

  • "endpoint" property within service objects - Correct (unchanged)
  • "services" top-level array field - Recommended (new name)
  • ⚠️ "endpoints" top-level array field - Legacy (triggers WA031)

Migration Timeline

PhaseDateStatus
Spec UpdatedJan 2026✅ Complete
Parser SupportJan 2026✅ Complete (supports both)
Deprecation TimelineTBDNo immediate deprecation planned

Note: There is no immediate deprecation timeline. Both services and endpoints will be supported indefinitely. This warning is purely informational to encourage migration to the current spec.

See Also


WA050

base64 URI contains plain JSON (malformed)

PropertyValue
CodeWA050
SeverityWarning
FieldagentURI
Parse ResultSucceeds
TypeMalformed data URI

Description

The URI declares ;base64 encoding but the content is actually plain JSON.

Example

text
# ❌ Claims base64 but content is plain JSON
data:application/json;base64,{"name":"Agent"}

# ✅ Either remove ;base64
data:application/json,{"name":"Agent"}

# ✅ Or actually base64-encode
data:application/json;base64,eyJuYW1lIjoiQWdlbnQifQ==

WA051

Non-standard base64 data URI format

PropertyValue
CodeWA051
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The data URI uses a non-standard format but was successfully parsed.

Standard Format

text
data:application/json;base64,<base64-data>

WA052

Non-standard plain data URI format

PropertyValue
CodeWA052
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The plain data URI uses a non-standard format.

Standard Format

text
data:application/json,<json-data>

WA053

Plain JSON without URI scheme

PropertyValue
CodeWA053
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The metadata appears to be raw JSON without a URI scheme.

Resolution

Wrap in a data URI:

text
data:application/json,{"name":"Agent",...}

WA054

UTF-8 decode error in base64 content

PropertyValue
CodeWA054
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The base64-decoded content is not valid UTF-8.

Resolution

Ensure your JSON is UTF-8 encoded before base64 encoding.


WA055

Invalid JSON in base64 content

PropertyValue
CodeWA055
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The base64-decoded content is not valid JSON.


WA056

Invalid JSON in plain data URI

PropertyValue
CodeWA056
SeverityWarning
FieldagentURI
Parse ResultSucceeds

Description

The plain data URI content is not valid JSON.


WA070

Metadata content does not match on-chain agentHash

PropertyValue
CodeWA070
SeverityWarning
FieldagentHash
Parse ResultSucceeds
ReferenceagentHash Extension

Description

The computed hash of the metadata doesn't match the agentHash stored on-chain via the registry's setMetadata() function.

What This Means

  • The metadata content has changed since the owner set the hash
  • For HTTP/HTTPS URIs, this could indicate content tampering
  • Owner may have updated metadata but forgot to update the hash

8004scan Extension

This uses the agentHash on-chain metadata key, which is an 8004scan-recommended extension for HTTP/HTTPS URI integrity verification.

solidity
// Set agentHash on-chain
bytes32 hash = keccak256(abi.encodePacked(canonicalJson));
registry.setMetadata(agentId, "agentHash", abi.encode(hash));

Resolution

  1. If you updated metadata intentionally: Update the on-chain hash

  2. If you didn't update: Investigate potential content modification

  3. Compute new hash:

    python
    import json
    from web3 import Web3
    
    metadata = {...}
    canonical = json.dumps(metadata, sort_keys=True, separators=(',', ':'))
    hash = Web3.keccak(text=canonical).hex()

API Response Example

json
{
  "parse_status": {
    "warnings": [
      {
        "code": "WA070",
        "field": "agentHash",
        "message": "Metadata content does not match on-chain agentHash",
        "expected_hash": "0x1234567890ab...",
        "actual_hash": "0xabcdef123456..."
      }
    ]
  }
}

WA071

Metadata content has changed since last sync

PropertyValue
CodeWA071
SeverityWarning
Field_contentIntegrity
Parse ResultSucceeds
TypeBackend change detection

Description

The metadata content differs from the previously indexed version. This is a backend integrity check, not an ERC-8004 spec field.

What This Means

For HTTP/HTTPS URIs, the content at the URL has changed since the last sync.

Note

This is expected if you intentionally updated your metadata. The warning helps detect unintended changes.


WA080

Conflict between on-chain and off-chain metadata

PropertyValue
CodeWA080
SeverityWarning
FieldVariable (e.g., agent_wallet)
Parse ResultSucceeds (using higher-priority value)
TypeMetadata conflict

Description

On-chain metadata (from MetadataSet events) conflicts with off-chain metadata (from AgentURI JSON). The values are different, and the on-chain value takes precedence.

What This Means

You have set different values for the same field in:

  • On-chain: setMetadata(agentId, "agentWallet", ...)
  • Off-chain: AgentURI JSON file

Common Causes

  1. Metadata not synchronized: Updated on-chain but not off-chain (or vice versa)
  2. Migration in progress: Moving from off-chain to on-chain metadata
  3. Accidental override: Unintentionally set a conflicting value

Resolution

Choose one authoritative source and update the other to match:

Option 1: Use on-chain metadata (recommended)

solidity
// On-chain metadata takes precedence automatically
// Update off-chain JSON to match:
{
  "agentWallet": "eip155:1:0x..."  // Match on-chain value
}

Option 2: Use off-chain metadata

solidity
// Clear on-chain metadata
registry.setMetadata(agentId, "agentWallet", "0x");  // Empty value

Note

This warning indicates data inconsistency, not a critical error. The agent will be indexed successfully using the on-chain value.


WA081

Contract state conflicts with on-chain metadata

PropertyValue
CodeWA081
SeverityWarning
FieldVariable (e.g., agent_wallet)
Parse ResultSucceeds (using contract state value)
TypeMetadata conflict

Description

Contract state (from getter functions like agentWallet()) conflicts with on-chain metadata (from MetadataSet events). The values are different, and the contract state takes precedence.

What This Means

The contract's authoritative state differs from the indexed metadata:

  • Contract state: agentWallet() getter returns value A
  • On-chain metadata: setMetadata("agentWallet", value B)

Common Causes

  1. Stale metadata: On-chain metadata not updated after contract state change
  2. Indexing issue: Subgraph returned outdated contract state
  3. Empty metadata value: Metadata set to 0x (empty) but contract has valid value

Resolution

Most Common: Empty metadata value (not a real conflict)

solidity
// If you see this with offchain_value: ""
// This is likely an empty value issue (fixed in latest parser)
// No action needed - contract state is correct

If real conflict exists:

solidity
// Update on-chain metadata to match contract state
bytes memory value = abi.encode(contractState);
registry.setMetadata(agentId, "agentWallet", value);

Note

Contract state is the highest priority source. This warning helps identify data inconsistencies but doesn't affect agent indexing.

See Onchain Metadata Handling for complete merging algorithm.


WA082

agentWallet in on-chain metadata is deprecated (REMOVED)

PropertyValue
CodeWA082
StatusREMOVED (Feb 2026)
SeverityWarning N/A
FieldagentWallet
AddedJan 2026 (ERC-8004 v2)
RemovedFeb 2026

Description

This error code has been removed and is no longer generated.

The original description was incorrect. After reviewing the ERC-8004 contract implementation:

solidity
// In IdentityRegistryUpgradeable.sol:
// setMetadata() explicitly FORBIDS setting agentWallet
require(keccak256(bytes(metadataKey)) != RESERVED_AGENT_WALLET_KEY_HASH, "reserved key");

// setAgentWallet() stores the wallet in _metadata (on-chain storage)
$._metadata[agentId]["agentWallet"] = abi.encodePacked(newWallet);
emit MetadataSet(agentId, "agentWallet", "agentWallet", abi.encodePacked(newWallet));

Key insight: The setAgentWallet() function itself stores the wallet address in on-chain metadata (_metadata mapping) and emits a MetadataSet event. Therefore:

  • agentWallet appearing in on-chain metadata (from MetadataSet events) is the correct behavior
  • It's impossible to set agentWallet via setMetadata() - the contract rejects it as a reserved key
  • The only way to set agentWallet on-chain is via setAgentWallet() or during register()

Why This Was Removed

The parser was incorrectly flagging all agents with on-chain agentWallet as using deprecated functionality, when in fact they were using the contract correctly via setAgentWallet().

See Also

  • WA083: Still valid - flags agentWallet in off-chain metadata (agentURI JSON), which IS deprecated

WA083

agentWallet in off-chain metadata is deprecated

PropertyValue
CodeWA083
SeverityWarning
FieldagentWallet
Parse ResultSucceeds
TypeDeprecated field usage
AddedJan 2026 (ERC-8004 v2)

Description

The agent has agentWallet in the off-chain metadata (agentURI content). In ERC-8004 v2, agentWallet should only be set on-chain via the setAgentWallet() function.

What This Means

Off-chain agentWallet declarations are now treated as discovery hints only. The authoritative value is always the contract state set via setAgentWallet().

Resolution

  1. Remove agentWallet field from your agent metadata JSON
  2. Ensure wallet is set on-chain via setAgentWallet()
diff
{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "My Agent",
- "agentWallet": "eip155:1:0x742d35Cc...",
  "services": [...]
}

Note

The off-chain value is ignored for payment purposes. Contract state is authoritative.


Agent Info (IA001-IA099)

Recommendations and best practices. These MAY be addressed but are not required.


IA001

PropertyValue
CodeIA001
SeverityInfo
Fieldimage
Parse ResultSucceeds
ERC-8004 ComplianceMAY (optional)

Description

The image field is not present. Agents without images display with a default placeholder.

Resolution

json
{
  "image": "ipfs://Qm.../logo.png"
}

IA002

Missing endpoints array (agent won't be reachable)

PropertyValue
CodeIA002
SeverityInfo
Fieldendpoints
Parse ResultSucceeds

Description

No endpoints array defined. Clients cannot connect to this agent.


IA003

Empty endpoints array (agent won't be reachable)

PropertyValue
CodeIA003
SeverityInfo
Fieldendpoints
Parse ResultSucceeds

Description

The endpoints array exists but is empty.


IA004

PropertyValue
CodeIA004
SeverityInfo
Fieldregistrations
Parse ResultSucceeds

Description

No registrations array. Explorers can't verify the bidirectional link between metadata and on-chain identity.


IA005

PropertyValue
CodeIA005
SeverityInfo
Fieldregistrations
Parse ResultSucceeds

Description

The registrations array exists but is empty.


IA006

Missing agentId (expected for first-time deployments)

PropertyValue
CodeIA006
SeverityInfo
Fieldregistrations
Parse ResultSucceeds

Description

A registration is missing agentId. This is normal for first-time deployments since you don't know the tokenId before registration.

Resolution

Update metadata after registration to include the assigned agentId.


IA007

agentId is null (expected for first-time deployments)

PropertyValue
CodeIA007
SeverityInfo
Fieldregistrations
Parse ResultSucceeds

Description

The agentId is explicitly set to null. Same as IA006.


IA008

Empty supportedTrust array (discovery-only mode)

PropertyValue
CodeIA008
SeverityInfo
FieldsupportedTrust
Parse ResultSucceeds

Description

Agent has no trust models configured. Operating in discovery-only mode.


IA009

Unknown trust model (may be future extension)

PropertyValue
CodeIA009
SeverityInfo
FieldsupportedTrust
Parse ResultSucceeds

Description

A trust model in the array is not in the known set.

Known Models

  • reputation
  • crypto-economic
  • tee-attestation
  • social-graph

IA010

Found 'supportedTrusts' (plural), spec uses 'supportedTrust'

PropertyValue
CodeIA010
SeverityInfo
FieldsupportedTrusts
Parse ResultSucceeds

Description

Common typo. The spec uses singular supportedTrust.


IA020

MCP endpoint missing version field

PropertyValue
CodeIA020
SeverityInfo
FieldMCP
Parse ResultSucceeds
ERC-8004 ComplianceVersion is SHOULD, not MUST

Description

MCP endpoint doesn't specify a version.

Recommendation

json
{
  "name": "MCP",
  "endpoint": "https://...",
  "version": "2025-06-18"
}

IA021

MCP version is not in date format (YYYY-MM-DD)

PropertyValue
CodeIA021
SeverityInfo
FieldMCP
Parse ResultSucceeds
Valid FormatYYYY-MM-DD (e.g., 2025-06-18, 2025-11-25, 2026-01-29)
ReferenceMCP Specification

Description

MCP uses date-based versioning. The version field should be in YYYY-MM-DD format representing the protocol specification date. Any valid date from 2024 onwards is accepted.

Valid examples:

  • "2025-06-18" - June 2025 spec
  • "2025-11-25" - November 2025 spec (latest as of writing)
  • "2026-01-29" - Future spec date

Invalid examples:

  • "1.0.0" - Not a date format
  • "2025/06/18" - Wrong separator
  • "25-06-18" - Year not in 4-digit format

IA022

A2A endpoint missing version field

PropertyValue
CodeIA022
SeverityInfo
FieldA2A
Parse ResultSucceeds

Description

A2A endpoint doesn't specify a version.


IA023

A2A version is not in semver format

PropertyValue
CodeIA023
SeverityInfo
FieldA2A
Parse ResultSucceeds
Valid FormatSemver: X.Y.Z or X.Y (e.g., 0.3.0)

Description

A2A uses semantic versioning. The version field should be in semver format (major.minor.patch or major.minor).

Valid examples:

  • "0.3.0" - Current A2A spec version
  • "1.0.0" - Future major version
  • "0.4" - Without patch number

Invalid examples:

  • "v0.3.0" - Avoid 'v' prefix for A2A
  • "latest" - Not a version number

IA024

A2A endpoint should use .well-known/agent-card.json path

PropertyValue
CodeIA024
SeverityInfo
FieldA2A
Parse ResultSucceeds

Description

A2A endpoint doesn't use the recommended well-known path.

Recommendation

text
https://your-agent.com/.well-known/agent-card.json

IA025

OASF endpoint has neither skills nor domains

PropertyValue
CodeIA025
SeverityInfo
FieldOASF
Parse ResultSucceeds

Description

OASF endpoint exists but has no skills or domains defined.


IA026

OASF version is not in semver format

PropertyValue
CodeIA026
SeverityInfo
FieldOASF
Parse ResultSucceeds
Valid FormatSemver with optional 'v' prefix: X.Y.Z, vX.Y.Z, or X.Y
ReferenceOASF Releases

Description

OASF uses semantic versioning. The version field should be in semver format, with an optional 'v' prefix. Multiple major version lines are supported (0.7.x, 0.8.x, etc.).

Valid examples:

  • "0.8.0" - Without 'v' prefix
  • "v0.8.0" - With 'v' prefix
  • "0.8.3" - Latest 0.8.x version
  • "0.7.4" - 0.7.x version line
  • "1.0.0" - Future major version

Invalid examples:

  • "latest" - Not a version number
  • "0.8" - Missing patch number (while technically valid semver, full version preferred)

IA027

Unknown OASF skill category

PropertyValue
CodeIA027
SeverityInfo
FieldOASF
Parse ResultSucceeds
ReferenceOASF Taxonomy

Description

A skill in the OASF endpoint is not in the known taxonomy.


IA028

Unknown OASF domain category

PropertyValue
CodeIA028
SeverityInfo
FieldOASF
Parse ResultSucceeds

Description

A domain in the OASF endpoint is not in the known taxonomy.


IA040

HTTP/HTTPS URI is not content-addressed

PropertyValue
CodeIA040
SeverityInfo
FieldagentURI
Parse ResultSucceeds

Description

Agent uses a mutable HTTP/HTTPS URL for metadata. Content at HTTP URLs can change without notice.

Why This Matters

  • No built-in integrity verification
  • Content can change between fetches
  • Harder to audit historical state

Recommendations

  1. Use IPFS: ipfs://Qm... for immutable content
  2. Set agentHash: On-chain integrity verification
  3. Use data URIs: For small metadata (data:application/json,...)

IA041

URL-decoded plain data URI

PropertyValue
CodeIA041
SeverityInfo
FieldagentURI
Parse ResultSucceeds

Description

The data URI content was URL-encoded and had to be decoded.


IA050

Field value from contract state (on-chain metadata empty or not set)

PropertyValue
CodeIA050
SeverityInfo
FieldDynamic
Parse ResultSucceeds

Description

A metadata field is using the value from contract state because the on-chain metadata for this field is empty or not set.

This is not an error - ERC-8004 contracts don't provide a deleteMetadata() function, so setting a field to empty (0x or "") is the standard way to indicate "not set". When this happens, the contract state value (if available) is used as the fallback.

Common Scenarios

Scenario 1: Empty agentWallet on-chain metadata

  • On-chain metadata: {"key": "agentWallet", "value": "0x"}
  • Contract state: agentWallet = 0x461a... (from setAgentWallet())
  • Result: Uses contract state value
  • Info: IA050 on field agent_wallet

Scenario 2: agentWallet not set in on-chain metadata

  • On-chain metadata: No agentWallet entry
  • Contract state: agentWallet = 0x461a...
  • Result: Uses contract state value
  • Info: IA050 on field agent_wallet

Why This Happens

ERC-8004 metadata hierarchy (highest to lowest priority):

  1. Contract state (hardcoded fields: agentWallet, owner)
  2. On-chain metadata (via setMetadata())
  3. Off-chain metadata (from agentURI)

When on-chain metadata is empty, contract state takes precedence without conflict.

Resolution

No action needed - this is informational only. The field value is correct.

If you want to explicitly set the value in on-chain metadata:

solidity
// Set agentWallet in on-chain metadata (optional)
registry.setMetadata(tokenId, "agentWallet", "0x461a76074596f080dfba414532ab51280611b8e6");

However, agentWallet cannot be set via setMetadata() - it's a reserved field that must be set via setAgentWallet() with signature verification.

See Also

  • WA081: Contract state conflicts with on-chain metadata (when both are non-empty)
  • Metadata Handling Guide: /docs/implementation/onchain-metadata-handling.md

Feedback Errors (EF001-EF099)

Critical issues in feedback parsing.


EF001

Invalid timestamp format

PropertyValue
CodeEF001
SeverityError
Fieldtimestamp
Parse ResultUses current time

Description

The timestamp field cannot be parsed as a Unix timestamp.

Expected Format

Unix timestamp in seconds (integer).


EF002

Failed to fetch offchain data

PropertyValue
CodeEF002
SeverityError
FieldfeedbackURI
Parse ResultPartial success

Description

Could not fetch the feedback's offchain data from feedbackURI.


Feedback Warnings (WF001-WF099)


WF001

Invalid timestamp (using current time)

PropertyValue
CodeWF001
SeverityWarning
Fieldtimestamp
Parse ResultSucceeds

Description

Revocation timestamp invalid. Using current time as fallback.


WF002

Feedback hash mismatch

PropertyValue
CodeWF002
SeverityWarning
FieldfeedbackHash
Parse ResultSucceeds

Description

The computed hash of offchain data doesn't match feedbackHash on-chain.


WF003

Tag stored as hash (original not available)

PropertyValue
CodeWF003
SeverityWarning
Fieldtag
Parse ResultSucceeds

Description

The indexed tag1 is stored as a keccak256 hash and the original value wasn't in offchain data.

Why This Happens

Indexed string parameters in Solidity events are stored as hashes. The original value should be provided in feedbackURI data.



Last Updated: 2026-02-06