{
 "info": {
  "name": "DNS://Money API",
  "description": "Generated from https://api.dnsofmoney.com/openapi.json.",
  "version": "0.3.0",
  "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
 },
 "variable": [
  {
   "key": "baseUrl",
   "value": "https://api.dnsofmoney.com"
  },
  {
   "key": "apiKey",
   "value": ""
  }
 ],
 "item": [
  {
   "name": "resolve",
   "description": "Resolve a pay: name into payment instructions.",
   "item": [
    {
     "name": "Resolve Get",
     "request": {
      "method": "GET",
      "description": "Resolve a pay: alias via GET.",
      "url": {
       "raw": "{{baseUrl}}/resolve/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "resolve",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": true
       }
      ]
     }
    },
    {
     "name": "Resolve Post",
     "request": {
      "method": "POST",
      "description": "Resolve a pay: alias via POST with optional amount/currency context.",
      "url": {
       "raw": "{{baseUrl}}/resolve",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "resolve"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": true
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "aliases",
   "description": "Check, register and manage pay: names.",
   "item": [
    {
     "name": "Alias Availability",
     "request": {
      "method": "GET",
      "description": "Public availability check with founding spots remaining.\n\nReturns exactly three states: available, taken, reserved.\nInvalid format \u2192 422.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/available/:name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        "available",
        ":name"
       ],
       "variable": [
        {
         "key": "name",
         "value": "Example Agent"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Register Alias",
     "request": {
      "method": "POST",
      "description": "Register a new alias. When tier=founding:\n1. Validate FAS-1 format (Pydantic does this)\n2. Check reserved \u2192 409 ALIAS_RESERVED\n3. Check taken \u2192 409 ALIAS_TAKEN\n4. Check wallet already registered \u2192 409 WALLET_ALREADY_REGISTERED\n5. Verify TX on-chain \u2192 422 PAYMENT_VERIFICATION_FAILED\n6. Check TX hash not reused \u2192 409 TX_HASH_ALREADY_USED\n7. Atomic cap check (advisory lock, see FAS-1 \u00a710.2) \u2192 409 CAP_EXCEEDED\n8. INSERT alias\n9. Fire-and-forget: FAS-1 memo TX + Redis counter",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:example.name\",\n  \"xrpl_address\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"founding_tx_hash\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    },
    {
     "name": "Check Availability",
     "request": {
      "method": "GET",
      "description": "Public availability check \u2014 no auth, no side effects.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/check/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        "check",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Get Alias",
     "request": {
      "method": "GET",
      "description": "Get alias details \u2014 requires auth.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Update Alias",
     "request": {
      "method": "PATCH",
      "description": "Update mutable alias preferences for an alias the caller's tenant owns.\n\nThe primary use is declaring a cross-currency DELIVER asset\n(preferred_deliver_currency, e.g. \"XRP\") so a sender can pay in a different\nXRPL-native asset (Tier 1). Schema validation rejects non-XRPL-native values.\nAlso declares the owner's X handle (x_handle) as UNVERIFIED resolvable metadata.\nOnly fields present in the PATCH body are changed.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{}"
      }
     }
    },
    {
     "name": "Create Endpoint",
     "request": {
      "method": "POST",
      "description": "Create payment endpoint \u2014 stub, returns 501.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name/endpoints",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name",
        "endpoints"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Delete Endpoint",
     "request": {
      "method": "DELETE",
      "description": "Delete payment endpoint \u2014 stub, returns 501.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name/endpoints/:endpoint_id",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name",
        "endpoints",
        ":endpoint_id"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        },
        {
         "key": "endpoint_id",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Evolve Alias",
     "request": {
      "method": "POST",
      "description": "Evolve alias identity \u2014 mutate genome, re-render, re-upload, re-mint.\nIn XRPL_MODE=simulated: skip NFT ownership check.\nReturns 202 immediately \u2014 evolution runs as background task.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name/evolve",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name",
        "evolve"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Vote Alias",
     "request": {
      "method": "POST",
      "description": "Vote for an alias genome in the current epoch.\nWeight determined by NFT ownership (simulated: always 1).\nDuplicate vote same epoch \u2192 409.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/aliases/:alias_name/vote",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "aliases",
        ":alias_name",
        "vote"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    }
   ]
  },
  {
   "name": "founding",
   "description": "The founding tier of 600 names, with its NFT and transfer flows.",
   "item": [
    {
     "name": "Founding Status",
     "request": {
      "method": "GET",
      "description": "Public founding tier status.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/status",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "status"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Check if a wallet already has a founding alias",
     "request": {
      "method": "GET",
      "description": "Check if a wallet already registered a founding name. Call before payment.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/wallet-check/:xrpl_address",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "wallet-check",
        ":xrpl_address"
       ],
       "variable": [
        {
         "key": "xrpl_address",
         "value": "rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Check if a pay: alias is available",
     "request": {
      "method": "GET",
      "description": "Public \u2014 no auth required. Returns available/taken/reserved/invalid.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/available/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "available",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Create Xaman Payment",
     "request": {
      "method": "POST",
      "description": "Create a Xaman payment request server-side. Returns QR + deeplink.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/create-payment",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "create-payment"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    },
    {
     "name": "Get Payload Result",
     "request": {
      "method": "GET",
      "description": "Check Xaman payload result \u2014 was it signed? Get TX hash + signer.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/payload-result/:payload_uuid",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "payload-result",
        ":payload_uuid"
       ],
       "variable": [
        {
         "key": "payload_uuid",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Founding Recover",
     "request": {
      "method": "POST",
      "description": "Idempotent registration recovery.\n\nCall this when the page closed after payment but before /register completed.\n- If TX hash is already registered: returns the existing alias (200, recovered=true).\n- If not yet registered: runs the full registration and returns 201.\n\nThis eliminates admin intervention for the \"paid but page closed\" failure mode.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/recover",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "recover"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"xrpl_address\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"founding_tx_hash\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    },
    {
     "name": "Founding Register",
     "request": {
      "method": "POST",
      "description": "Register a founding tier alias.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/register",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "register"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"xrpl_address\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"founding_tx_hash\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    },
    {
     "name": "Founding Identity Status",
     "request": {
      "method": "GET",
      "description": "Poll identity pipeline status for a founding alias.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/identity-status/:alias_id",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "identity-status",
        ":alias_id"
       ],
       "variable": [
        {
         "key": "alias_id",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Claim Nft",
     "request": {
      "method": "POST",
      "description": "Create a Xaman NFTokenAcceptOffer payload so the user can claim their NFT.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/claim-nft",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "claim-nft"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    },
    {
     "name": "Wallet Signin",
     "request": {
      "method": "POST",
      "description": "Create a Xaman SignIn payload \u2014 no payment, just identity proof.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/wallet-signin",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "wallet-signin"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{}"
      }
     }
    },
    {
     "name": "Wallet Nfts",
     "request": {
      "method": "GET",
      "description": "List all founding aliases + NFTs for a wallet address.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/wallet/:xrpl_address/nfts",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "wallet",
        ":xrpl_address",
        "nfts"
       ],
       "variable": [
        {
         "key": "xrpl_address",
         "value": "rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Burn Nft",
     "request": {
      "method": "POST",
      "description": "Burn an NFT for a founding alias.\n\n- Unclaimed (still in minter wallet): server-side burn, immediate. The minter\n  wallet signs, so the caller must prove they own the alias with a fresh,\n  single-use, burn-only Xaman SignIn (signin_uuid) from the alias's founding wallet.\n- Claimed (in user wallet): returns Xaman NFTokenBurn payload for user to sign.\n  No sign-in needed: the ledger rejects a burn from anyone but the holder.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/burn-nft",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "burn-nft"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    },
    {
     "name": "Transfer Offer",
     "request": {
      "method": "POST",
      "description": "Owner-signed NFTokenCreateOffer that hands a claimed founding NFT to another wallet.\n\nThe owner signs in their own wallet (we never hold the NFT once it's claimed),\nso this only builds the Xaman payload. Destination-scoped: only that wallet can\naccept. amount_drops=\"0\" gifts the name; a positive value sells it.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/transfer/offer",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "transfer",
        "offer"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"destination\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\"\n}"
      }
     }
    },
    {
     "name": "Transfer Accept",
     "request": {
      "method": "POST",
      "description": "Recipient-signed NFTokenAcceptOffer for a peer-to-peer sell offer.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/transfer/accept",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "transfer",
        "accept"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"offer_id\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    },
    {
     "name": "Transfer Offers",
     "request": {
      "method": "GET",
      "description": "List active on-chain sell offers for an NFT so a recipient can find the offer id.\n\nReads the ledger directly (chain is source of truth for the founding tier).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/transfer/offers/:nft_token_id",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "transfer",
        "offers",
        ":nft_token_id"
       ],
       "variable": [
        {
         "key": "nft_token_id",
         "value": "0008138800000000000000000000000000000000000000000000000000000000"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Transfer Sync",
     "request": {
      "method": "POST",
      "description": "Reconcile a founding name's receive address with on-chain NFT ownership.\n\nAfter a transfer \u2014 ours or an off-API marketplace sale \u2014 the NFT holder changes but\nour DB cache can go stale. This reads the current holder from the ledger (source of\ntruth for the founding tier) and updates the receive address so the name resolves to\nthe new holder. The genesis-minter field (founding_xrpl_address) stays immutable.\n\nProvide expected_owner to confirm via AccountNFTs (works on any node); omit it to\nread the owner via Clio nft_info. Idempotent \u2014 safe to call repeatedly.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/transfer/sync",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "transfer",
        "sync"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    },
    {
     "name": "Founding Gallery",
     "request": {
      "method": "GET",
      "description": "Public gallery of all completed founding aliases with their fractal identities.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/gallery",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "gallery"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Check XRPL account balance and reserve safety for NFT claim",
     "request": {
      "method": "GET",
      "description": "Return an account's XRP balance and whether it has enough to accept an NFT offer.\n\nUsed by the claim page to warn users before they hit tecINSUFFICIENT_RESERVE.\nSafe to call unauthenticated \u2014 only reads public ledger data.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/founding/xrpl-balance/:xrpl_address",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "founding",
        "xrpl-balance",
        ":xrpl_address"
       ],
       "variable": [
        {
         "key": "xrpl_address",
         "value": "rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7"
        }
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "standard-registration",
   "description": "Register and renew standard names with a wallet.",
   "item": [
    {
     "name": "Names Status",
     "request": {
      "method": "GET",
      "description": "Public config probe (spec \u00a71.8) \u2014 lets the xApp show/hide the claim tab.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/status",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "status"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Names Signin",
     "request": {
      "method": "POST",
      "description": "Issue a single-use nonce and the Xaman SignIn payload bound to it.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/signin",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "signin"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\"\n}"
      }
     }
    },
    {
     "name": "Names Register",
     "request": {
      "method": "POST",
      "description": "Register a dotted standard name to the SIGNED wallet (365-day tenure).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/register",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "register"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"payload_uuid\": \"00000000-0000-4000-8000-000000000000\"\n}"
      }
     }
    },
    {
     "name": "Names Renew",
     "request": {
      "method": "POST",
      "description": "Renew for another term. The fresh SignIn is the activity proof (spec \u00a71.5).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/renew",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "renew"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"payload_uuid\": \"00000000-0000-4000-8000-000000000000\"\n}"
      }
     }
    },
    {
     "name": "Names Rotate Receive",
     "request": {
      "method": "POST",
      "description": "Point receive at a different address \u2014 SignIn-bound, screened, evicted (\u00a71.3).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/rotate-receive",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "rotate-receive"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"payload_uuid\": \"00000000-0000-4000-8000-000000000000\",\n  \"receive_address\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\"\n}"
      }
     }
    },
    {
     "name": "Names Available",
     "request": {
      "method": "GET",
      "description": "Availability with the standard lifecycle states: `cooldown` during RoFR\n(never 'available' \u2014 spec \u00a74), revoked reported as `reserved` (no\nadvertising takedowns).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/names/available/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "names",
        "available",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "agent-selfreg",
   "description": "Agents register their own pay:agent.* names.",
   "item": [
    {
     "name": "Agent Register",
     "request": {
      "method": "POST",
      "description": "Self-register a free pay:agent.<label> alias, gated by an AgentAuthorityCredential VP.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/agents/register",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "agents",
        "register"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:agent.example\",\n  \"presentation\": {},\n  \"nonce\": \"c2FtcGxlLW5vbmNl\"\n}"
      }
     }
    },
    {
     "name": "Agent Anchor Proof",
     "request": {
      "method": "GET",
      "description": "Merkle inclusion proof for a registered agent alias against its batch's on-chain root.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/agents/anchor-proof/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "agents",
        "anchor-proof",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "brand-namespace",
   "description": "Prove control of a domain to claim a brand namespace.",
   "item": [
    {
     "name": "Brand Challenge",
     "request": {
      "method": "POST",
      "description": "Issue a single-use nonce. The company signs the returned document with an assertionMethod key.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/brand/challenge",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "brand",
        "challenge"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"label\": \"example\",\n  \"did\": \"did:pkh:xrpl:0:rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"wallet\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\"\n}"
      }
     }
    },
    {
     "name": "Brand Prove",
     "request": {
      "method": "POST",
      "description": "Verify the signed challenge against the company's live DID document, then claim the root.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/brand/prove",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "brand",
        "prove"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"label\": \"example\",\n  \"did\": \"did:pkh:xrpl:0:rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"wallet\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\",\n  \"proof\": {}\n}"
      }
     }
    },
    {
     "name": "Brand Status List",
     "request": {
      "method": "GET",
      "description": "The brand revocation list, built from the database on every request (no deployed file).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/brand/status/revocation",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "brand",
        "status",
        "revocation"
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "leases",
   "description": "Lease a name to a wallet for a fixed term.",
   "item": [
    {
     "name": "Create Lease",
     "request": {
      "method": "POST",
      "description": "Create or renew a lease over a non-founding name the caller's tenant owns.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/leases",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "leases"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias_name\": \"pay:dnsofmoney\",\n  \"lessee_address\": \"rawcpsYWnGTFQQGx19F7YguBXPXugA3ng7\"\n}"
      }
     }
    },
    {
     "name": "Reconcile Leases",
     "request": {
      "method": "POST",
      "description": "Lapse the caller's expired leases (term ended \u2192 cooldown). Idempotent.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/leases/reconcile",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "leases",
        "reconcile"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Get Lease",
     "request": {
      "method": "GET",
      "description": "Return the current lease for a name (most recent active or lapsed).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/leases/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "leases",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Revoke Lease",
     "request": {
      "method": "POST",
      "description": "Owner ends an active lease early; the name enters cooldown with RoFR.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/leases/:alias_name/revoke",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "leases",
        ":alias_name",
        "revoke"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    }
   ]
  },
  {
   "name": "identity",
   "description": "Identity art and NFT metadata for a name.",
   "item": [
    {
     "name": "Identity Preview",
     "request": {
      "method": "GET",
      "description": "Public 256\u00d7256 PNG preview \u2014 shows evolved genome if available, else seed.",
      "url": {
       "raw": "{{baseUrl}}/identity/preview/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "identity",
        "preview",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Nft Metadata",
     "request": {
      "method": "GET",
      "description": "Public NFT metadata JSON \u2014 this is the URI stored in the XRPL NFT.\n\nServes real data from DB when available; falls back to seed genome\nfor aliases not yet in the DB.",
      "url": {
       "raw": "{{baseUrl}}/nft/:alias_slug",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "nft",
        ":alias_slug"
       ],
       "variable": [
        {
         "key": "alias_slug",
         "value": "dnsofmoney"
        }
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "send",
   "description": "Preview, create and track a payment to a name.",
   "item": [
    {
     "name": "Get Send Status",
     "request": {
      "method": "GET",
      "description": "Look up the current status of a send-to-alias transaction.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/send/status/:transaction_id",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "send",
        "status",
        ":transaction_id"
       ],
       "variable": [
        {
         "key": "transaction_id",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Preview Send",
     "request": {
      "method": "GET",
      "description": "Dry-run: resolve a pay:name and show where money would go.\nNo payment is executed. Public endpoint \u2014 no API key required.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/send/preview/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "send",
        "preview",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Create Send Payment",
     "request": {
      "method": "POST",
      "description": "Public endpoint \u2014 creates a Xaman payment payload for wallet-to-wallet send.\nNo API key required. The platform never touches the funds.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/send/create-payment",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "send",
        "create-payment"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias\": \"pay:dnsofmoney\",\n  \"amount\": 1.0\n}"
      }
     }
    },
    {
     "name": "Send To Alias",
     "request": {
      "method": "POST",
      "description": "Send money to a pay:name alias. Resolves globally, routes to best rail,\nexecutes payment from platform wallet.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/send",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "send"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"alias\": \"pay:dnsofmoney\",\n  \"amount\": 1.0,\n  \"idempotency_key\": \"order-1001\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "deliver",
   "description": "Quote delivery of a payment in another asset or chain.",
   "item": [
    {
     "name": "Deliver Quote",
     "request": {
      "method": "POST",
      "description": "Quote how a payment to a name can arrive in another asset or chain.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/deliver/quote",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "deliver",
        "quote"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"to\": \"pay:dnsofmoney\",\n  \"amount\": \"1.00\",\n  \"from_asset\": \"USDC\",\n  \"from_network\": \"eip155:8453\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "swap",
   "description": "Quote and verify a swap before a payment.",
   "item": [
    {
     "name": "Swap Quote",
     "request": {
      "method": "GET",
      "description": "Resolve the alias and return a delegated-swap quote. No money moves here.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/swap/quote/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "swap",
        "quote",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ],
       "query": [
        {
         "key": "from_symbol",
         "value": "USDC"
        },
        {
         "key": "from_chain",
         "value": "base"
        },
        {
         "key": "amount_in",
         "value": "1.00"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Swap Verify",
     "request": {
      "method": "POST",
      "description": "Confirm the destination XRP payment is finalized on the XRP Ledger. Read-only \u2014\nno wallet, no funds. This is how Project O 'closes the loop' on a swap without ever\nhaving touched the money: the provider delivered XRP, we prove it on-chain.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/swap/verify",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "swap",
        "verify"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"xrpl_tx_hash\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "onramp",
   "description": "Buy crypto with fiat through a third-party provider.",
   "item": [
    {
     "name": "Onramp Address",
     "request": {
      "method": "GET",
      "description": "Resolve a pay:name to the XRPL destination address the on-ramp widget should\ndeliver to. Public endpoint \u2014 no API key. No money moves here.\n\n`currency` (default \"xrp\") selects the deliver asset. For \"rlusd\" the alias\nwallet MUST already hold an RLUSD trust line \u2014 otherwise MoonPay's delivery\nwould bounce (tecNO_LINE), so we refuse the address up front (422) rather\nthan hand out one that cannot receive RLUSD.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/onramp/address/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "onramp",
        "address",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Onramp Sign",
     "request": {
      "method": "POST",
      "description": "HMAC-SHA256 sign a MoonPay widget URL. The secret never leaves the server.\n\nMoonPay's scheme: signature = base64(HMAC_SHA256(secretKey, <query string incl. '?'>)).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/onramp/sign",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "onramp",
        "sign"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{}"
      }
     }
    }
   ]
  },
  {
   "name": "x402",
   "description": "Pay per call over the HTTP 402 handshake.",
   "item": [
    {
     "name": "Pay",
     "request": {
      "method": "GET",
      "description": "x402 pay-to-alias: 402 challenge, then verify + record a submitted payment.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/pay/:alias_label",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "pay",
        ":alias_label"
       ],
       "variable": [
        {
         "key": "alias_label",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Screen Counterparty",
     "request": {
      "method": "GET",
      "description": "Paid counterparty screen: pay the fee, get an OFAC + resolution attestation about\na caller-named target (a `pay:` alias or a raw any-chain address).\n\nThe FEE is an x402 payment to our screening-service alias at ITS declared price \u2014 the\ncaller never names the amount, so the price of the screen is server-set (this is the\nenforced-pricing feature applied to our own service). Off the money path: we verify +\nrecord the fee, then run the deterministic screen; we never custody or submit funds.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/screen/:target",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "screen",
        ":target"
       ],
       "variable": [
        {
         "key": "target",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Screen Counterparty Xlayer",
     "request": {
      "method": "GET",
      "description": "X-Layer-native counterparty screen \u2014 the same paid screen with the fee\ncurrency defaulting to USDT0 on X Layer, so a bare GET advertises a pure\neip155:196 challenge paying USDT0 (the token OKX mandates).\n\nExists because marketplace reviewers probe the listed URL with a bare GET and\nexpect THEIR chain AND token in the 402. OKX rejected listing #7190 twice over\nthis \u2014 first the network (eip155:196), then the token (USDT0) \u2014 see memory\nproject_okx_asp_listing. A per-rail alias keeps each marketplace's challenge\nshape independent: this is the URL listed on OKX.AI, while the plain /screen\nroute keeps its Algorand default for the Algorand x402 Challenge.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/screen-xlayer/:target",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "screen-xlayer",
        ":target"
       ],
       "variable": [
        {
         "key": "target",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Paid Resolve",
     "request": {
      "method": "GET",
      "description": "Pay-per-call full resolve: pay the fee, get the alias's tier-2 resolution.\n\nThe pay-per-call alternative to an API key for GET /resolve/{alias}. The FEE is an x402\npayment to our resolve-fee alias at ITS declared price, so the caller never names the\namount. Off the money path: we verify and record the fee, then return a read of the\ndeterministic resolver. We never custody or submit funds, and no model is involved.\n\nA caller is never charged for an alias that does not resolve: the alias is looked up\nfirst, and an unresolvable one returns 404 before any 402 challenge. That lookup tells\na caller only what the free tier-0 resolve already tells them.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/resolve/:alias_name",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "resolve",
        ":alias_name"
       ],
       "variable": [
        {
         "key": "alias_name",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Presend Address Safety",
     "request": {
      "method": "GET",
      "description": "Paid pre-send address safety: pay the fee, get deterministic evidence about the\naddress you are about to pay.\n\nHTTP 402 on this route means EXACTLY ONE THING: x402 payment required, before\nsettlement. A risky or sanctioned target is reported as a verdict inside a 200 \u2014 it\nis a finding about a third party the caller named, not a block of the caller's own\npayment. Letting a compliance 402 escape here would make the payer's x402 client read\nit as \"pay me\", pay again, and loop (spec T1). Do not change this.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/presend",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "presend"
       ],
       "query": [
        {
         "key": "target",
         "value": "pay:dnsofmoney"
        }
       ]
      },
      "header": []
     }
    },
    {
     "name": "Buy Plan",
     "request": {
      "method": "GET",
      "description": "Buy an API plan for the caller's tenant: pay the plan price, get the plan.\n\nNeeds an API key, because the key says WHICH tenant gets the plan. Each settled\npayment adds X402_PLAN_DAYS to the plan (from now, or from the current expiry if the\nsame plan is still live). The base plan is kept and returns on expiry.\n\nThe server sets the price; the caller never names it. Off the money path: we verify\nand record the payment to our own fee alias. We never custody or submit funds.\n\nNot granted: an exempt payer (nothing moved) and an idempotent replay (already\ngranted once). If the grant itself fails after a real payment, the route returns 500\nwith the transaction id and logs it, so an operator can grant the plan by hand.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/x402/plan/:plan",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "x402",
        "plan",
        ":plan"
       ],
       "variable": [
        {
         "key": "plan",
         "value": "standard"
        }
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "mcp",
   "description": "The Model Context Protocol server for AI agents.",
   "item": [
    {
     "name": "Server Card",
     "request": {
      "method": "GET",
      "description": "MCP server card \u2014 what any agent sees on discovery.",
      "url": {
       "raw": "{{baseUrl}}/mcp",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "mcp"
       ]
      },
      "header": []
     }
    },
    {
     "name": "List Tools",
     "request": {
      "method": "GET",
      "description": "MCP tool discovery \u2014 full inputSchemas for reflection-based clients.",
      "url": {
       "raw": "{{baseUrl}}/mcp/tools",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "mcp",
        "tools"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Metrics",
     "request": {
      "method": "GET",
      "description": "Phase-0 usage counters \u2014 tool calls, failures, unique callers.",
      "url": {
       "raw": "{{baseUrl}}/mcp/metrics",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "mcp",
        "metrics"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Call Tool",
     "request": {
      "method": "POST",
      "description": "Execute an MCP tool against the live resolver, tier-redacted for the caller.",
      "url": {
       "raw": "{{baseUrl}}/mcp/tools/call",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "mcp",
        "tools",
        "call"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": true
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"tool\": \"resolve_alias\"\n}"
      }
     }
    },
    {
     "name": "Mcp Rpc",
     "request": {
      "method": "POST",
      "description": "MCP streamable-HTTP JSON-RPC endpoint: initialize / tools/list / tools/call / ping.",
      "url": {
       "raw": "{{baseUrl}}/mcp/rpc",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "mcp",
        "rpc"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": true
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/list\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "a2a",
   "description": "The Agent2Agent card and JSON-RPC endpoint.",
   "item": [
    {
     "name": "Agent Card",
     "request": {
      "method": "GET",
      "description": "A2A AgentCard \u2014 the discovery document (RFC 8615 well-known path).",
      "url": {
       "raw": "{{baseUrl}}/.well-known/agent-card.json",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        ".well-known",
        "agent-card.json"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Agent Card Legacy Path",
     "request": {
      "method": "GET",
      "description": "Pre-0.3 discovery path; serves the identical card.",
      "url": {
       "raw": "{{baseUrl}}/.well-known/agent.json",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        ".well-known",
        "agent.json"
       ]
      },
      "header": []
     }
    },
    {
     "name": "A2A Rpc",
     "request": {
      "method": "POST",
      "description": "A2A JSON-RPC 2.0 endpoint \u2014 both 1.0 and legacy 0.3 method names.",
      "url": {
       "raw": "{{baseUrl}}/a2a/v1",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "a2a",
        "v1"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": true
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tasks/list\",\n  \"params\": {}\n}"
      }
     }
    }
   ]
  },
  {
   "name": "ap2",
   "description": "Agent Payments Protocol purchase intake.",
   "item": [
    {
     "name": "Ap2 Purchase",
     "request": {
      "method": "POST",
      "description": "Verify a settled XRPL payment to a pay: alias and emit the AP2 Cart + Payment mandates.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/ap2/purchase",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "ap2",
        "purchase"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"intent\": {\n    \"natural_language_description\": \"Pay 1 XRP to pay:dnsofmoney\",\n    \"intent_expiry\": \"2026-11-05T00:00:00Z\"\n  },\n  \"alias\": \"pay:dnsofmoney\",\n  \"amount\": \"1.00\",\n  \"tx_hash\": \"EA8159536A8D557492AF64421EBD78BC0C185A31DCC7CC4F1CAE553245BADBDA\"\n}"
      }
     }
    }
   ]
  },
  {
   "name": "trust",
   "description": "Sample credentials from the did:web trust layer.",
   "item": [
    {
     "name": "Sample Credential",
     "request": {
      "method": "GET",
      "description": "Serve the fixed, real, signed sample credential (see app/trust/sample.py).",
      "url": {
       "raw": "{{baseUrl}}/api/v1/trust/sample-credential",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "trust",
        "sample-credential"
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "xapp",
   "description": "The backend for the Xaman xApp.",
   "item": [
    {
     "name": "Exchange a Xaman OTT for a backend JWT + session context",
     "request": {
      "method": "POST",
      "description": "Frontend posts {ott} \u2192 we call Xaman's /platform/xapp/ott/{token} with the\nAPI secret, then return {jwt, context}. The Xaman API secret NEVER leaves\nthis backend.",
      "url": {
       "raw": "{{baseUrl}}/xapp/ott",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "xapp",
        "ott"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"ott\": \"00000000-0000-4000-8000-000000000000\"\n}"
      }
     }
    },
    {
     "name": "Return the JWT-bound session (smoke-test for the Bearer round-trip)",
     "request": {
      "method": "GET",
      "description": "JWT-protected echo. Returns the account, network, and token lifetime \u2014\nuseful for confirming the frontend\u2192backend Bearer round-trip works.",
      "url": {
       "raw": "{{baseUrl}}/xapp/me",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "xapp",
        "me"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Record one client-side xApp sign-funnel event (best-effort telemetry)",
     "request": {
      "method": "POST",
      "description": "The xApp posts funnel events the backend/Xaman can't observe (did the sign\nrequest surface? rejected? timed out? deeplink fallback used?). Identity\n(account, network) is taken from the verified JWT, never the body. Unknown\nflow/event strings are kept (truncated) rather than rejected \u2014 a telemetry\nwrite must never become a client-facing error.\n\nTerminal outcomes (signed / rejected / timeout) also push a one-line\nTelegram alert via ALERT_WEBHOOK_URL, queued post-response so it never\nadds latency to the client.",
      "url": {
       "raw": "{{baseUrl}}/xapp/event",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "xapp",
        "event"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"flow\": \"register\",\n  \"event\": \"opened\"\n}"
      }
     }
    },
    {
     "name": "Admin-only: recent xApp sign-funnel events (X-Admin-Key = live API key)",
     "request": {
      "method": "GET",
      "description": "Read the client telemetry funnel, newest first. Read-only, off the money path.",
      "url": {
       "raw": "{{baseUrl}}/xapp/events",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "xapp",
        "events"
       ]
      },
      "header": []
     }
    }
   ]
  },
  {
   "name": "access-requests",
   "description": "Request an API key and review requests.",
   "item": [
    {
     "name": "List Access Requests",
     "request": {
      "method": "GET",
      "description": "List API key requests. Operators only.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/access-requests",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "access-requests"
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Submit Access Request",
     "request": {
      "method": "POST",
      "description": "Request an API key. The key arrives after email verification.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/access-requests",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "access-requests"
       ]
      },
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "body": {
       "mode": "raw",
       "raw": "{\n  \"name\": \"Example Agent\",\n  \"email\": \"dev@example.com\"\n}"
      }
     }
    },
    {
     "name": "Verify Access Request",
     "request": {
      "method": "GET",
      "description": "Consume an emailed token and issue the free developer key, shown once.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/access-requests/verify",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "access-requests",
        "verify"
       ]
      },
      "header": []
     }
    },
    {
     "name": "Approve Access Request",
     "request": {
      "method": "POST",
      "description": "Approve an API key request. Operators only.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/access-requests/:request_id/approve",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "access-requests",
        ":request_id",
        "approve"
       ],
       "variable": [
        {
         "key": "request_id",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    },
    {
     "name": "Reject Access Request",
     "request": {
      "method": "POST",
      "description": "Reject an API key request. Operators only.",
      "url": {
       "raw": "{{baseUrl}}/api/v1/access-requests/:request_id/reject",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "api",
        "v1",
        "access-requests",
        ":request_id",
        "reject"
       ],
       "variable": [
        {
         "key": "request_id",
         "value": "00000000-0000-4000-8000-000000000000"
        }
       ]
      },
      "header": [
       {
        "key": "X-API-Key",
        "value": "{{apiKey}}",
        "disabled": false
       }
      ]
     }
    }
   ]
  },
  {
   "name": "system",
   "description": "Service health.",
   "item": [
    {
     "name": "Health Check",
     "request": {
      "method": "GET",
      "description": "Return the service status and the state of Redis and the XRPL node.",
      "url": {
       "raw": "{{baseUrl}}/health",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "health"
       ]
      },
      "header": []
     }
    }
   ]
  }
 ]
}
