Skip to main content
API reference

Servers

Generated HTTP reference for the 4 operations the published OpenAPI document describes under servers.

7 min read
View MarkdownEdit on GitHub

Servers

This page is generated from the published OpenAPI document. It is complete with respect to that document and says nothing about surfaces the document does not describe yet. See what is generated here for what that means.

Base URL: https://api.codespar.dev

Every operation below requires a Bearer token. See Authentication.

The Servers API lets you browse CodeSpar's catalog of MCP servers. Each server represents an integration with a commerce provider -- a payment gateway, shipping carrier, fiscal authority, messaging platform, banking API, ERP system, or crypto exchange.

Use the Servers API to understand what integrations are available, discover capabilities before creating sessions, and build dynamic UIs that show users which providers they can connect.

Base URL: https://api.codespar.dev

All endpoints require authentication via Bearer token. See Authentication.


GET /v1/servers

Returns the server catalog with filtering and search capabilities. Results are paginated.

Auth required: Yes (scope: servers:read)

Query parameters

ParameterTypeDefaultDescription
categorystring--Filter by category: payments, fiscal, logistics, messaging, banking, erp, crypto
countrystring--Filter by country code (ISO 3166-1 alpha-2): BR, MX, AR, CO, CL
qstring--Full-text search across server name, description, and capabilities
statusstring--Filter by status: stable, beta, alpha, deprecated
auth_typestring--Filter by auth type: api_key, path_secret, oauth, cert, hmac_signed, none
limitnumber50Results per page (max 100)
offsetnumber0Pagination offset

Response schema

{
  "data": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "category": "string",
      "countries": ["string"],
      "capabilities": ["string"],
      "auth_type": "string",
      "status": "string",
      "tools_count": "number",
      "icon_url": "string"
    }
  ],
  "total": "number",
  "limit": "number",
  "offset": "number"
}

Example: list all servers

curl "https://api.codespar.dev/v1/servers" \
  -H "Authorization: Bearer csk_live_abc123..."

Response -- 200 OK:

{
  "data": [
    {
      "id": "stripe",
      "name": "Stripe",
      "description": "Global payment processing platform. Supports cards, Pix, boleto, and 135+ currencies.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["checkout", "subscriptions", "refunds", "pix", "boleto", "cards"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 12,
      "icon_url": "https://codespar.dev/icons/stripe.svg"
    },
    {
      "id": "mercadopago",
      "name": "Mercado Pago",
      "description": "Latin America's leading payment platform. Native Pix, boleto, and Mercado Credito.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["pix", "boleto", "checkout", "wallet", "installments"],
      "auth_type": "oauth",
      "status": "stable",
      "tools_count": 15,
      "icon_url": "https://codespar.dev/icons/mercadopago.svg"
    }
  ],
  "total": 114,
  "limit": 50,
  "offset": 0
}

Example: filter by category

Retrieve only payment servers:

curl "https://api.codespar.dev/v1/servers?category=payments" \
  -H "Authorization: Bearer csk_live_abc123..."

Response -- 200 OK:

