Overview
The ROB Domains Agent API is a RESTful HTTP API that gives AI agents, external applications, and developer tools direct access to the ROB Domains name system on Robinhood Chain. It provides two categories of endpoints:
Query on-chain domain availability, profiles, reverse resolution, and platform status. No authentication, no rate limits beyond standard fair use.
Generate ABI-encoded, unsigned transaction payloads for minting, setting a primary domain, and updating profiles. The wallet signs and broadcasts — the API never holds keys.
# Quick check
curl https://robdn.com/agent/status
# Search a domain
curl https://robdn.com/agent/search/alice
# Build a mint transaction
curl -X POST https://robdn.com/agent/tx/mint \
-H "Content-Type: application/json" \
-d '{"domain":"alice"}'Authentication
No API key required
All endpoints are publicly accessible. Wallet signatures are the only authorization mechanism — they are required by the smart contracts themselves, not by this API.
Wallet Signing
Transaction endpoints return unsigned payloads. Pass them directly to any EIP-1559–compatible wallet:
import { BrowserProvider } from 'ethers';
// 1. Get unsigned payload from the API
const { data: tx } = await fetch('https://robdn.com/agent/tx/mint', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ domain: 'alice' }),
}).then(r => r.json());
// 2. Send to wallet — no private key handling in your code
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const txResponse = await signer.sendTransaction({
to: tx.to,
data: tx.data,
value: BigInt(tx.value),
chainId: tx.chainId, // 4663
});
await txResponse.wait();
console.log('Minted!', txResponse.hash);Available Endpoints
/agent/statusStatusPlatform status, chain info, and contract addresses
/agent/search/{domain}ReadSearch domain availability, owner, tokenId, and profile summary
/agent/profile/{domain}ReadFull on-chain profile — bio, social links, custom links
/agent/reverse/{wallet}ReadReverse-resolve wallet address to primary .rob domain
/agent/primary/{wallet}ReadPrimary domain for a wallet from the on-chain resolver
/agent/tx/mintTransactionGenerate unsigned mint transaction payload
/agent/tx/set-primaryTransactionGenerate unsigned set-primary-domain transaction payload
/agent/tx/update-profileTransactionGenerate unsigned update-profile transaction payload(s)
/agent/workflow/register-domainWorkflowComplete multi-step execution plan: mint + set primary + profile
Response Envelope
All responses use a consistent JSON envelope:
// Success
{
"success": true,
"data": { ... },
"meta": {
"chain": "Robinhood",
"chainId": 4663,
"timestamp": "2024-01-01T00:00:00.000Z"
}
}
// Error
{
"success": false,
"code": 400,
"message": "Domain is required",
"details": "Field: domain"
}Transaction Flow
The API generates payloads — it never executes transactions on your behalf.
GET /agent/search/{domain} — confirm it's available
curl https://robdn.com/agent/search/alicePOST /agent/tx/mint — receive an unsigned payload
curl -X POST https://robdn.com/agent/tx/mint -d '{"domain":"alice"}'Pass { to, data, value, chainId } to the user's wallet
await signer.sendTransaction({ to, data, value: BigInt(value), chainId })Parse the DomainMinted event from the receipt
const tokenId = receipt.logs[0].args.tokenId.toString()POST /agent/tx/set-primary with the tokenId
curl -X POST https://robdn.com/agent/tx/set-primary -d '{"tokenId":"1","wallet":"0x..."}'Transaction Payload Example
Every transaction endpoint returns a payload in this shape:
{
"success": true,
"data": {
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x3f8e4e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056d6f6e7279000000000000000000000000000000000000000000000000000000",
"value": "0",
"chainId": 4663,
"contractName": "DomainNFT",
"method": "mintDomain",
"description": "Mint the domain "alice.rob" as an NFT on Robinhood Chain."
},
"meta": {
"chain": "Robinhood",
"chainId": 4663,
"timestamp": "2024-07-21T12:00:00.000Z"
}
}AI Workflow Examples
End-to-end AI agent workflows showing the exact API calls made at each step.
Example: "I want rob.rob"
An AI agent receives the instruction and executes the following sequence:
Actual API Calls
# Step 1: Search
curl https://robdn.com/agent/search/rob
# → { "data": { "available": true, "owner": null } }
# Step 2: Generate Mint TX
curl -X POST https://robdn.com/agent/tx/mint \
-H "Content-Type: application/json" \
-d '{"domain":"rob"}'
# → { "data": { "to": "0xF960...", "data": "0x...", "value": "0", "chainId": 4663 } }
# User signs and broadcasts → gets tokenId from DomainMinted event
# Step 3: Generate Set Primary TX
curl -X POST https://robdn.com/agent/tx/set-primary \
-H "Content-Type: application/json" \
-d '{"tokenId":"42","wallet":"0xAbCd1234567890AbCd1234567890AbCd12345678"}'
# → { "data": { "to": "0x7fA1...", "data": "0x...", "value": "0", "chainId": 4663 } }
# Step 4: Generate Profile Update TX
curl -X POST https://robdn.com/agent/tx/update-profile \
-H "Content-Type: application/json" \
-d '{
"tokenId": "42",
"bio": "Web3 builder",
"socialLinks": [{"platform":"twitter","url":"https://twitter.com/rob"}]
}'
# → { "data": { "tokenId":"42","transactionCount":2,"transactions":[...] } }One-Call Workflow
Use POST /agent/workflow/register-domain to get the complete execution plan in a single call:
curl -X POST https://robdn.com/agent/workflow/register-domain \
-H "Content-Type: application/json" \
-d '{
"domain": "rob",
"wallet": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"setPrimary": true,
"profile": {
"bio": "Web3 builder",
"socialLinks": [
{ "platform": "twitter", "url": "https://twitter.com/rob" }
]
}
}'{
"success": true,
"data": {
"domain": "rob",
"fullDomain": "rob.rob",
"wallet": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"totalSteps": 3,
"steps": [
{
"step": 1,
"action": "Mint Domain",
"description": "Mint rob.rob as an NFT on Robinhood Chain",
"transaction": {
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x3f8e4e90...",
"value": "0",
"chainId": 4663
}
},
{
"step": 2,
"action": "Set Primary Domain",
"description": "Set rob.rob as primary domain for your wallet",
"transaction": {
"to": "0xeDe40500f6047F2Ef8d8F5dec12F096969A1bF47",
"data": "0xabcdef12...",
"value": "0",
"chainId": 4663
}
},
{
"step": 3,
"action": "Update Profile",
"description": "Update profile: bio + social links",
"transaction": [
{ "to": "0xF960...", "data": "0x...", "value": "0", "chainId": 4663 },
{ "to": "0xF960...", "data": "0x...", "value": "0", "chainId": 4663 }
]
}
]
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}API Reference
Complete reference for every endpoint — parameters, request/response schemas, cURL examples, and error codes.
/agent/statusStatusReturns platform status, chain info, contract addresses, and available endpoints.
cURL
curl https://robdn.com/agent/statusHTTP
GET /agent/status HTTP/1.1
Host: robdn.comResponse JSON
{
"success": true,
"data": {
"status": "operational",
"version": "1.0.0",
"chain": {
"name": "Robinhood",
"chainId": 4663,
"rpcUrl": "https://rpc.mainnet.chain.robinhood.com",
"explorerUrl": "https://robinhoodchain.blockscout.com",
"symbol": "ETH"
},
"contracts": {
"domainNFT": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"marketplace": "0xAefec6e65ADE8D95c0Cf69D20e9254556f6cC637",
"chat": "0xB96eCa3BE710aFC822e2342D0bCae7103371dE81",
"resolver": "0xeDe40500f6047F2Ef8d8F5dec12F096969A1bF47",
},
"endpoints": [
"GET /agent/status",
"GET /agent/search/{domain}",
"POST /agent/tx/mint"
],
"auth": "No API keys required.",
"openapi": "https://robdn.com/agent/docs/openapi.yaml"
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/search/{domain}ReadSearch for a .rob domain. Returns availability, owner, tokenId, and profile summary.
domain — domain label with or without .rob suffix (e.g. alice or alice.rob)cURL
curl https://robdn.com/agent/search/aliceResponse — Available
{
"success": true,
"data": {
"domain": "alice",
"fullDomain": "alice.rob",
"available": true,
"owner": null,
"tokenId": null,
"primaryOwner": null,
"profile": null
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}Response — Taken
{
"success": true,
"data": {
"domain": "alice",
"fullDomain": "alice.rob",
"available": false,
"owner": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"tokenId": "42",
"primaryOwner": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"profile": {
"bio": "Web3 builder",
"profilePicture": "https://example.com/pic.jpg",
"socialLinks": [{ "platform": "twitter", "url": "https://twitter.com/alice" }],
"customLinks": []
}
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/profile/{domain}ReadFull on-chain profile for a .rob domain. Returns 404 if not minted.
cURL
curl https://robdn.com/agent/profile/aliceResponse
{
"success": true,
"data": {
"domain": "alice",
"fullDomain": "alice.rob",
"owner": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"tokenId": "42",
"profile": {
"bio": "Web3 builder and open source contributor",
"profilePicture": "https://example.com/pic.jpg",
"coverImage": "https://example.com/cover.jpg",
"background": "bg-gradient-to-br from-purple-900 to-indigo-900",
"socialLinks": [
{ "platform": "twitter", "url": "https://twitter.com/alice", "icon": "twitter" },
{ "platform": "github", "url": "https://github.com/alice", "icon": "github" }
],
"customLinks": [{ "title": "My Website", "url": "https://alice.com" }]
}
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/reverse/{wallet}ReadReverse-resolve a wallet address to its primary .rob domain. Returns resolved: false (not an error) when no primary is set.
cURL
curl https://robdn.com/agent/reverse/0xAbCd1234567890AbCd1234567890AbCd12345678Response — Resolved
{
"success": true,
"data": {
"wallet": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"tokenId": "42",
"domainName": "alice",
"fullDomain": "alice.rob",
"resolved": true
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/tx/mintTransactionGenerate an unsigned mint transaction payload. Domain availability is verified first.
cURL
curl -X POST https://robdn.com/agent/tx/mint \
-H "Content-Type: application/json" \
-d '{"domain":"alice"}'Request Body
{ "domain": "alice" }Response
{
"success": true,
"data": {
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x3f8e4e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056d6f6e7279000000000000000000000000000000000000000000000000000000",
"value": "0",
"chainId": 4663,
"contractName": "DomainNFT",
"method": "mintDomain",
"description": "Mint the domain "alice.rob" as an NFT on Robinhood Chain."
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}Errors
// 400 — domain missing or invalid format
{ "success": false, "code": 400, "message": "Invalid domain name", "details": "Field: domain" }
// 409 — domain already minted
{ "success": false, "code": 409, "message": "Domain alice.rob is already taken" }/agent/tx/set-primaryTransactionGenerate an unsigned set-primary transaction payload. Verifies token ownership before returning.
cURL
curl -X POST https://robdn.com/agent/tx/set-primary \
-H "Content-Type: application/json" \
-d '{"tokenId":"42","wallet":"0xAbCd1234567890AbCd1234567890AbCd12345678"}'Request Body
{
"tokenId": "42",
"wallet": "0xAbCd1234567890AbCd1234567890AbCd12345678"
}Response
{
"success": true,
"data": {
"to": "0xeDe40500f6047F2Ef8d8F5dec12F096969A1bF47",
"data": "0xabcdef12000000000000000000000000000000000000000000000000000000000000002a",
"value": "0",
"chainId": 4663,
"contractName": "RobResolver",
"method": "setPrimaryDomain",
"description": "Set token #42 as the primary domain for 0xAbCd...5678."
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/tx/update-profileTransactionGenerate unsigned update-profile transaction payload(s). Multiple payloads are returned when socialLinks or customLinks are provided — sign and send in order.
cURL
curl -X POST https://robdn.com/agent/tx/update-profile \
-H "Content-Type: application/json" \
-d '{
"tokenId": "42",
"bio": "Web3 builder",
"profilePicture": "https://example.com/pic.jpg",
"socialLinks": [{"platform":"twitter","url":"https://twitter.com/alice"}],
"customLinks": [{"title":"My Website","url":"https://alice.com"}]
}'Request Body
{
"tokenId": "42",
"bio": "Web3 builder",
"profilePicture": "https://example.com/pic.jpg",
"coverImage": "",
"background": "bg-gradient-to-br from-purple-900 to-indigo-900",
"socialLinks": [{ "platform": "twitter", "url": "https://twitter.com/alice" }],
"customLinks": [{ "title": "My Website", "url": "https://alice.com" }]
}Response
{
"success": true,
"data": {
"tokenId": "42",
"transactionCount": 3,
"note": "Sign and broadcast transactions in order.",
"transactions": [
{
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x...",
"value": "0",
"chainId": 4663,
"contractName": "DomainNFT",
"method": "setProfile",
"description": "Set bio and profile picture for token #42."
},
{
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x...",
"value": "0",
"chainId": 4663,
"contractName": "DomainNFT",
"method": "setSocialLinks",
"description": "Set social links for token #42."
},
{
"to": "0x37F7ba486afE8Be3C3C70A4FC3eCacC6DD51c6C8",
"data": "0x...",
"value": "0",
"chainId": 4663,
"contractName": "DomainNFT",
"method": "setCustomLinks",
"description": "Set custom links for token #42."
}
]
},
"meta": { "chain": "Robinhood", "chainId": 4663, "timestamp": "2024-07-21T12:00:00.000Z" }
}/agent/workflow/register-domainWorkflowComplete multi-step execution plan for domain registration. All transaction payloads are included. This is a planning endpoint — it does not execute anything.
cURL
curl -X POST https://robdn.com/agent/workflow/register-domain \
-H "Content-Type: application/json" \
-d '{
"domain": "alice",
"wallet": "0xAbCd1234567890AbCd1234567890AbCd12345678",
"setPrimary": true,
"profile": {
"bio": "Web3 builder",
"socialLinks": [{"platform":"twitter","url":"https://twitter.com/alice"}]
}
}'SDK Examples
Production-ready examples for every major AI SDK and language. Each example demonstrates search, mint, set primary, update profile, and the full workflow.
Quick Example — Vercel AI SDK
import { generateText, tool } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
const BASE = 'https://robdn.com';
const { text } = await generateText({
model: openai('gpt-4o'),
system: 'You are a ROB Domains assistant.',
prompt: 'Is "alice.rob" available?',
tools: {
searchDomain: tool({
description: 'Search for a .rob domain',
parameters: z.object({ domain: z.string() }),
execute: async ({ domain }) => {
const res = await fetch(`${BASE}/agent/search/${domain}`);
return res.json();
},
}),
buildMintTx: tool({
description: 'Generate unsigned mint transaction payload',
parameters: z.object({ domain: z.string() }),
execute: async ({ domain }) => {
const res = await fetch(`${BASE}/agent/tx/mint`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ domain }),
});
return res.json();
},
}),
},
maxSteps: 3,
});
console.log(text);Quick Example — Python
import os, json, requests
from openai import OpenAI
BASE_URL = "https://robdn.com"
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def search_domain(domain):
return requests.get(f"{BASE_URL}/agent/search/{domain}").json()
def build_mint_tx(domain):
return requests.post(f"{BASE_URL}/agent/tx/mint",
json={"domain": domain}).json()
# Use these as OpenAI tool handlers — see agent/examples/python.py for the full agent loopMCP Compatibility
Model Context Protocol (MCP)
MCP is an open standard for connecting AI models to external tools and data sources. ROB Domains is fully compatible with MCP-enabled clients via its REST API.
What is MCP?
The Model Context Protocol (MCP) lets AI assistants like Claude, GPT-4, and others call external tools in a structured way. Any AI client that can issue HTTP requests to a base URL can integrate with ROB Domains — no additional SDK or SDK wrapper required.
Connecting ROB Domains
https://robdn.comhttps://robdn.com/agent/docs/openapi.yamlhttps://robdn.com/.well-known/ai-plugin.jsonhttps://robdn.com/mcp/robdomains-mcp.jsonAvailable MCP Tools
| Tool | Endpoint | Description |
|---|---|---|
| get_status | GET /agent/status | Platform status, chain info, and contract addresses |
| search_domain | GET /agent/search/{domain} | Search a .rob domain for availability, owner, and profile |
| get_profile | GET /agent/profile/{domain} | Full on-chain profile for a .rob domain |
| reverse_resolve | GET /agent/reverse/{wallet} | Reverse-resolve a wallet address to its primary .rob domain |
| get_primary_domain | GET /agent/primary/{wallet} | Primary .rob domain for a wallet from on-chain resolver |
Transaction Generation Model
ROB Domains follows a read-first, payload-second model. The AI agent never holds or manages private keys:
Example MCP Workflow
// 1. MCP client discovers tools via OpenAPI spec
GET https://robdn.com/agent/docs/openapi.yaml
// 2. User says: "Check if rob.rob is available and mint it for me"
// 3. AI calls: search_domain
GET https://robdn.com/agent/search/rob
→ { "available": true }
// 4. AI calls: build_mint_transaction
POST https://robdn.com/agent/tx/mint
Body: { "domain": "rob" }
→ { "to": "0xF960...", "data": "0x...", "value": "0", "chainId": 4663 }
// 5. AI presents transaction payload to user for wallet signing
// User signs via MetaMask/WalletConnect → tx broadcast → DomainMinted event emittedDownload MCP Configuration
robdomains-mcp.jsonTool Reference
Complete reference for every available tool — inputs, outputs, and examples.
get_statusPlatform status, chain info, and contract addresses
search_domainSearch a .rob domain for availability, owner, and profile
get_profileFull on-chain profile for a .rob domain
reverse_resolveReverse-resolve a wallet address to its primary .rob domain
get_primary_domainPrimary .rob domain for a wallet from on-chain resolver
build_mint_transactionUnsigned mint transaction payload for a .rob domain NFT
build_set_primary_transactionUnsigned transaction to set a .rob domain as the primary for a wallet
build_update_profile_transactionUnsigned transaction payload(s) to update a .rob domain profile
register_domain_workflowComplete multi-step execution plan: mint + optional set primary + optional profile
Error Codes
All errors use the standard envelope: { success: false, code, message, details? }
Error Examples
// 400 — Validation error
{ "success": false, "code": 400, "message": "Domain is required", "details": "Field: domain" }
// 403 — Wallet doesn't own token
{ "success": false, "code": 403, "message": "Wallet does not own token #42" }
// 404 — Domain not minted
{ "success": false, "code": 404, "message": "Domain alice.rob is not minted" }
// 409 — Domain already taken
{ "success": false, "code": 409, "message": "Domain alice.rob is already taken" }
// 422 — Semantic validation error
{ "success": false, "code": 422, "message": "Invalid social platform", "details": "platform: snapchat" }
// 500 — Blockchain/RPC error
{ "success": false, "code": 500, "message": "Contract call failed", "details": "RPC timeout" }Supported Chains
https://rpc.mainnet.chain.robinhood.comContract Addresses
Supported Wallets
Any EIP-1193 / EIP-1559 wallet that supports custom chains. Verified integrations:
Agent Integration
ROB Domains exposes an ai-plugin.json manifest and a full OpenAPI 3.1 specification for seamless agent integration.
Add the OpenAPI spec URL to your Custom GPT action:
https://robdn.com/agent/docs/openapi.yamlThe manifest is available at the well-known URL:
https://robdn.com/.well-known/ai-plugin.jsonDownload and use agent/examples/claude.ts — it wires up all ROB Domains tools with the Anthropic SDK tool_use interface.
Any MCP client can connect directly to the base URL using the OpenAPI spec or the dedicated MCP configuration file:
https://robdn.com/mcp/robdomains-mcp.json