Naar de inhoud

Eén regel code, en je draait in de Europese Unie.

De API is OpenAI-compatibel. Bestaande SDK’s, frameworks en code blijven werken: je vervangt de base_url en kiest een tier in plaats van een modelnaam.

Quickstart: je eerste API-call

Maak een key aan in je dashboard onder Instellingen, API-keys. Je ziet het geheim precies één keer. Daarna bewaren we alleen een hash en het prefix. Zet het in een omgevingsvariabele, nooit in je repository.

curl
curl https://api.europeanailab.eu/v1/chat/completions \
  -H "Authorization: Bearer $UNION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eu-standard",
    "messages": [{"role": "user", "content": "Leg uit hoe btw verleggen werkt."}]
  }'
python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["UNION_API_KEY"],
    base_url="https://api.europeanailab.eu/v1",   # de enige regel die verandert
)

resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Leg uit hoe btw verleggen werkt."}],
)
print(resp.choices[0].message.content)

Node, Go, Java of .NET?

Elke officiële OpenAI SDK werkt: zet de base URL op https://api.europeanailab.eu/v1 en gebruik je Union-key. We implementeren het chat completions-contract, inclusief streaming, tools en JSON schema’s.

Modeltiers en contextvensters

In het veld model geef je een tier mee, geen modelnaam. Zo blijft je integratie werken als we het model eronder vervangen, en dat gaan we doen, want open-weight modellen worden uitgefaseerd en ingehaald.

TierContextInput / 1 mln.Output / 1 mln.Geschikt voor
eu-lite131K€ 0,40€ 1,60Snel, goedkoop werk: classificatie, extractie, korte antwoorden.
eu-standard262K€ 0,70€ 3,50Het werkpaard. Standaard voor de chat en het meeste API-verkeer.
eu-long1.000K€ 1,00€ 2,00Complete dossiers, contracten en codebases in één prompt.
eu-pro1.000K€ 4,00€ 12,00Zwaar redeneerwerk, agents, complexe code.

Ga je over het contextvenster van een tier heen, dan krijg je een 400 met het maximum erin: we kappen je prompt nooit stilletjes af.

Responses streamen

Streaming werkt zoals je verwacht, met één belangrijk verschil dat je moet kennen, want het gaat over je geld.

Zet include_usage aan

Bij OpenAI-compatibele streaming stuurt de API standaard geen tokenverbruik mee. Zonder stream_options: {"include_usage": true} zie je aan het einde van een stream niet wat de call kostte. Wij meten het hoe dan ook: het gaat erom dat jij het ook kunt zien en controleren.
python
stream = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Schrijf een samenvatting."}],
    stream=True,
    # Zonder dit is er geen usage-object en zie je de kosten niet.
    stream_options={"include_usage": True},
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
    if chunk.usage:                      # laatste chunk
        print("\n", chunk.usage)

Breek je een stream halverwege af, dan betaal je alleen voor wat er tot dat moment gegenereerd is. Komt er door de verbroken verbinding geen usage-chunk binnen, dan schatten we het verbruik en corrigeren we het bij de dagelijkse afstemming met onze provider. Zo’n regel staat in je verbruiksoverzicht als estimated tot hij verrekend is.

Function calling en tool use

Tools volgen het bekende schema. Produceert een model een tool call die niet bij je schema past, dan loggen we dat: in versie 1 corrigeren we het niet stilletjes, want je output ongemerkt repareren is erger dan een zichtbare fout.

python
tools = [{
    "type": "function",
    "function": {
        "name": "find_invoice",
        "description": "Zoek een factuur op nummer op.",
        "parameters": {
            "type": "object",
            "properties": {"number": {"type": "string"}},
            "required": ["number"],
        },
    },
}]

resp = client.chat.completions.create(
    model="eu-standard", messages=messages, tools=tools
)

Gestructureerde output met een JSON schema

Geef een JSON schema mee en valideer het antwoord aan jouw kant. Ons advies: valideer altijd, ook als het model zich meestal netjes gedraagt.

python
resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Haal de naam en het bedrag eruit."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "invoice",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "amount_eur": {"type": "number"},
                },
                "required": ["name", "amount_eur"],
            },
        },
    },
)

Response-headers: kosten, tier en routing

Elke response vertelt wat er gebeurd is. Dat is geen debugextraatje, het is de bedoeling: je kunt zelf nagaan of je kreeg waarvoor je betaalde.

HeaderBetekenis
X-EU-Model-TierDe tier waarop dit request draaide.
X-EU-RoutedAanwezig als het request naar een ander model is omgeleid, met de reden: censorship of error.
X-EU-Degradedtrue als het vervangende model zwakker is of een kleiner contextvenster heeft. Je betaalt dan het laagste van de twee tarieven.
X-EU-Refusal-ClassAanwezig bij een weigering die we niet konden omleiden, bijvoorbeeld A-unrouteable als geen alternatief genoeg context heeft.
X-EU-Tokens-In / -OutAfgerekende tokens voor dit request.
X-EU-Cost-EURWat dit request van je saldo afhaalde, in euro’s.
X-EU-Balance-EURJe resterende saldo na dit request.

Rate limits en uitgaveplafonds