{
  "data": [
    {
      "id": "stripe",
      "name": "Stripe",
      "description": "Global payment processing platform. Supports cards, Pix, boleto, and 135+ currencies.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["checkout", "subscriptions", "refunds", "pix", "boleto", "cards"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 12,
      "icon_url": "https://codespar.dev/icons/stripe.svg"
    },
    {
      "id": "asaas",
      "name": "Asaas",
      "description": "Brazilian payment platform specializing in Pix, boleto, and recurring billing.",
      "category": "payments",
      "countries": ["BR"],
      "capabilities": ["pix", "boleto", "subscriptions", "split_payments"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 10,
      "icon_url": "https://codespar.dev/icons/asaas.svg"
    }
  ],
  "total": 12,
  "limit": 50,
  "offset": 0
}

Example: filter by country

Retrieve servers available in Mexico:

curl "https://api.codespar.dev/v1/servers?country=MX" \
  -H "Authorization: Bearer csk_live_abc123..."

Response -- 200 OK:

{
  "data": [
    {
      "id": "stripe",
      "name": "Stripe",
      "description": "Global payment processing platform. Supports cards, Pix, boleto, and 135+ currencies.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["checkout", "subscriptions", "refunds", "pix", "boleto", "cards"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 12,
      "icon_url": "https://codespar.dev/icons/stripe.svg"
    },
    {
      "id": "conekta",
      "name": "Conekta",
      "description": "Mexican payment platform. Native SPEI, OXXO cash payments, and card processing.",
      "category": "payments",
      "countries": ["MX"],
      "capabilities": ["spei", "oxxo", "cards", "checkout"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 8,
      "icon_url": "https://codespar.dev/icons/conekta.svg"
    },
    {
      "id": "cfdi",
      "name": "CFDI",
      "description": "Mexican fiscal document generation (Comprobante Fiscal Digital por Internet) via SAT.",
      "category": "fiscal",
      "countries": ["MX"],
      "capabilities": ["cfdi_ingreso", "cfdi_egreso", "cfdi_traslado", "cancelation"],
      "auth_type": "cert",
      "status": "stable",
      "tools_count": 6,
      "icon_url": "https://codespar.dev/icons/cfdi.svg"
    }
  ],
  "total": 18,
  "limit": 50,
  "offset": 0
}

Search for servers that support Pix:

curl "https://api.codespar.dev/v1/servers?q=pix" \
  -H "Authorization: Bearer csk_live_abc123..."

Response -- 200 OK:

{
  "data": [
    {
      "id": "stripe",
      "name": "Stripe",
      "description": "Global payment processing platform. Supports cards, Pix, boleto, and 135+ currencies.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["checkout", "subscriptions", "refunds", "pix", "boleto", "cards"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 12,
      "icon_url": "https://codespar.dev/icons/stripe.svg"
    },
    {
      "id": "mercadopago",
      "name": "Mercado Pago",
      "description": "Latin America's leading payment platform. Native Pix, boleto, and Mercado Credito.",
      "category": "payments",
      "countries": ["BR", "MX", "AR", "CO", "CL"],
      "capabilities": ["pix", "boleto", "checkout", "wallet", "installments"],
      "auth_type": "oauth",
      "status": "stable",
      "tools_count": 15,
      "icon_url": "https://codespar.dev/icons/mercadopago.svg"
    },
    {
      "id": "asaas",
      "name": "Asaas",
      "description": "Brazilian payment platform specializing in Pix, boleto, and recurring billing.",
      "category": "payments",
      "countries": ["BR"],
      "capabilities": ["pix", "boleto", "subscriptions", "split_payments"],
      "auth_type": "api_key",
      "status": "stable",
      "tools_count": 10,
      "icon_url": "https://codespar.dev/icons/asaas.svg"
    }
  ],
  "total": 5,
  "limit": 50,
  "offset": 0
}

Example: combine filters

Retrieve stable payment servers in Brazil:

curl "https://api.codespar.dev/v1/servers?category=payments&country=BR&status=stable" \
  -H "Authorization: Bearer csk_live_abc123..."

GET /v1/servers/:id/tools

Returns a server's tool list with input schemas. (There is no standalone GET /v1/servers/:id: server metadata comes from the list endpoint's rows; this endpoint serves the tools; GET /v1/servers/:id/auth-schema serves the credential shape the connect flow needs.)

Auth required: Yes (scope: servers:read)

curl example

curl https://api.codespar.dev/v1/servers/stripe/tools \
  -H "Authorization: Bearer csk_live_abc123..."

Response -- 200 OK

{
  "tools": [
    {
      "name": "stripe_create_checkout_session",
      "description": "Create a Stripe Checkout session with a payment link",
      "input_schema": {
        "type": "object",
        "properties": {
          "line_items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "price_data": {
                  "type": "object",
                  "properties": {
                    "currency": { "type": "string" },
                    "product_data": {
                      "type": "object",
                      "properties": {
                        "name": { "type": "string" }
                      }
                    },
                    "unit_amount": { "type": "number" }
                  }
                },
                "quantity": { "type": "number" }
              }
            }
          },
          "mode": {
            "type": "string",
            "enum": ["payment", "subscription", "setup"]
          },
          "success_url": { "type": "string" },
          "cancel_url": { "type": "string" }
        },
        "required": ["line_items", "mode"]
      }
    },
    {
      "name": "stripe_create_refund",
      "description": "Refund a Stripe payment",
      "input_schema": {
        "type": "object",
        "properties": {
          "payment_intent": { "type": "string", "description": "ID of the PaymentIntent to refund" },
          "amount": { "type": "number", "description": "Amount to refund in cents (partial refund). Omit for full refund." },
          "reason": { "type": "string", "enum": ["duplicate", "fraudulent", "requested_by_customer"] }
        },
        "required": ["payment_intent"]
      }
    }
  ]
}

Server-specific tools (like stripe_create_checkout_session) are only available in sessions that connect to that server. The 15 meta-tools are always available regardless of which servers are connected.


Server categories

