Public catalog API

The two public, unauthenticated endpoints -- GET /v1/catalog and /v1/catalog/search.

These are the only fully public, unauthenticated endpoints PolymitaPay exposes — what wallet-mcp-server (or any other external client) uses to discover the approved catalog and search it. Everything else (registering a provider, admin actions, payouts) requires an authenticated account.

GET /v1/catalog

curl "https://api.polymitapay.com/v1/catalog?network=testnet"
Query paramValuesDefault
networktestnet | mainnetmainnet if omitted or anything else

Returns only providers that are both: status === "APPROVED" and network equal to the requested one. A provider pending review, rejected, suspended, or registered on the other network simply won't appear — see Troubleshooting if you expected one to.

Response shape

[
  {
    "id": "c3053eec-e0b9-42e3-b567-c6436104a240",
    "name": "Welcome Message!!",
    "tools": [
      {
        "toolName": "summarize",
        "description": "Summarizes a piece of text into 2-3 sentences.",
        "pricePerCall": "1000000",
        "pricePerCallRlusd": "1.5"
      }
    ]
  }
]

pricePerCall is in drops (1 XRP = 1,000,000 drops); pricePerCallRlusd is a plain decimal amount. description is owner-typed at registration — same trust model as toolName and price, never introspected from the real MCP server. Neither the provider's real mcpUrl nor its receivingWalletAddress is ever exposed here — consumers always go through PolymitaPay's own proxy, never straight to the real MCP.

GET /v1/catalog/search

Semantic search over the same approved+network-filtered catalog — matches by meaning, not just literal keyword overlap. wallet-mcp-server's polymitapay_search tool calls this instead of doing any search locally.

curl "https://api.polymitapay.com/v1/catalog/search?q=hello&network=testnet"
Query paramRequiredValues
qyesFree text — matched semantically against each tool's toolName + description.
networknotestnet | mainnet (same default as above).

Ranking runs on local embeddings (all-MiniLM-L6-v2, computed once per tool at registration/edit time) — no external API call happens per search.

Response shape

[
  {
    "providerId": "c3053eec-e0b9-42e3-b567-c6436104a240",
    "providerName": "Welcome Message!!",
    "toolName": "summarize",
    "description": "Summarizes a piece of text into 2-3 sentences.",
    "pricePerCall": "1000000",
    "pricePerCallRlusd": "1.5"
  }
]

Results are ordered by relevance (most relevant first), capped at 20.