---
title: "List provider catalog"
method: GET
path: "/api/provider-catalog"
tags: ["provider_calls"]
---

# List provider catalog

`GET /api/provider-catalog`

## Request

- Base URL: `https://beta.getsales.io/integrations/v1`
- URL: `https://beta.getsales.io/integrations/v1/api/provider-catalog`
- Auth: HTTP bearer and API key in header `Team-SID`

The priced operation registry: every (operation, provider, model) the platform can run, with its name, whether a platform key is configured (callable now), its pricing unit and the price triple (min, expected, max) in credits, whether it is cached, and the web search prices of a model that can search. What a run estimate multiplies (price_expected times the rows) and what the tool pickers render. Team-independent; the platform runs every vendor on its own key and resells the credits.

Contract:
- MCP tool `list_provider_catalog`, registry package `mcp.integrations/provider_calls`, mount `integrations.providers`.
- Operation `action`, response envelope `action`.
- Flags: read only.

## Response `200`

`action` success envelope.

- ListProviderCatalogResponse
  - `success` true, required
  - `operation` 'action', required
  - `action` string, required: kebab-case verb; matches the route segment.
  - `item` unknown, required
  - `result` object, required
    - `entries` object[], required: The catalog, one entry per priced operation.
      - `operation` 'llm.generate' | 'llm.embed' | 'email.find' | 'email.verify' | 'http.request' | 'crm.contact_upsert' | 'crm.company_upsert' | 'crm.associate' | 'crm.properties_list' | 'serp.search' | 'audio.transcribe', required: The operation.
      - `provider` 'openai' | 'anthropic' | 'google' | 'deepseek' | 'xai' | 'voyage' | 'cohere' | 'hunter' | 'findymail' | 'anymailfinder' | 'emaillistverify' | 'custom' | 'hubspot' | 'serper', required: The adapter.
      - `model` string, nullable, required: One entry per priced model on llm and audio operations; null elsewhere.
      - `name` string, required: Display name (Find email: Hunter).
      - `description` string, nullable, required: Display copy for the pickers.
      - `platform_key` boolean, required: true = a platform key is configured, callable now; a crm entry has none by design (it runs on the team's grant).
      - `pricing_unit` string, required: per_call (the rate is the product's own credit price for the vendor) | per_token (the vendor's dollars per token plus the product's margin, 2026-10-30: a call is billed on its own token counts).
      - `price_min` number, required: Credits, a quote with no prompt in hand: a per_call rate; for a per_token entry a short reference call (200 tokens in, 50 out).
      - `price_expected` number, required: Credits, the quote of a typical call (1,000 in, 300 out). A row of a Use AI column is priced on its own prompt instead: estimate_playtable_field_ai_cost.
      - `price_max` number, required: Credits, the quote of the reference prompt with the model's whole output cap.
      - `credits_per_mtok_input` number, nullable, required: per_token: the credits a million input tokens cost a team, the vendor's price with the margin at the rate; null on a per_call entry.
      - `credits_per_mtok_output` number, nullable, required: per_token: the same for output tokens; 0 where the vendor bills none (an embedding).
      - `max_tokens` integer, nullable, required: per_token: the model's completion cap, the ceiling of a row's price.
      - `cacheable` boolean, required: email.find and email.verify: a repeat is free.
      - `web_search` boolean, required: llm.generate: the model can run the vendor's web search.
      - `price_web_search` number, nullable, required: Credits per search (the vendor's fee with the margin) on top of the tokens; null when it cannot search.
      - `web_search_overhead_tokens` integer, nullable, required: The prompt tokens the vendor bills for declaring the search tool, searched or not; null when it cannot search.
      - `web_search_max_uses` integer, nullable, required: The searches one call may run at most; null when it cannot search.
      - `price_with_web_search_min` number, nullable, required: The triple of the same call with the search tool declared (its overhead billed searched or not).
      - `price_with_web_search_expected` number, nullable, required: As above, expected.
      - `price_with_web_search_max` number, nullable, required: As above, max.
      - `default` boolean, required: The one default model of an llm operation (model auto resolves to it).
      - `dimensions` integer, nullable, required: llm.embed: the pinned vector size (1024); null elsewhere.
  - `meta` object, required
    - `trace_id` string, required: UUID v7; same 128-bit value as the X-Trace-Id header.
    - `span_id` string, required: 16 hex chars, root span of this request.
    - `timestamp` string, required: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
    - `duration_ms` integer, required: Server-side wall clock.
    - `team_sid` string, nullable: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends.
    - `actor_type` string, nullable: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.

## Other responses

- `4XX`: MCP error envelope. `error.code` is one of validation_failed, nothing_to_update, not_found, relation_not_found, invalid_transition, limit_exceeded, payment_required, duplicate_rejected, conflict, delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
- `5XX`: MCP error envelope with `error.code` internal_error or service_unavailable.

---

[API](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-integrations.md) - [All operations](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-integrations/llms.txt) - [OpenAPI document](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-integrations/revisions/2e7105d58335?raw)