CategoryExamples
paymentsStripe, Mercado Pago, Asaas, PagSeguro, Pagarme, Conekta, Inter, Sicredi
fiscalNF-e, NFS-e, SPED, CT-e, MDFe, CFDI
logisticsCorreios, Jadlog, Loggi, Mercado Envios, Total Express, DHL, Estafeta
messagingTwilio, WhatsApp Business, SendGrid, Mailgun, Amazon SNS
bankingInter, Itau, Bradesco, Banco do Brasil, Sicoob, Nubank
erpBling, Tiny, Omie, TOTVS, ContaAzul, Nuvemshop
cryptoMercado Bitcoin, Foxbit, Binance Pay, Coinbase Commerce

Per-category counts change as the catalog grows; query GET /v1/servers?category=<name> for live numbers.

Server status values

StatusDescriptionRecommendation
stableProduction-ready, fully tested, SLA-backedSafe for production use
betaFunctional but may have breaking changes in minor versionsSafe for staging; pin the server version in production
alphaExperimental, limited support, may be removedDevelopment and testing only
deprecatedScheduled for removal; an alternative is availableMigrate to the suggested replacement

Authentication types

Each server requires one of these authentication methods, configured in the Auth Configs section of the dashboard:

Auth typeDescriptionExamples
api_keyAuthenticate with a secret key from the providerStripe, Asaas, SendGrid
path_secretSecrets embedded in URL path plus optional companion headerZ-API, Take Blip, Evolution API
oauthOAuth 2.0 flow for user-level accessMercado Pago, Melhor Envio
certmTLS with X.509 client certificate (PEM)Banco do Brasil, Itaú, Bradesco, Santander, Caixa, Sicoob, Sicredi, C6, Original
hmac_signedPer-request HMAC signature over timestamp + method + path + bodyFoxbit
jwt_ecdsaPer-request ES256 JWT signed with an ECDSA P-256 private keyCoinbase Developer Platform
two_headerTwo co-equal credential headers, no Authorization BearerCielo, Transbank, Kushki, Payway
noneNo credentials requiredBrasil API

Rate limits

The catalog reads on this page (GET /v1/servers, /v1/servers/:id/tools, /v1/servers/:id/auth-schema) carry no rate limit of their own. The limiter that exists applies to tool execution, and it is not tiered by plan.

It is a token bucket keyed by (account, server) — so the budget is per upstream provider, not per API key and not per plan. The default bucket is a capacity of 60 with 1 token/second of refill; a few providers that publish generous ceilings get more (Stripe 300 / 25 per second, Asaas 120 / 10 per second). Buckets are held in the API process, so a multi-replica deployment gives each replica its own.

Exceeding it answers 429 with a Retry-After header in seconds and retry_after_ms in the body:

{
  "error": "rate_limited",
  "server": "asaas",
  "retry_after_ms": 1400,
  "message": "Rate limit reached for server \"asaas\". Retry in ~2s."
}

There are no X-RateLimit-Limit / -Remaining / -Reset headers. Read Retry-After and back off with jitter.

Rate limits are not billing — see Billing for the pricing model.

Error responses

StatusError codeDescription
400invalid_queryInvalid query parameter value
401unauthorizedInvalid or missing API key
403forbiddenThe key does not hold the servers:read scope
404not_foundServer ID does not exist in the catalog

429 rate_limited does not appear on these three endpoints — it belongs to tool execution, on POST /v1/sessions/:id/tool-calls.

Next steps

Every operation, from the spec

Generated from the published OpenAPI document, so it never drifts from what the API actually serves. The section above is written by hand and carries what a schema cannot: the object model, field rules, and the order to call things in.

GET /v1/servers

List the MCP servers this project can attach to a session

Query parameters

NameTypeRequiredDescription
categorystringno
countrystringno
qstringno

Responses

StatusBodyDescription
200objectOK
400objectBad Request — the body or query did not match the schema.

Response 200

FieldTypeRequiredDescription
filteredintegeryes
serversarray of ServerCatalogRowyes
totalintegeryes

Example response

{
  "total": 0,
  "filtered": 0,
  "servers": [
    {
      "id": "servercatalogrow_0000000000000000",
      "name": "Example",
      "pkg": "string",
      "category": "string",
      "country": "string",
      "auth_type": "string",
      "tools_count": 1,
      "status": "string",
      "sandbox_available": true,
      "subaccount_provisionable": true,
      "engine_provisionable": true,
      "engine_status": "none"
    }
  ]
}

Example request

curl -X GET https://api.codespar.dev/v1/servers \
  -H "Authorization: Bearer $CODESPAR_API_KEY"

GET /v1/servers/{id}/auth-schema

Read the credential form a provider needs, without reading any credential

Path parameters

NameTypeRequiredDescription
idstringyesThe provider id, which is also the catalog row's primary key.

Responses

StatusBodyDescription
200objectOK
404objectThe provider is not visible to this project. Not the apiError envelope and not \{ error: "not_found" \}: a third shape, built at the route.

Response 200

