Closed Beta — Aira is currently invite-only. Request access to join the early program.
Aira

Verifiable Credentials

Issue, verify, revoke, and inspect W3C Verifiable Credentials for registered AI agents.

Verifiable Credentials (VCs) prove an agent's identity and capabilities using the W3C standard. Public endpoints (get current credential, verify, status list, JSON-LD context) require no authentication and are rate-limited. Authenticated endpoints require a Bearer token (Authorization: Bearer aira_live_xxxxx). Revocation requires admin privileges.

Base URL for authenticated endpoints: https://api.airaproof.com/api/v1

Public status list and context endpoints are mounted at the root (https://api.airaproof.com) without the /api/v1 prefix.


Get Current Credential

GET /api/v1/agents/{slug}/credential

Returns the current valid (non-revoked, non-expired) Verifiable Credential for an agent. Public -- no authentication required. Rate-limited.

Path Parameters

ParameterTypeRequiredDescription
slugstringYesThe agent's unique slug

Example Request

curl https://api.airaproof.com/api/v1/agents/procurement-agent/credential

Response (200 OK) -- Credential Found

{
  "credential": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://api.airaproof.com/contexts/agent-capability/v1"
    ],
    "id": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": ["VerifiableCredential", "AgentCapabilityCredential"],
    "issuer": "did:web:api.airaproof.com",
    "issuanceDate": "2026-06-01T00:00:00Z",
    "expirationDate": "2027-06-01T00:00:00Z",
    "credentialSubject": {
      "id": "did:web:api.airaproof.com:agents:procurement-agent",
      "agentSlug": "procurement-agent",
      "displayName": "Procurement Agent",
      "ownerOrganization": "org_01J9E...",
      "capabilities": ["transaction", "decision"],
      "modelId": "claude-sonnet-4-20250514",
      "version": "1.0.0",
      "euAiActCompliant": true,
      "notarizationEnabled": true,
      "maxActionValue": null
    },
    "credentialStatus": {
      "id": "https://api.airaproof.com/credentials/status/1#0",
      "type": "StatusList2021Entry",
      "statusPurpose": "revocation",
      "statusListIndex": "0",
      "statusListCredential": "https://api.airaproof.com/credentials/status/1"
    },
    "proof": {
      "type": "Ed25519Signature2020",
      "created": "2026-06-01T00:00:00Z",
      "verificationMethod": "did:web:api.airaproof.com#key-1",
      "proofPurpose": "assertionMethod",
      "proofValue": "z3hQ9x..."
    }
  },
  "message": null
}

Response (200 OK) -- No Credential

{
  "credential": null,
  "message": "No valid credential found for this agent"
}

Response Fields

FieldTypeDescription
credentialobject | nullThe full W3C VC JSON document, or null if no valid credential exists
messagestring | nullHuman-readable message when no credential is found

Error Codes

StatusCodeDescription
404NOT_FOUNDAgent with the given slug does not exist

Verify Credential

POST /api/v1/credentials/verify

Verifies any Verifiable Credential -- checks structure, issuer, signature, expiry, and revocation status. Public -- no authentication required. Rate-limited.

Request Body

FieldTypeRequiredDescription
credentialobjectYesThe full VC JSON document to verify

Example Request

curl -X POST https://api.airaproof.com/api/v1/credentials/verify \
  -H "Content-Type: application/json" \
  -d '{
    "credential": {
      "@context": ["https://www.w3.org/2018/credentials/v1"],
      "id": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "type": ["VerifiableCredential", "AgentCapabilityCredential"],
      "issuer": "did:web:api.airaproof.com",
      "issuanceDate": "2026-06-01T00:00:00Z",
      "expirationDate": "2027-06-01T00:00:00Z",
      "credentialSubject": {
        "id": "did:web:api.airaproof.com:agents:procurement-agent"
      },
      "proof": {
        "type": "Ed25519Signature2020",
        "created": "2026-06-01T00:00:00Z",
        "verificationMethod": "did:web:api.airaproof.com#key-1",
        "proofPurpose": "assertionMethod",
        "proofValue": "z3hQ9x..."
      }
    }
  }'

