Skip to content

Start typing to search the documentation.

Celo Agent Visa

On this page

The Celo Agent Visa is a tiered, soulbound NFT that rewards agents for activity on Celo. An agent’s visa tier grows with its transaction count and USD volume. Claims and upgrades are relayed, so the agent pays no gas.

Tiers

TierNameRequirementsManual review
1Tourist Visa1 transactionNo
2Work VisaFresh human proof + 1,000 transactions or $5,000 volumeNo
3CitizenshipFresh human proof + 10,000 transactions or $15,000 volumeYes

Tiers 2 and 3 need a registry agent with a fresh human proof (Self Agent ID), and meeting either metric qualifies. The contract holds the thresholds, and GET /api/visa/{chainId}/{agentId} returns the live values in thresholds.

Visa IDs

The visa contract is keyed by agent ID, so a visa follows the agent identity:

  • Registry agent: the agent’s ID in SelfAgentRegistry.
  • Wallet-based ID: uint160(wallet), for a wallet without a registry agent (tier 1). Move it to a registry agent later with POST /api/visa/migrate.

The API returns visa IDs as decimal strings, because wallet-based IDs exceed the JSON number range.

How it works

  1. Transact on Celo. The transaction count is the visa wallet’s live transaction count, and the visa contract stores the USD volume.
  2. Check eligibility with GET /api/visa/{chainId}/{agentId}, which returns eligibility per tier and the current metrics. GET /api/visa/{chainId}/batch reads up to 100 IDs, and GET /api/visa/agents lists the visa IDs of a wallet.
  3. Claim with POST /api/visa/claim, signed by the agent’s NFT owner, its EVM key or, for a wallet-based ID, that wallet. The relayer mints or upgrades the visa, updating the stored metrics first when needed.
  4. For tier 3, request review with POST /api/visa/request-review, then claim once the review is approved (manualReviewApproved).
curl -s https://agent-api.self.xyz/api/visa/11142220/5

Write requests carry a single-use EIP-191 signature over a fixed message and are limited to 20 attempts per IP per hour. Response fields, the signed message format, body fields, error codes (NOT_ELIGIBLE, REVIEW_REQUIRED) and retry rules are in the REST API reference: Celo Agent Visa endpoints.

Contract

CeloAgentVisa is a soulbound (non-transferable) ERC-721 at 0xCa97f7586CF9De62B8ca516d7Ee25f6AEae5e109 on Celo Mainnet and 0xf049FD6260Fce964B82728A86CF1BbEB8AB3E875 on Celo Sepolia. Read it directly:

function getTier(uint256 agentId) external view returns (uint8);            // 0 = none, 1-3
function getMetrics(uint256 agentId) external view returns (uint256 transactionCount, uint256 volumeUsd, uint64 lastUpdated); // volumeUsd has 6 decimals
function checkTierEligibility(uint256 agentId, uint8 tier) external view returns (bool);
function getTierThresholds(uint8 tier) external view returns (uint256 minTransactions, uint256 minVolumeUsd, bool requiresBoth, bool requiresManualReview);
function getVisaWallet(uint256 agentId) external view returns (address);
Was this page helpful?