API

Chat

curl https://sporelabs.dev/v1/chat/completions \
  -H "Authorization: Bearer $SPORELABS_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"auto","messages":[{"role":"user","content":"Say hello."}]}'

Use "auto" (or omit model) to start on Kimi K3, or name any model from GET /v1/models. A named model is always used for that call.

Transcribe audio

curl https://sporelabs.dev/v1/audio/transcribe \
  -H "Authorization: Bearer $SPORELABS_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"audio_url":"https://example.com/call.wav"}'

Poll the returned polling_url until status is completed. The result has text and word-timed segments. You pay for the audio length we measure. Funds are held while the job runs and the rest is released after.

Model Use for
large-v3 (default) Noisy rooms, accents, crosstalk
large-v3-turbo Clear speech, faster

Scrub personal data

curl https://sporelabs.dev/v1/scrub \
  -H "Authorization: Bearer $SPORELABS_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"text":"Ask Dana Reyes to call +1 415 555 0134","mode":"tag"}'

Returns each personal detail or secret with its type (PERSON, ADDRESS, PHONE, EMAIL, CREDIT_CARD, PASSWORD, OTP, USERNAME, API keys by provider...), its offsets, and the scrubbed text. mode is find (default, findings only), tag ([PERSON]), pseudonym (a consistent stand-in of the same shape; add your own pseudonym_key, 16 to 256 characters, to keep stand-ins the same across calls) or mask (*****). Send up to 64 texts as texts, 50,000 characters per request; types limits which types are returned. The response has one entry in results per text, with findings, by_type and, outside find, the rewritten text. $0.50 per 1M characters. The open weights are at huggingface.co/SporeLabs/scrub.

Errors

Status Meaning
400 Bad request. Read the message.
401 Bad or missing key.
413 Request too large. Split it.
429 insufficient_quota Add funds.
429 / 503 Busy. Retry after Retry-After.
502 / 504 Upstream failed. Check before retrying side effects.