Response (200 OK) -- Valid

{
  "valid": true,
  "checks": {
    "signature": true,
    "not_expired": true,
    "not_revoked": true,
    "issuer_valid": true,
    "structure_valid": true
  }
}

Response (200 OK) -- Invalid

{
  "valid": false,
  "checks": {
    "signature": false,
    "not_expired": true,
    "not_revoked": true,
    "issuer_valid": true,
    "structure_valid": true
  }
}

Response Fields

FieldTypeDescription
validbooleanWhether the credential passes all verification checks
checksobjectIndividual check results (see below)

Verification Checks

CheckDescription
structure_validRequired fields are present (@context, type, issuer, issuanceDate, credentialSubject, proof)
issuer_validIssuer DID matches Aira's root DID
signatureEd25519Signature2020 proof is cryptographically valid
not_expiredCurrent time is before the credential's expirationDate
not_revokedCredential has not been revoked (checked against the database by vc_id)

Get Status List

GET /credentials/status/{list_id}

Returns a StatusList2021 revocation bitstring credential. This endpoint is mounted at the root -- no /api/v1 prefix. Public -- no authentication required. Rate-limited.

Each bit in the encoded list corresponds to a credential. A bit value of 1 indicates that credential has been revoked.

Path Parameters

ParameterTypeRequiredDescription
list_idstringYesThe status list identifier (e.g. 1 for the default list)

Example Request

curl https://api.airaproof.com/credentials/status/1

Response (200 OK)

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/vc/status-list/2021/v1"
  ],
  "id": "https://api.airaproof.com/credentials/status/1",
  "type": ["VerifiableCredential", "StatusList2021Credential"],
  "issuer": "did:web:api.airaproof.com",
  "issued": "2026-06-05T12:00:00Z",
  "credentialSubject": {
    "id": "https://api.airaproof.com/credentials/status/1#list",
    "type": "StatusList2021",
    "statusPurpose": "revocation",
    "encodedList": "H4sIAAAAAAAAA..."
  }
}

Response Fields

FieldTypeDescription
@contextstring[]JSON-LD context URIs
idstringCanonical URL of this status list
typestring[]Credential types
issuerstringAira's issuer DID
issuedstringWhen this status list was generated (ISO 8601)
credentialSubject.encodedListstringBase64-encoded bitstring (minimum 16 KB / 131,072 bits per spec)

Get JSON-LD Context

GET /contexts/agent-capability/v1

Returns the JSON-LD context document for AgentCapabilityCredential. This endpoint is mounted at the root -- no /api/v1 prefix. Public -- no authentication required. Rate-limited.

Example Request

curl https://api.airaproof.com/contexts/agent-capability/v1

Response (200 OK)

{
  "@context": {
    "@version": 1.1,
    "aira": "https://api.airaproof.com/contexts/agent-capability/v1#",
    "AgentCapabilityCredential": "aira:AgentCapabilityCredential",
    "agentSlug": "aira:agentSlug",
    "displayName": "aira:displayName",
    "ownerOrganization": "aira:ownerOrganization",
    "capabilities": "aira:capabilities",
    "modelId": "aira:modelId",
    "version": "aira:version",
    "euAiActCompliant": "aira:euAiActCompliant",
    "notarizationEnabled": "aira:notarizationEnabled",
    "maxActionValue": "aira:maxActionValue"
  }
}

Get Credential History

GET /api/v1/agents/{slug}/credentials
Authorization: Bearer aira_live_xxxxx

Returns the full credential history for an agent owned by your organization, ordered by version descending (newest first). Requires authentication.

Path Parameters

ParameterTypeRequiredDescription
slugstringYesThe agent's unique slug

