Providers and Vendors
The 24 providers, the fields on each one, and how to read a provider's language table.
curl "https://languages.service.custom.mt/v1/providers"
curl "https://languages.service.custom.mt/v1/providers/deepl_api"
curl "https://languages.service.custom.mt/v1/providers/deepl_api/languages?effective=true"
The catalog
Provider codes are the same ones provider_credentials uses. One identifier resolves a credential there and a language code here; a caller never has to translate between two naming schemes.
| Vendor | Providers |
|---|---|
| OpenAI | openai_api |
| Anthropic | anthropic_api |
| Google Cloud | google_translate, gemini_api |
| Microsoft Azure | microsoft_translator |
| Amazon Web Services | amazon_translate |
| DeepL | deepl_api |
| Translated | modernmt_api, lara_api |
| LanguageWire | languagewire_api |
| SYSTRAN | systran_translate |
| Tencent | tencent_transmart |
| Alibaba Cloud | alibaba_translate |
| Baidu | baidu_translate |
| Naver | papago_translate |
| Supertext | supertext_translate |
| XL8 | xl8_translate |
| Tarjama | tarjama_mt |
| Tahrirchi | tilmoch_api, sayqalchi_api |
| Widn.AI | widn_tower_anthill, widn_tower_sugarloaf, widn_tower_vesuvius |
| Internal | custom_finetuned_mt |
What a provider row carries
| Field | Meaning |
|---|---|
code |
canonical provider code, shared with provider_credentials |
name |
display name |
vendor_code, vendor_name |
the company behind it |
category |
mt, ai or custom_mt |
fallback_policy |
what an unconfigured regional language resolves to — see Fallback Policies |
in_credentials_catalog |
false when provider_credentials does not list this provider yet |
is_active |
false for providers not currently in use |
aliases |
every other identifier that addresses this provider |
notes |
free text: quirks of that vendor's code set, where they matter |
configured_languages |
how many languages have an explicit row |
aliases and notes come back from GET /v1/providers/{code}; the list endpoint returns the summary fields only.
Info
in_credentials_catalog
False would mean a provider whose codes resolve here but which provider_credentials does not list — resolvable, but with no credential contract behind it. No provider is in that state today; the field is there so that if one ever is, you can see it rather than discover it when a job fails.
Provider aliases
A provider answers to more than its code. aliases holds every other identifier that addresses it — a short name like deepl, and any longer identifier a caller is known to send for that engine:
curl ".../v1/resolve?provider=deepl&language=zh-CN"
# → { "provider": "deepl_api", "code": "ZH-HANS", … }
The response always reports the canonical provider code, whichever alias you sent. That is the value to store.
One provider covers every model served by the same vendor endpoint, because language support is a property of the endpoint, not of the model behind it. provider_credentials treats the model as a model_id field under one credential, so a single provider here lines up with a single credential there.
Explicit versus effective
# only pairs someone configured
curl ".../v1/providers/deepl_api/languages"
# every language, fallbacks included — what the provider would actually receive
curl ".../v1/providers/deepl_api/languages?effective=true"
The first command returns 127 languages for DeepL — the explicitly configured pairs that are supported. effective=true widens that to the 247 languages the provider can actually receive once fallbacks are included; a language without an explicit row is not a gap — base languages answer with their own code, and regional ones fall back per Fallback Policies. Each entry carries the same match the resolve endpoint returns, so you can tell configured answers from derived ones.
supported_only defaults to true. Pass supported_only=false to also see the pairs recorded as not working — with effective=true that is the full catalog, 503 rows.
How an outbound code is chosen
For any (provider, language) there is exactly one code, decided once and recorded — never at request time. Where several spellings of the same language could plausibly be sent, the one that wins is:
- the spelling that is documented for that provider, when there is one,
- then the one that equals the language's own canonical code — when several spellings compete and one is what we already call the language, sending anything else is gratuitous divergence,
- then the most textbook BCP-47 spelling (
es-419overES-LA).
Unlike the language's canonical code, this never prefers a shorter tag on its own. If a provider's API wants zh-Hans and only zh-Hans, that is the fact, and rule 2 never overrides it. Every runner-up spelling stays reachable as an inbound alias.
Next
- Fallback Policies — what happens when nothing is configured
- Resolution Ladder — the full lookup order