← ablaut
The ablaut API
Verb conjugation for 14 European languages over HTTP or MCP. Every form is verified against two independent lexicons per language; answers are computed in microseconds by a native Rust engine.
Quickstart
curl -H "x-api-key: YOUR_KEY" \
"https://api.ablaut.dev/v1/conjugate?verb=appeler&lang=fr"
{
"verb": "appeler",
"lang": "fr",
"us": 42,
"table": {
"infinitive": "appeler",
"present": ["appelle", "appelles", "appelle",
"appelons", "appelez", "appellent"],
"auxiliary": "avoir",
...
}
}
Authentication
Every /v1 request needs an x-api-key header. The API is in early access: request a key through the API dialog and we send one by email. Requests without a valid key get 401.
Endpoints
GET /v1/conjugate
| Parameter | Description |
|---|
verb | The infinitive (or citation form) to conjugate. Required. Whitespace, casing, and zu-/a-style particles are normalized. |
lang | ISO 639-1 (fr), ISO 639-3 (fra), or an English name (French), case-insensitive. Defaults to German. |
Responses include us, the engine compute time in microseconds. Errors: 400 missing verb, 401 bad key, 422 unknown language or a string that is not an infinitive of the requested language — ablaut only conjugates real verbs, it never invents forms:
{ "error": "not a supported French verb" }
GET /v1/lemma
Reverse lookup: ?form=suis&lang=fr returns every lemma whose paradigm contains the form, with the slots it occupies — ambiguity included (suis matches both être and suivre). Productive coverage for French, Spanish, German, and English; irregular forms reverse in all 14 languages. Every match is verified by forward conjugation, so a cited slot always really contains the form.
{ "form": "suis", "matches": [
{ "infinitive": "être", "slots": ["present 1sg"] },
{ "infinitive": "suivre", "slots": ["present 1sg", "present 2sg", "imperative 2sg"] } ] }
GET /v1/languages
The 14 languages with ISO codes and maturity status (beta: verified at 100% agreement against two gold lexicons; wip: known gaps under active work).
Response shapes per language
Each language's table mirrors its real morphology instead of forcing one template: German carries both Konjunktiv rows and separable-prefix forms, Czech carries aspect and its counterpart, Spanish the Rioplatense voseo, Irish returns fully composed and mutated rows, Swedish tenses are single forms rather than person arrays. The reference below is generated from live engine output at build time, so it cannot drift. Person arrays run 1sg → 3pl (German adds the polite Sie row on the site only). Analytic tenses composed from auxiliaries (passé composé, passato prossimo, perfekti) are part of the API response for every language except Danish, whose auxiliary coverage is still partial.
Deutsch — de, sample: aufstehen, 21 fields
| Field | Type | Example (aufstehen) |
|---|
infinitive | string | aufstehen |
zuInfinitive | string | aufzustehen |
perfectInfinitive | string | aufgestanden sein |
auxiliary | string | sein |
presentParticiple | string | aufstehend |
pastParticiple | string | aufgestanden |
imperative | array[2] | steh auf, … |
imperativeExtended | array[2] | stehen wir auf, … |
present | array[6] | stehe auf, … |
preterite | array[6] | stand auf, … |
konjunktiv1 | array[6] | stehe auf, … |
konjunktiv2 | array[6] | stünde auf, … |
perfect | array[6] | bin aufgestanden, … |
pluperfect | array[6] | war aufgestanden, … |
future1 | array[6] | werde aufstehen, … |
future2 | array[6] | werde aufgestanden sein, … |
wuerde | array[6] | würde aufstehen, … |
konj1Perfect | array[6] | sei aufgestanden, … |
konj1Future | array[6] | werde aufstehen, … |
konj2Pluperfect | array[6] | wäre aufgestanden, … |
konj2Future2 | array[6] | würde aufgestanden sein, … |
Français — fr, sample: appeler, 19 fields
| Field | Type | Example (appeler) |
|---|
infinitive | string | appeler |
auxiliary | string | avoir |
presentParticiple | string | appelant |
pastParticiple | string | appelé |
imperative | array[3] | appelle, … |
present | array[6] | appelle, … |
imperfect | array[6] | appelais, … |
pastHistoric | array[6] | appelai, … |
future | array[6] | appellerai, … |
conditional | array[6] | appellerais, … |
subjunctivePresent | array[6] | appelle, … |
subjunctiveImperfect | array[6] | appelasse, … |
passeCompose | array[6] | ai appelé, … |
plusQueParfait | array[6] | avais appelé, … |
passeAnterieur | array[6] | eus appelé, … |
futurAnterieur | array[6] | aurai appelé, … |
conditionnelPasse | array[6] | aurais appelé, … |
subjonctifPasse | array[6] | aie appelé, … |
subjonctifPlusQueParfait | array[6] | eusse appelé, … |
Español — es, sample: hablar, 21 fields
| Field | Type | Example (hablar) |
|---|
infinitive | string | hablar |
gerund | string | hablando |
pastParticiple | string | hablado |
presentVos | string | hablás |
imperativeVos | string | hablá |
imperative | array[5] | habla, … |
present | array[6] | hablo, … |
imperfect | array[6] | hablaba, … |
preterite | array[6] | hablé, … |
future | array[6] | hablaré, … |
conditional | array[6] | hablaría, … |
subjunctivePresent | array[6] | hable, … |
subjunctiveImperfect | array[6] | hablara, … |
subjunctiveFuture | array[6] | hablare, … |
perfectoCompuesto | array[6] | he hablado, … |
pluscuamperfecto | array[6] | había hablado, … |
preteritoAnterior | array[6] | hube hablado, … |
futuroPerfecto | array[6] | habré hablado, … |
condicionalPerfecto | array[6] | habría hablado, … |
subjuntivoPerfecto | array[6] | haya hablado, … |
subjuntivoPluscuamperfecto | array[6] | hubiera hablado, … |
Português — pt, sample: falar, 20 fields
| Field | Type | Example (falar) |
|---|
infinitive | string | falar |
gerund | string | falando |
pastParticiple | string | falado |
imperative | array[5] | fala, … |
personalInfinitive | array[6] | falar, … |
present | array[6] | falo, … |
imperfect | array[6] | falava, … |
preterite | array[6] | falei, … |
pluperfect | array[6] | falara, … |
future | array[6] | falarei, … |
conditional | array[6] | falaria, … |
subjunctivePresent | array[6] | fale, … |
subjunctiveImperfect | array[6] | falasse, … |
subjunctiveFuture | array[6] | falar, … |
perfeitoComposto | array[6] | tenho falado, … |
maisQuePerfeitoComposto | array[6] | tinha falado, … |
futuroComposto | array[6] | terei falado, … |
condicionalComposto | array[6] | teria falado, … |
conjuntivoPerfeito | array[6] | tenha falado, … |
conjuntivoMaisQuePerfeito | array[6] | tivesse falado, … |
Italiano — it, sample: parlare, 19 fields
| Field | Type | Example (parlare) |
|---|
infinitive | string | parlare |
auxiliary | string | avere |
gerund | string | parlando |
presentParticiple | string | parlante |
pastParticiple | string | parlato |
imperative | array[5] | parla, … |
present | array[6] | parlo, … |
imperfect | array[6] | parlavo, … |
pastHistoric | array[6] | parlai, … |
future | array[6] | parlerò, … |
conditional | array[6] | parlerei, … |
subjunctivePresent | array[6] | parli, … |
subjunctiveImperfect | array[6] | parlassi, … |
passatoProssimo | array[6] | ho parlato, … |
trapassatoProssimo | array[6] | avevo parlato, … |
futuroAnteriore | array[6] | avrò parlato, … |
condizionalePassato | array[6] | avrei parlato, … |
congiuntivoPassato | array[6] | abbia parlato, … |
congiuntivoTrapassato | array[6] | avessi parlato, … |
Svenska — sv, sample: tala, 15 fields
| Field | Type | Example (tala) |
|---|
infinitive | string | tala |
present | string | talar |
past | string | talade |
supine | string | talat |
imperative | string | tala |
infinitivePassive | string | talas |
presentPassive | string | talas |
pastPassive | string | talades |
supinePassive | string | talats |
presensRow | array[6] | talar, … |
preteritumRow | array[6] | talade, … |
perfektRow | array[6] | har talat, … |
pluskvamperfektRow | array[6] | hade talat, … |
futurumRow | array[6] | ska tala, … |
konditionalisRow | array[6] | skulle tala, … |
Română — ro, sample: a vorbi, 15 fields
| Field | Type | Example (a vorbi) |
|---|
infinitive | string | vorbi |
gerund | string | vorbind |
participle | string | vorbit |
imperative | array[2] | vorbește, … |
present | array[6] | vorbesc, … |
imperfect | array[6] | vorbeam, … |
simplePerfect | array[6] | vorbii, … |
pluperfect | array[6] | vorbisem, … |
subjunctive | array[6] | vorbesc, … |
perfectCompus | array[6] | am vorbit, … |
viitor | array[6] | voi vorbi, … |
conditionalPrezent | array[6] | aș vorbi, … |
subjunctivePerfect | array[6] | fi vorbit, … |
conditionalPerfect | array[6] | aș fi vorbit, … |
viitorAnterior | array[6] | voi fi vorbit, … |
English — en, sample: run, 11 fields
| Field | Type | Example (run) |
|---|
infinitive | string | run |
past | string | ran |
pastParticiple | string | run |
presentParticiple | string | running |
thirdSingular | string | runs |
presentRow | array[6] | run, … |
pastRow | array[6] | ran, … |
presentPerfectRow | array[6] | have run, … |
pastPerfectRow | array[6] | had run, … |
futureRow | array[6] | will run, … |
futurePerfectRow | array[6] | will have run, … |
Dansk — da, sample: virke, 9 fields
| Field | Type | Example (virke) |
|---|
infinitive | string | virke |
present | string | virker |
past | string | virkede |
pastParticiple | string | virket |
imperative | string | virk |
presentParticiple | string | virkende |
infinitivePassive | string | virkes |
presentPassive | string | virkes |
pastPassive | string | virkedes |
Čeština — cs, sample: mluvit, 9 fields
| Field | Type | Example (mluvit) |
|---|
infinitive | string | mluvit |
aspect | string | imperfective |
present | array[6] | mluvím, … |
imperative | array[3] | mluv, … |
pastParticiple | array[6] | mluvil, … |
passiveParticiple | array[6] | mluven, … |
transgressive | array[3] | mluvě, … |
minulyCas | array[6] | mluvil jsem, … |
kondicional | array[6] | mluvil bych, … |
Slovenščina — sl, sample: delati, 8 fields
| Field | Type | Example (delati) |
|---|
infinitive | string | delati |
supine | string | delat |
present | array[9] | delam, … |
imperative | array[5] | delaj, … |
participle | array[9] | delal, … |
preteklik | array[9] | sem delal, … |
prihodnjik | array[9] | bom delal, … |
pogojnik | array[9] | bi delal, … |
Eesti — et, sample: rääkima, 14 fields
| Field | Type | Example (rääkima) |
|---|
infinitive | string | rääkima |
daInfinitive | string | rääkida |
present | array[6] | räägin, … |
past | array[6] | rääkisin, … |
conditional | array[6] | räägiksin, … |
imperative | array[4] | räägi, … |
presentImpersonal | string | räägitakse |
pastImpersonal | string | räägiti |
quotative | string | rääkivat |
presentParticiple | string | rääkiv |
nudParticiple | string | rääkinud |
tudParticiple | string | räägitud |
perfect | array[6] | olen rääkinud, … |
pluperfect | array[6] | olin rääkinud, … |
Suomi — fi, sample: puhua, 17 fields
| Field | Type | Example (puhua) |
|---|
infinitive | string | puhua |
present | array[6] | puhun, … |
past | array[6] | puhuin, … |
conditional | array[6] | puhuisin, … |
potential | array[6] | puhunen, … |
imperative | array[5] | puhu, … |
presentPassive | string | puhutaan |
pastPassive | string | puhuttiin |
conditionalPassive | string | puhuttaisiin |
potentialPassive | string | puhuttaneen |
imperativePassive | string | puhuttakoon |
presentParticiple | string | puhuva |
pastParticiple | string | puhunut |
presentPassiveParticiple | string | puhuttava |
pastPassiveParticiple | string | puhuttu |
perfekti | array[6] | olen puhunut, … |
pluskvamperfekti | array[6] | olin puhunut, … |
Gaeilge — ga, sample: glan, 10 fields
| Field | Type | Example (glan) |
|---|
infinitive | string | glan |
verbalNoun | string | glanadh |
verbalAdjective | string | glanta |
present | array[7] | glanaim, … |
past | array[7] | ghlan mé, … |
pastHabitual | array[7] | ghlanainn, … |
future | array[7] | glanfaidh mé, … |
conditional | array[7] | ghlanfainn, … |
imperative | array[7] | glanaim, … |
subjunctive | array[7] | glana mé, … |
MCP
The same engine as an MCP server, for Claude Code, Cursor, or any MCP-capable agent:
claude mcp add ablaut --env ABLAUT_API_KEY=YOUR_KEY -- npx -y @v4nn4/ablaut-mcp
{
"mcpServers": {
"ablaut": {
"command": "npx",
"args": ["-y", "@v4nn4/ablaut-mcp"],
"env": { "ABLAUT_API_KEY": "YOUR_KEY" }
}
}
}
Tools: conjugate(verb, language) returning the same table as the HTTP API, and list_languages(). Set ABLAUT_API_URL to point at another instance.
Machine-readable spec
OpenAPI 3.1: https://api.ablaut.dev/openapi.json. The library behind the API is open source: ablaut-dev/ablaut (Rust, Python, WebAssembly).