QuillAIQuillAIDocs
Sign in
Getting StartedQuickstart

Quickstart

Send your first transcription and read the result in under two minutes. No SDK — just cURL and a key.

You'll need: a QuillAI account, an API key, and any audio file or YouTube URL. Create your key →

Authenticate

Every request uses a bearer token. Export your key as an environment variable, then hit GET /v1/me to confirm it works. See Authentication for details.

terminalbash
$ export QAI_KEY=qai_live_a3f7...c2e9
$ curl https://api.quillhub.ai/v1/me \
    -H "Authorization: Bearer $QAI_KEY"

Returns id, available_points, and your subscription object.

Get an API key

Open Developers → API keys and click Create key. The plaintext is shown once — copy it immediately. QuillAI issues two prefixes:

PrefixTypeUsage
qai_test_SandboxNot billed. Safe for CI and local development.
qai_live_ProductionBilled in points against your balance.
Never commit keys. Load them from environment variables or a secret store. Exposed keys should be revoked from the Developers page right away.

Make your first call

Post a YouTube URL and you'll get back a transcription ID immediately. QuillAI processes the file asynchronously — poll or register a webhook for the finished text.

1
Create
POST /v1/transcriptions with a url — YouTube, Instagram, or any publicly reachable file.
2
Poll
GET /v1/transcriptions/{id} every few seconds, or pass webhook_url and skip polling.
3
Read
When status is completed, read result.text, segments, structured, and subtitles.
transcribe.shbash
curl -X POST https://api.quillhub.ai/v1/transcriptions \
  -H "Authorization: Bearer $QAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://youtu.be/dQw4w9WgXcQ",
    "structure": true
  }'

You get back a 202 with the full transcription object:

202 Acceptedjson
{
  "id": "trs_01HZX7K9E3M2N4P6Q8R0S2T4V6",
  "status": "queued",
  "source": {
    "type": "youtube",
    "url": "https://youtu.be/dQw4w9WgXcQ"
  },
  "options": {
    "speaker_recognition": false,
    "structure": true
  },
  "created_at": "2026-04-23T10:12:04Z"
}

Handle the response

Poll GET /v1/transcriptions/{id} until status is terminal, or pass a webhook_url when you create the task and we'll POST the finished payload — see Webhooks.

poll.shbash
TRS_ID="trs_01HZX7K9E3M2N4P6Q8R0S2T4V6"

while true; do
  RESP=$(curl -s https://api.quillhub.ai/v1/transcriptions/$TRS_ID \
    -H "Authorization: Bearer $QAI_KEY")
  STATUS=$(echo "$RESP" | jq -r .status)
  echo "status: $STATUS"
  case "$STATUS" in
    completed|failed|cancelled) echo "$RESP" | jq .result; break ;;
  esac
  sleep 3
done

Terminal statuses are completed, failed, and cancelled. On completed the result object is populated with text, segments, structured, and subtitles (VTT + SRT).

Next steps