FieldTypeRequiredDescription
auth_typestringyesLEFT OPEN ON PURPOSE, and the reason is measured rather than cautious. The column admits nine values today — api_key, path_secret, oauth, cert, none, hmac_signed, jwt_ecdsa, two_header, cdp — under a CHECK constraint that has been widened four times (migrations 0064, 0066, 0074, 0091, over the six of 0026). The handler casts the column straight into this field, so the set of values a client can receive is the DB's, not any narrower published enum. Closing this to six would describe a wire that already carries more.
base_urlstringyesThe host a call to this provider will be sent to, in the caller's environment. Empty string when the provider has no endpoint row.
environment"live" | "test"yesTaken from the calling credential, and what base_url was resolved against.
fieldsarray of objectyesIn the order the form should render, which is the catalog's declared order: the visible field before the masked one for the multi-field types.
oauth_authorize_urlstring,nullyesWhere the browser leg starts, environment-resolved the same way. Null for every auth type other than oauth, and also null for an oauth provider with no configuration row.
server_idstringyes

Example response

{
  "server_id": "srv_0000000000000000",
  "auth_type": "string",
  "environment": "live",
  "base_url": "https://example.com/hook",
  "fields": [
    {
      "name": "Example",
      "kind": "api_key",
      "label": "Example",
      "header_name": "Example"
    }
  ]
}

Example request

curl -X GET https://api.codespar.dev/v1/servers/{id}/auth-schema \
  -H "Authorization: Bearer $CODESPAR_API_KEY"

GET /v1/servers/{id}/tools

List the tools a provider exposes

Path parameters

NameTypeRequiredDescription
idstringyesThe provider id.

Responses

StatusBodyDescription
200objectOK
404objectThe provider is not visible to this project. Not the apiError envelope and not \{ error: "not_found" \}: a third shape, built at the route.

Response 200

FieldTypeRequiredDescription
server_idstringyesEchoes the id from the path, whether or not it named anything.
toolsarray of objectyes
totalintegeryesAlways equal to the length of tools.

Example response

{
  "server_id": "srv_0000000000000000",
  "total": 0,
  "tools": [
    {
      "name": "Example"
    }
  ]
}

Example request

curl -X GET https://api.codespar.dev/v1/servers/{id}/tools \
  -H "Authorization: Bearer $CODESPAR_API_KEY"

POST /v1/servers/{id}/verify-connection

Ask the provider whether this project's stored credential still works

Path parameters

NameTypeRequiredDescription
idstringyesThe provider id.

Responses

StatusBodyDescription
200objectOK
401objectprovider_rejected. The provider answered 401 or 403: it looked at the credential and said no. Retrying unchanged will fail the same way.
404object | objectTwo shapes under one status. The route's own gate answers \{ error, server_id \} before any work happens; the credential resolver answers the verify outcome's server_unknown when the provider is absent from the catalog. Parse the union.
409objectredirect_not_followed. The configured host answered 3xx. The probe is issued with redirects disabled on purpose, so the credential was never judged by anyone: this is the absence of a verdict, not a negative one. Retrying cannot change it; the host or the catalog entry has to.
424objectnot_connected. There is nothing to verify: either no active connection exists for this project and provider, or one exists and its stored credential did not resolve to a value. Connect the provider, or reconnect it.
501objectverify_unsupported. This provider ships neither a bespoke recipe nor a declared probe, so there is no safe read to issue. Nothing is wrong with the credential and nothing about it has been learned; the first real call is where authentication errors will surface.
502objectprovider_unreachable. EVERY non-2xx that is not a redirect and not a 401 or 403 lands here, together with network failures and the per-call timeout (10 seconds by default, deployment-configurable). That includes a provider's 400, 404, 409, 422 and 429. Only some of those are worth retrying, and status is the field that separates them.
503objectendpoint_missing. The provider is in the catalog but the row that says where to reach it is missing or contradicts how the connection was stored. A catalog or connection problem on our side, not a verdict on the credential and not a provider outage.

Response 200

FieldTypeRequiredDescription
accountobjectnoABSENT on the probe path, and absent on the recipe path whenever the recipe found nothing it recognised in the response. Present means the read reached a real account; absent does NOT mean it did not.
latency_msintegeryesWall-clock milliseconds around the outbound call.
oktrueyes
providerstringyesThe provider id from the path.

Example response

{
  "ok": true,
  "provider": "string",
  "account": {
    "id": "obj_0000000000000000",
    "name": "Example",
    "extras": {}
  },
  "latency_ms": 0
}

Example request

curl -X POST https://api.codespar.dev/v1/servers/{id}/verify-connection \
  -H "Authorization: Bearer $CODESPAR_API_KEY"
Servers | CodeSpar