Er geldt een limiet per key en per account, plus de plafonds die je zelf instelt. Die laatste zijn belangrijker dan ze klinken: zonder plafond kan een uitgelekte key of een oneindige lus in je eigen code in één nacht een saldo leegtrekken.

  • Requests per minuut, per key en per account.
  • Dag- en maandplafond in euro’s, per key in te stellen.
  • Nieuwe accounts: de eerste 48 uur maximaal € 25 per dag, wat het saldo ook is.
  • Zien we binnen een uur meer dan tien keer je weekgemiddelde, dan pauzeren we de key automatisch en mailen we je. Liever één vals alarm dan een lege portemonnee.
  • Een request start pas als je saldo minstens € 0,05 is.

Foutcodes en wat je ermee doet

CodeBetekenisWat te doen
400Ongeldig request, of een prompt groter dan het contextvenster.Pas het request aan; het maximum staat in de foutmelding.
401Onbekende, ingetrokken of gepauzeerde key.Controleer de key in je dashboard.
402Onvoldoende saldo.Laad op. De response bevat een directe link.
403Request valt buiten het gebruiksbeleid.Zie fair use hieronder.
429Rate limit of plafond bereikt.Wacht en probeer opnieuw; houd je aan Retry-After.
502 / 503Upstream-model niet beschikbaar en geen fallback mogelijk.Probeer opnieuw. Zie de statuspagina.

Mislukte requests kosten je niets: kwam er geen bruikbaar antwoord terug, dan gaat er niets van je saldo af.

Fair use en gebruiksbeleid

We weigeren instructies voor wapens, malware en fraude, en materiaal dat kinderen schaadt. Die weigeringen zijn definitief: we sturen zo’n request nooit door naar een ander model om er toch een antwoord uit te krijgen.

Een model dat een legitieme vraag over politiek, geschiedenis of een maatschappelijk gevoelig onderwerp weigert, is iets anders: dat behandelen we als een defect en sturen we naar een model zonder die blinde vlek. Je ziet het aan de header X-EU-Routed: censorship.

Eén van onze modellen heeft een licentie met een eigen gebruiksbeleid. Dat beleid geldt volledig: omleiden is geen manier om licentievoorwaarden te omzeilen.

Twijfel je of je toepassing past? Mail hello@europeanailab.eu. Vooraf een antwoord is voor ons allebei goedkoper dan achteraf een geblokkeerde key.

Veelgestelde vragen

De vragen die per mail binnenkomen voordat iemand een key aanmaakt: waarmee de API compatibel is, wat een request kost en waar het draait.

Welke OpenAI SDK’s werken met een OpenAI-compatibele API?

Alle officiële, omdat het dunne clients zijn over het chat completions-contract die de base URL als constructorargument aannemen. Python en Node zijn de gangbare gevallen; Go, Java en .NET werken precies zo. Je retrylogica, je streamingafhandeling en je types blijven gewoon staan.

Kan ik LangChain of de Vercel AI SDK ermee gebruiken?

Ja. Beide bieden de base URL als instelling op hun OpenAI-provider, dus die zet je op onze host en je gebruikt een Union AI-key. Alles waarin je de base URL kunt overschrijven werkt op dezelfde manier, ook de meeste agentframeworks en evaluatietools.

Ondersteunt de API streaming en function calling?

Ja, allebei, plus gestructureerde output tegen een JSON schema. Gestreamde responses sturen het tokenverbruik mee aan het einde van de stream, zodat je een gestreamd request net zo precies kunt afrekenen als een gewoon request.

Wat zijn de rate limits?

Er geldt een limiet op requests per minuut per key en per account, plus dag- en maandplafonds in euro’s die je zelf instelt. Nieuwe accounts zitten de eerste 48 uur op maximaal € 25 per dag, wat het saldo ook is. Loop je tegen een limiet aan, dan krijg je een 429 met een Retry-After-header.

Hoe ga ik om met 429’s en retries?

Houd je aan Retry-After in plaats van meteen opnieuw te proberen, en gebruik exponential backoff met jitter zodat een piek niet synchroon over al je workers loopt. Probeer een 402 niet opnieuw: dan is het saldo op en herhaalt een lus alleen de fout. Eén retry is meestal genoeg, want een tweede poging geeft zelden een ander antwoord.

Hoe zie ik wat een request kostte?

Elke response bevat headers: X-EU-Tokens-In en X-EU-Tokens-Out voor de afgerekende tokens, X-EU-Cost-EUR voor wat er van je saldo af ging en X-EU-Balance-EUR voor wat er over is. Je eigen logs kunnen dus per feature of per klant vertellen wat iets kost, zonder dat je een dashboard opent.

Welk model draait er achter elke tier?

Elke tier hoort bij een open-weight model met een naam, gepubliceerd met licentie en contextvenster op de pagina AI-transparantie. Je koopt de tier, niet de modelnaam, zodat wij het model eronder kunnen vervangen zonder je integratie te breken. Als we dat doen, laten we het je weten.

Een bestaande integratie overzetten is drie regels: de key, de base URL en een tiernaam. De hele wijziging, plus wat niet meeverhuist, staat in overstappen in drie regels. Nog iets open? De tarieven per tier staan op de prijspagina, het model en de licentie achter elke tier bij AI-transparantie, en wat er gebeurt bij een storing op de statuspagina. Twee langere stukken: wat een AI-API per token kost en waar je prompts echt naartoe gaan.

Begin met AI voor Europeanen.

Gebruik AI zonder je data naar het buitenland te sturen: alles op Europese servers, voor een Europese prijs.

€ 13 per maand voor de chat, altijd opzegbaar. Of per token, vanaf € 10 tegoed.

Twijfel je nog? Doe de quiz van 60 seconden →