API reference

Two endpoints, one header.

Authenticate with a bearer key from your dashboard. Everything is multipart form data — no SDK, no client library, nothing to keep updated.

Base URL
https://nutq.dev
POST/v1/transcribe

Transcribe audio

Send a recording, get the text. Long files are split and stitched for you. Dialect is preserved rather than rewritten into Modern Standard Arabic.

Fields
filefilerequired
Audio or video, any common format, up to 100 MB and one hour.
languagestring
The language actually spoken in the recording. Defaults to ar. Also accepts en, fr, es, de, it, pt, nl, pl, el, ja, ko, zh, vi. Asking for the wrong one returns fluent-looking nonsense rather than an error, so set it deliberately.
curl -X POST https://nutq.dev/v1/transcribe \
  -H "Authorization: Bearer $NUTQ_API_KEY" \
  -F "file=@call.mp3"
Response
{
  "text": "هلا وغلا فيك، شحالك اليوم؟",
  "language": "ar",
  "usage": {
    "audio_seconds": 13.23,
    "cost_usd": 0.00056
  },
  "model": "nutq-listen-1"
}

usage is what this request cost you, not an estimate. model names the engine that served the request, so a response can be traced back to a version.

POST/v1/speech

Generate speech

Send Arabic text and a reference voice. The model clones the voice from a few seconds of audio and speaks your text in it. Arabic only — Latin script is not pronounced. Returns a WAV; usage travels in the response headers.

Fields
textstringrequired
Arabic text, up to 5,000 characters. English input is not supported by the voice model.
referencefilerequired
The voice to clone. Six to ten seconds is the sweet spot; over twenty is rejected.
ref_textstringrequired
What the reference audio says. The model aligns against it.
nfe_stepinteger
Quality against speed, 8–96. Defaults to 32; 64 is noticeably cleaner and about twice as slow.
speedfloat
Playback rate of the generated speech. Defaults to 1.
curl -X POST https://nutq.dev/v1/speech \
  -H "Authorization: Bearer $NUTQ_API_KEY" \
  -F "text=هلا وغلا فيك، شحالك اليوم؟" \
  -F "reference=@voice.wav" \
  -F "ref_text=نص التسجيل المرجعي" \
  --output speech.wav
Response
HTTP/1.1 200 OK
Content-Type: audio/wav
X-Nutq-Characters: 57
X-Nutq-Audio-Seconds: 5.672
X-Nutq-Cost-USD: 0.000285
X-Nutq-Model: nutq-speak-1

The body is the audio itself, so usage is returned in headers.

Models

Two of them. Every response names the one that served it, so output can be traced back to a version — and when a model is retired the name keeps working, pointed at its successor.

nutq-listen-1Speech to textGulf and Levantine Arabic at dialect level, plus thirteen other languages. Keeps what was said rather than rewriting it into Modern Standard Arabic.
nutq-speak-1Text to speechGulf Arabic, cloned from a few seconds of reference audio. Trained on Emirati and Saudi speech, so the accent is Gulf rather than broadcast MSA.

When things fail

Standard HTTP codes, and a message that names the problem. A request that fails is never billed.

401The key is missing, malformed, or revoked.Check the Authorization header reads "Bearer nutq_sk_…".
402The balance is spent.Top up, then retry the same request.
400A field is missing or wrong.The message names the field.
413The upload is too large.Under 100 MB, one hour of audio, 5,000 characters of text.
503Inference is unavailable.Ours, not yours. Retry shortly; you were not billed.