FluoTest API-referentie
De publieke API van FluoTest loopt via zijn MCP-endpoint — een JSON-RPC 2.0-API over gewoon HTTPS die werkt met curl of elke HTTP-client, zonder MCP-bibliotheek. Je authenticeert met een persoonlijke API-sleutel.
Laatst bijgewerkt
Hoe roep ik de FluoTest-API aan?
Genereer een API-sleutel in Instellingen → Beveiliging → API-sleutels en POST JSON-RPC-verzoeken naar https://fluotest.com/api/mcp met de sleutel in een "Authorization: Bearer"-header. Vandaag zijn acht tools beschikbaar: list_quizzes, create_quiz, get_quiz_questions, get_quiz_settings, update_quiz, publish_quiz, get_results en delete_quiz.
Een API-sleutel aanmaken#
API-sleutels zijn persoonlijk — elk verzoek met een sleutel handelt als jouw gebruikersaccount, met dezelfde rechten die je in de app hebt.
- Open Instellingen → Beveiliging → API-sleutels in je FluoTest-dashboard.
- Voer een naam in die vertelt waar de sleutel wordt gebruikt (bijv. "Zapier-script").
- Klik op Sleutel genereren en kopieer de fluo_…-waarde direct.
- Bewaar hem veilig — in een wachtwoordmanager of de secrets-opslag van je tool.
- Eén keer zichtbaar: Alleen een SHA-256-hash van de sleutel wordt opgeslagen — ben je hem kwijt, trek hem dan in en genereer een nieuwe.
- Maximaal 10 sleutels: Maak per tool of script een aparte sleutel, zodat je er één kunt intrekken zonder de rest te breken.
- Altijd intrekbaar: Het intrekken van een sleutel werkt direct vanaf het volgende verzoek.
- Gebruik zichtbaar: Bij elke sleutel zie je wanneer hij voor het laatst is gebruikt, zodat oude sleutels makkelijk op te ruimen zijn.
Authenticatie#
Stuur de sleutel bij elk verzoek mee in de Authorization-header:
Authorization: Bearer fluo_YOUR_API_KEY
Verbind je een AI-assistent in plaats van code te schrijven? Bekijk de MCP-servergids →
Verzoekformaat#
Het endpoint is https://fluotest.com/api/mcp. Stuur POST-verzoeken met "Content-Type: application/json", een Accept-header van "application/json, text/event-stream" en een JSON-RPC 2.0-body. Er is geen initialize-handshake nodig — je kunt tools/list en tools/call direct aanroepen.
Antwoorden komen terug als server-sent-events: het JSON-RPC-resultaat staat op de "data:"-regel en de payload van elke tool is een JSON-string in result.content[0].text:
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"{\n \"quiz_id\": \"…\",\n \"status\": \"draft\", …}"}]}}Voorbeelden#
Beschikbare tools opvragen
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'Je quizzen opvragen
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": { "name": "list_quizzes", "arguments": {} }
}'Een conceptquiz aanmaken
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_quiz",
"arguments": {
"title": "Customer readiness check",
"questions": [
{ "text": "Do you have a budget?", "type": "yes_no", "points": 2 },
{
"text": "Company size?",
"type": "multiple_choice",
"options": [
{ "label": "1-10", "score": 1 },
{ "label": "11-50", "score": 2 },
{ "label": "50+", "score": 3 }
]
}
]
}
}
}'Vragen van een quiz opvragen
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_quiz_questions",
"arguments": { "quiz_id": "Customer readiness check" }
}
}'Instellingen van een quiz opvragen
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "get_quiz_settings",
"arguments": { "quiz_id": "Customer readiness check" }
}
}'Een quiz bewerken
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "update_quiz",
"arguments": {
"quiz_id": "Customer readiness check",
"questions": [
{ "text": "Do you have a budget?", "type": "yes_no", "points": 2 },
{ "text": "What's your budget range?", "type": "multiple_choice",
"options": [
{ "label": "Under $1k", "score": 1 },
{ "label": "$1k-$10k", "score": 2 },
{ "label": "$10k+", "score": 3 }
]
}
]
}
}
}'Een conceptquiz publiceren
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "publish_quiz",
"arguments": { "quiz_id": "Customer readiness check" }
}
}'Quizresultaten opvragen
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_results",
"arguments": { "quiz_id": "Customer readiness check" }
}
}'Een quiz verwijderen (met bevestiging)
curl -X POST https://fluotest.com/api/mcp \
-H "Authorization: Bearer fluo_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "delete_quiz",
"arguments": { "quiz_id": "Customer readiness check", "confirm": true }
}
}'Fouten#
Authenticatieproblemen gebruiken HTTP-statuscodes met een OAuth-foutbody (RFC 6750) en een WWW-Authenticate-header. Andere HTTP-fouten (onbekend endpoint, rate limit) geven application/problem+json (RFC 9457) terug met een vaste code en een hint. Problemen binnen een tool-aanroep komen terug als een normaal JSON-RPC-antwoord met isError gezet en de uitleg in de tekstinhoud.
| Status | Betekenis |
|---|---|
| 401 | Ontbrekende, ongeldige of ingetrokken API-sleutel. Controleer de Authorization-header en of de sleutel nog bestaat in Instellingen. |
| 400 | Onjuiste JSON-RPC-body. Controleer de velden jsonrpc, id, method en params. |
| 404 | Op dit pad bestaat geen endpoint. De body is application/problem+json met code not_found. |
| 429 | Rate limit overschreden. De body is application/problem+json met code rate_limited; wacht het aantal seconden uit Retry-After. |
| 200 + isError | De tool-aanroep zelf is mislukt — bijvoorbeeld een quiznaam/-ID die niet van jou is, een naam die bij meerdere van je quizzen past, het bewerken van een gepubliceerde quiz zonder confirm_edit_published: true, het verwijderen van een quiz zonder confirm: true, of een multiple_choice-vraag met minder dan 2 opties. De tekstinhoud legt uit wat je moet aanpassen. |
Foutcodes (application/problem+json)
Elke foutbody bevat type, title, status, code en meestal detail en hint. De type-URI linkt naar het bijbehorende item hieronder.
- not_found
- Het pad is geen API-endpoint. Zie /openapi.json voor de gedocumenteerde endpoints.
- rate_limited
- Te veel verzoeken in het huidige venster. Wacht Retry-After seconden en probeer het opnieuw.
Rate limits en versiebeheer#
Elke API-sleutel of elk OAuth-token kan 120 verzoeken per minuut naar /api/mcp sturen (verzoeken zonder inloggegevens tellen per IP-adres). Elk antwoord bevat RateLimit-Policy en RateLimit (IETF-draftformaat) plus RateLimit-Limit, RateLimit-Remaining en RateLimit-Reset, zodat je kunt vertragen voordat je de limiet bereikt. Boven de limiet krijg je een 429 met Retry-After.
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
RateLimit-Policy: "default";q=120;w=60
RateLimit: "default";r=0;t=17
Retry-After: 17
{"type":"https://fluotest.com/en/docs/api-reference#error-rate_limited","title":"Too Many Requests","status":429,"code":"rate_limited","hint":"Wait 17 seconds (Retry-After) before retrying."}Het transport is geversioneerd met de MCP-Protocol-Version-requestheader, die bij initialize wordt afgesproken. De tools volgen semantische versies (het version-veld in /openapi.json): nieuwe tools en nieuwe optionele argumenten worden alleen toegevoegd en breken bestaande aanroepen nooit.
Een brekende wijziging komt uit onder een nieuwe toolnaam. De oude tool blijft minstens 90 dagen werken; antwoorden die hem gebruiken bevatten een Deprecation-header en een Sunset-header met de verwijderdatum, en de wijziging staat in de changelog.
FAQ#
Is er een rate limit?
Ja: 120 verzoeken per minuut per API-sleutel of OAuth-token op /api/mcp. Elk antwoord bevat RateLimit-headers met je resterende budget, en een 429-antwoord vertelt in Retry-After hoe lang je moet wachten.
Kan ik OAuth gebruiken in plaats van een API-sleutel?
Ja — OAuth is de aanbevolen manier om AI-assistenten zoals Claude te verbinden, waarbij de gebruiker toegang goedkeurt op een toestemmingsscherm. API-sleutels zijn de simpelere optie voor scripts en clients die alleen headers meesturen. Zie de MCP-servergids voor de OAuth-setup.
Wat kan de API vandaag?
Acht operaties: list_quizzes, create_quiz, get_quiz_questions, get_quiz_settings, update_quiz (met een bevestigingsstap om gepubliceerde quizzen te bewerken), publish_quiz, get_results en delete_quiz (met een bevestigingsstap). Elke quizverwijzing accepteert een titel, slug of ID. Meer operaties staan gepland — laat via het feedbackformulier in het dashboard weten wat je nodig hebt.