API v1
Muziek genereren via API
Stuur een prompt, ontvang een job-ID en haal de audiobestanden op via polling of een webhook.
- Base URL
https://muziekmakenmetai.nl/api/v1- Formaat
- JSON over HTTPS
- Authenticatie
- Bearer API-key
Maak zelf een key in het developerportal. De volledige sleutel verschijnt één keer. Bewaar hem direct in je secret manager.
Account en API-keys
Je gebruikt hetzelfde account voor het developerportal, credits en de gewone Studio. In het portal maak je maximaal vijf actieve keys met afzonderlijke scopes. Je ziet per key de prefix, aanmaakdatum en laatste gebruiksmoment.
- Maak een account of log in. Je komt daarna direct terug in het developerportal.
- Geef de key een herkenbare naam. Gebruik aparte keys voor productie en ontwikkeling.
- Kopieer de volledige key meteen. Wij bewaren alleen een hash en kunnen de key later niet terughalen.
- Trek een key direct in bij twijfel. Requests met die key geven daarna
401 unauthorized.
Authenticatie
Zet je API-key in de Authorization-header. Plaats hem nooit in client-side JavaScript, een mobiele appbundle of een publieke repository.
Authorization: Bearer $MMMAI_API_KEY
Een key kan de scopes music:generate, music:read en webhooks:write hebben. Een ingetrokken of ongeldige key geeft 401 unauthorized. Een ontbrekende scope geeft 403 forbidden.
Start je eerste generatie
Gebruik voor iedere nieuwe opdracht een unieke Idempotency-Key van 1 tot 128 tekens. Je kunt een mislukte netwerkrequest veilig met dezelfde key en exact dezelfde JSON-body herhalen.
curl -X POST https://muziekmakenmetai.nl/api/v1/music/generations/ \
-H "Authorization: Bearer $MMMAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-2026-0001" \
-d '{
"model": "music-v2",
"prompt": "Een opgewekte instrumentale poptrack met piano en een rustig einde",
"instrumental": true,
"title": "Ochtendlicht"
}'
Een nieuwe job geeft 202 Accepted. Een veilige replay geeft 200 OK en hetzelfde job-ID. Gebruik je dezelfde idempotency-key met een andere body, dan krijg je 409 idempotency_conflict.
{
"id": "17e0da64-350c-499b-b66d-4f012b95da24",
"object": "music_generation",
"status": "queued",
"model": "music-v1",
"created_at": "2026-09-05T08:15:30+00:00",
"completed_at": null,
"tracks": [],
"url": "https://muziekmakenmetai.nl/api/v1/music/generations/17e0da64-350c-499b-b66d-4f012b95da24/"
}
Status en resultaat ophalen
Lees de URL uit de response of de Location-header. Poll zolang de status queued of processing is. Stop bij succeeded of failed.
curl https://muziekmakenmetai.nl/api/v1/music/generations/17e0da64-350c-499b-b66d-4f012b95da24/ \
-H "Authorization: Bearer $MMMAI_API_KEY"
{
"id": "17e0da64-350c-499b-b66d-4f012b95da24",
"object": "music_generation",
"status": "succeeded",
"model": "music-v1",
"created_at": "2026-09-05T08:15:30+00:00",
"completed_at": "2026-09-05T08:17:04+00:00",
"tracks": [
{
"id": "4182",
"title": "Ochtendlicht",
"duration_seconds": 72,
"audio_url": "https://muziekmakenmetai.nl/media/generated_assets/music/ochtendlicht.mp3",
"image_url": "https://muziekmakenmetai.nl/media/generated_assets/music/ochtendlicht.jpg"
}
]
}
De API toont tracks pas nadat de audio naar onze eigen opslag is gekopieerd. Bij failed krijg je foutcode generation_failed en wordt de gereserveerde credit hersteld.
Requestvelden
prompt is het enige veld dat altijd verplicht is. De API weigert onbekende velden zodat een typfout niet stil wordt genegeerd.
| Veld | Type | Regels |
|---|---|---|
prompt | string | Verplicht. Muziekbeschrijving tot 500 tekens. In custom_mode is dit de volledige songtekst tot 5.000 tekens. |
model | string | music-v2 (aanrader), music-v2-mini, music-v2-wild, music-v1 of music-v1-pro. Zonder dit veld gebruikt de API music-v1, zodat bestaande koppelingen niet veranderen. |
custom_mode | boolean | Standaard false. Zet op true voor eigen songtekst en de tuningvelden hieronder. |
instrumental | boolean | Standaard false. |
style | string | Maximaal 1.000 tekens. Verplicht wanneer custom_mode waar is. |
title | string | Maximaal 80 tekens. Standaard Nieuwe track. |
language | string | Volledige taalnaam, maximaal 40 tekens. Standaard Nederlands. Stuurt de zangtaal in description mode. |
vocal_gender | string | male of female. Alleen in custom_mode. |
style_weight | number | 0 tot en met 1. Alleen in custom_mode; hoger volgt style sterker. |
creativity | number | 0 tot en met 1. Alleen in custom_mode; hoger geeft meer variatie. |
audio_weight | number | 0 tot en met 1. Alleen in custom_mode; gewicht van gekoppelde persona-audio. |
duration_seconds | integer | 10 tot en met 360. Alleen in custom_mode, met music-v1-pro of een music-v2-model. Laat je hem weg bij music-v2, dan kiezen wij een lengte die bij je songtekst past. |
variety | integer | 0 tot en met 4, standaard 1. Alleen in custom_mode met een music-v2-model. Bepaalt hoe ver de twee versies uit elkaar mogen liggen: 0 is zo gelijk mogelijk, 4 zo verschillend mogelijk. |
negative_tags | string[] | Ongewenste stijlen of kenmerken. Alleen in custom_mode, samen maximaal 300 tekens. |
persona_id | string | Een persona van hetzelfde account. Alleen met custom_mode. |
persona_type | string | style of voice. Vereist persona_id; zonder dit veld gebruikt de API style. Een eigen stem (opgenomen op /muziek/stem/) is altijd voice en werkt alleen met een music-v2-model. |
Lees de actuele capabilities voor de machineleesbare modellen, grenzen en beschikbare velden.
Welk model kies je?
| Model | Wanneer |
|---|---|
music-v2 | Ons nieuwste model en de aanrader. Natuurlijkere zang, rijkere details, eigen stemmen en variety. |
music-v2-mini | Zelfde generatie, sneller en lichter. Handig voor veel korte jingles. |
music-v2-wild | Zelfde generatie, gewaagder. Kies hem als je verrast wilt worden. |
music-v1, music-v1-pro | De vorige generatie. Blijft werken voor bestaande koppelingen. |
Alle modellen kosten één credit per generatie en leveren twee versies.
Talen voor zang en songtekst
Gebruik de volledige Nederlandse taalnaam. Nederlands, Engels, Duits, Frans, Spaans, Italiaans en Portugees zijn de aanbevolen waarden. Andere taalnamen tot 40 tekens worden ook geaccepteerd, maar de uitspraak en zangkwaliteit kunnen per taal verschillen.
In description mode verwerkt de API language in de muziekopdracht. In custom_mode bepaalt je eigen songtekst de gezongen taal. Zet language dan nog steeds correct voor je administratie en toekomstige compatibiliteit.
Credits en limieten
Iedere generatie reserveert één credit. De API gebruikt eerst je API-credits en valt daarna terug op je niet-verlopende songcredits; je ziet beide saldi via GET /account/. Bij een definitief mislukte generatie wordt de credit teruggeboekt naar de wallet waar de generatie mee betaald is.
curl https://muziekmakenmetai.nl/api/v1/account/ \
-H "Authorization: Bearer $MMMAI_API_KEY"
Nieuwe keys staan standaard op 30 requests per minuut. De accountresponse bevat de limiet die voor jouw key geldt. Te weinig credits geeft 402 insufficient_credits; een overschreden limiet geeft 429 rate_limited.
Prepaid API-prijzen
Eén generatie-request kost één credit. Je betaalt vooraf, zonder maandabonnement of onverwachte rekening. Bij een definitief mislukte generatie zet de creditledger de credit automatisch terug.
€0,48 per generatie €12,00
€0,39 per generatie €39,00
€0,30 per generatie €149,00
Maak een account en koop API-credits. API-credits werken uitsluitend in de API. Los gekochte songcredits voor de Studio mogen ook als fallback in de API. Deze prepaidcredits verlopen niet. Maandcredits van Plus en Pro werken uitsluitend in de Studio.
Webhooks instellen
Stel één publieke HTTPS-URL per key in. De URL mag niet naar localhost, een privénetwerk of een adres met credentials wijzen.
curl -X PUT https://muziekmakenmetai.nl/api/v1/webhook/ \
-H "Authorization: Bearer $MMMAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://jouw-app.nl/webhooks/muziek"}'
De response bevat een signing_secret. Bewaar dit als secret. Stuur {"url":""} om de webhook uit te schakelen.
Webhooks controleren
Bereken HMAC-SHA256 over de exacte ruwe requestbody, voorafgegaan door de timestamp en een punt. Vergelijk de uitkomst constant-time met X-MMMAI-Signature. Gebruik X-MMMAI-Event om dubbele verwerking te voorkomen.
import hashlib
import hmac
signed = timestamp.encode() + b"." + raw_body
expected = "sha256=" + hmac.new(
signing_secret.encode(), signed, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, received_signature):
raise ValueError("Ongeldige webhookhandtekening")
Terminale events zijn music.generation.succeeded en music.generation.failed. De bezorger accepteert iedere 2xx-response, volgt geen redirects en probeert een tijdelijke bezorgfout maximaal vijf keer opnieuw.
Foutcodes
API-validatiefouten hebben steeds dezelfde JSON-vorm. Een onbekend of niet aan jouw key gekoppeld job-ID geeft 404.
{
"error": {
"code": "invalid_parameter",
"message": "prompt is verplicht."
}
}
400invalid_jsoninvalid_idempotency_key
401unauthorized
402insufficient_credits
403forbidden
409idempotency_conflict
413request_too_large
415invalid_content_type
422unknown_parameterinvalid_modelinvalid_parameterinvalid_personaunsafe_promptinvalid_webhook_url
429rate_limited