Example Request

curl https://api.airaproof.com/api/v1/agents/procurement-agent/credentials \
  -H "Authorization: Bearer aira_live_xxxxx"

Response (200 OK)

{
  "credentials": [
    {
      "vc_id": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "vc_json": {
        "@context": [
          "https://www.w3.org/2018/credentials/v1",
          "https://api.airaproof.com/contexts/agent-capability/v1"
        ],
        "id": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "type": ["VerifiableCredential", "AgentCapabilityCredential"],
        "issuer": "did:web:api.airaproof.com",
        "issuanceDate": "2026-06-01T00:00:00Z",
        "expirationDate": "2027-06-01T00:00:00Z",
        "credentialSubject": {
          "id": "did:web:api.airaproof.com:agents:procurement-agent",
          "agentSlug": "procurement-agent",
          "displayName": "Procurement Agent",
          "capabilities": ["transaction", "decision"]
        },
        "proof": {
          "type": "Ed25519Signature2020",
          "proofValue": "z3hQ9x..."
        }
      },
      "issued_at": "2026-06-01T00:00:00Z",
      "expires_at": "2027-06-01T00:00:00Z",
      "revoked_at": null,
      "version": 2
    },
    {
      "vc_id": "urn:uuid:11223344-5566-7788-99aa-bbccddeeff00",
      "vc_json": {
        "@context": ["https://www.w3.org/2018/credentials/v1"],
        "type": ["VerifiableCredential", "AgentCapabilityCredential"],
        "proof": { "type": "Ed25519Signature2020" }
      },
      "issued_at": "2026-01-01T00:00:00Z",
      "expires_at": "2027-01-01T00:00:00Z",
      "revoked_at": "2026-05-15T12:00:00Z",
      "version": 1
    }
  ],
  "request_id": "req_01J9K..."
}

Response Fields

FieldTypeDescription
credentialsarrayList of credential records (see Credential Object below)
request_idstringUnique request identifier for tracing

Error Codes

StatusCodeDescription
404NOT_FOUNDAgent with the given slug does not exist or is not owned by your organization

Revoke Credential

POST /api/v1/agents/{slug}/credentials/revoke
Authorization: Bearer aira_live_xxxxx

Revokes the current active credential for an agent. Requires admin privileges. Revocation is permanent -- once revoked, a credential cannot be reinstated. A new credential must be issued to replace it.

Path Parameters

ParameterTypeRequiredDescription
slugstringYesThe agent's unique slug

Request Body

FieldTypeRequiredDescription
reasonstringYesReason for revocation (1--1000 characters)

Example Request

curl -X POST https://api.airaproof.com/api/v1/agents/procurement-agent/credentials/revoke \
  -H "Authorization: Bearer aira_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Agent decommissioned after policy violation"
  }'

Response (200 OK)

{
  "vc_id": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "revoked_at": "2026-06-05T14:30:00Z",
  "reason": "Agent decommissioned after policy violation",
  "request_id": "req_01J9K..."
}

Response Fields

FieldTypeDescription
vc_idstringThe revoked credential's identifier
revoked_atstringWhen the credential was revoked (ISO 8601 UTC)
reasonstringThe revocation reason provided
request_idstringUnique request identifier for tracing

Error Codes

StatusCodeDescription
403FORBIDDENCaller does not have admin privileges
404NOT_FOUNDAgent does not exist, is not owned by your organization, or has no active credential

Credential Object

All credential records in list responses share this structure:

FieldTypeDescription
vc_idstringUnique identifier of the Verifiable Credential (urn:uuid:...)
vc_jsonobjectThe full W3C VC JSON document including proof
issued_atstringWhen the credential was issued (ISO 8601 UTC)
expires_atstringWhen the credential expires (ISO 8601 UTC)
revoked_atstring | nullWhen the credential was revoked, or null if still active
versionintegerCredential version number (increments on each reissuance for the same agent)

On this page