{
  "schema_version": "v1",
  "name": "rob-domains",
  "display_name": "ROB Domains",
  "description": "ROB Domains is a Web3 domain name system on the Robinhood Chain (Chain ID 4663). Search .rob domain availability, read on-chain profiles, reverse-resolve wallets, and generate unsigned transaction payloads for minting, setting a primary domain, and updating profiles.",
  "base_url": "https://robdn.com",
  "auth": {
    "type": "none"
  },
  "tools": [
    {
      "name": "get_status",
      "description": "Returns platform status, chain info, contract addresses, and available endpoints.",
      "method": "GET",
      "path": "/agent/status",
      "inputs": []
    },
    {
      "name": "search_domain",
      "description": "Search for a .rob domain by name. Returns availability, current owner, token ID, primary owner, and profile summary. Accepts the domain with or without the .rob suffix.",
      "method": "GET",
      "path": "/agent/search/{domain}",
      "inputs": [
        {
          "name": "domain",
          "in": "path",
          "required": true,
          "type": "string",
          "description": "Domain label without .rob suffix (e.g. alice)"
        }
      ]
    },
    {
      "name": "get_profile",
      "description": "Returns the full on-chain profile for a .rob domain, including bio, social links, custom links, profile picture, cover image, and background.",
      "method": "GET",
      "path": "/agent/profile/{domain}",
      "inputs": [
        {
          "name": "domain",
          "in": "path",
          "required": true,
          "type": "string",
          "description": "Domain label with or without .rob suffix"
        }
      ]
    },
    {
      "name": "reverse_resolve",
      "description": "Reverse-resolves an Ethereum wallet address to its primary .rob domain as registered in the on-chain RobResolver contract. Returns an empty result (not an error) when no primary domain is set.",
      "method": "GET",
      "path": "/agent/reverse/{wallet}",
      "inputs": [
        {
          "name": "wallet",
          "in": "path",
          "required": true,
          "type": "string",
          "description": "Ethereum wallet address (0x-prefixed, 42 characters)"
        }
      ]
    },
    {
      "name": "get_primary_domain",
      "description": "Returns the primary .rob domain set for a wallet via the on-chain RobResolver. Includes the resolution source for transparency.",
      "method": "GET",
      "path": "/agent/primary/{wallet}",
      "inputs": [
        {
          "name": "wallet",
          "in": "path",
          "required": true,
          "type": "string",
          "description": "Ethereum wallet address (0x-prefixed)"
        }
      ]
    },
    {
      "name": "build_mint_transaction",
      "description": "Generates an unsigned transaction payload for minting a .rob domain NFT. Domain availability is verified before returning the payload. The API does NOT execute the transaction — pass the returned payload to the user's wallet for signing and broadcasting.",
      "method": "POST",
      "path": "/agent/tx/mint",
      "inputs": [
        {
          "name": "domain",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "Domain label without .rob suffix (e.g. alice)"
        }
      ]
    },
    {
      "name": "build_set_primary_transaction",
      "description": "Generates an unsigned transaction payload for setting a .rob domain token as the caller's primary domain in the RobResolver contract. Verifies token ownership before returning. The API does NOT execute the transaction.",
      "method": "POST",
      "path": "/agent/tx/set-primary",
      "inputs": [
        {
          "name": "tokenId",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "On-chain token ID of the domain"
        },
        {
          "name": "wallet",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "Wallet address that owns the token"
        }
      ]
    },
    {
      "name": "build_update_profile_transaction",
      "description": "Generates one or more unsigned transaction payloads for updating a .rob domain profile (bio, social links, custom links, images, background). When socialLinks or customLinks are provided, multiple payloads are returned — sign and send them in order. The API does NOT execute any transaction.",
      "method": "POST",
      "path": "/agent/tx/update-profile",
      "inputs": [
        {
          "name": "tokenId",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "On-chain token ID of the domain to update"
        },
        {
          "name": "bio",
          "in": "body",
          "required": false,
          "type": "string",
          "description": "Profile bio (max 500 characters)"
        },
        {
          "name": "profilePicture",
          "in": "body",
          "required": false,
          "type": "string",
          "description": "URL of profile picture"
        },
        {
          "name": "coverImage",
          "in": "body",
          "required": false,
          "type": "string",
          "description": "URL of cover image"
        },
        {
          "name": "background",
          "in": "body",
          "required": false,
          "type": "string",
          "description": "Tailwind CSS background class string"
        },
        {
          "name": "socialLinks",
          "in": "body",
          "required": false,
          "type": "array",
          "description": "Array of social links (platform + url)"
        },
        {
          "name": "customLinks",
          "in": "body",
          "required": false,
          "type": "array",
          "description": "Array of custom links (title + url)"
        }
      ]
    },
    {
      "name": "register_domain_workflow",
      "description": "Returns a complete multi-step execution plan for registering a .rob domain. Steps: 1) Mint Domain (always), 2) Set Primary (when setPrimary is true), 3) Update Profile (when profile fields are provided). All transaction payloads are included. The API does NOT execute anything — this is a planning endpoint only.",
      "method": "POST",
      "path": "/agent/workflow/register-domain",
      "inputs": [
        {
          "name": "domain",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "Domain label without .rob suffix"
        },
        {
          "name": "wallet",
          "in": "body",
          "required": true,
          "type": "string",
          "description": "Wallet address of the future owner"
        },
        {
          "name": "setPrimary",
          "in": "body",
          "required": false,
          "type": "boolean",
          "description": "Include a Set Primary Domain step in the plan"
        },
        {
          "name": "profile",
          "in": "body",
          "required": false,
          "type": "object",
          "description": "Optional profile fields (bio, profilePicture, socialLinks, etc.)"
        }
      ]
    }
  ],
  "notes": {
    "auth": "No API keys required. All read endpoints are fully public. Wallet signatures authorize on-chain writes — enforced by the smart contracts, not this API.",
    "transaction_model": "POST endpoints return ABI-encoded unsigned transaction payloads (to, data, value, chainId). The AI agent presents these to the user's wallet. The wallet signs and broadcasts.",
    "chain": "Robinhood Chain, Chain ID 4663",
    "rpc": "https://rpc.mainnet.chain.robinhood.com",
    "explorer": "https://robinhoodchain.blockscout.com",
    "openapi": "https://robdn.com/agent/docs/openapi.yaml",
    "manifest": "https://robdn.com/.well-known/ai-plugin.json"
  }
}
