Skip to content

Audio Transcription API

Transcribe audio files from a public URL using the Bismuth Audio Transcription API. Returns full transcription text with segment-level or word-level timestamps, charged at $0.05 USDC per call.

Free test endpoint: GET /transcribe/test at https://transcribe.jameswisdom.ink — returns fixture data, no wallet required. Paid endpoint: POST /transcribe — $0.05 USDC on Base per call.

ParameterTypeRequiredDefaultDescription
urlstringYesAudio file URL (http/https, public, max 25 MB, max 10 minutes)
languagestringNoISO 639-1 language hint (e.g., "en") — omit for auto-detect
word_timestampsbooleanNofalsetrue for word-level timing, false for segment-level
Terminal window
# Free test (no wallet required)
curl https://transcribe.jameswisdom.ink/transcribe/test
# Paid call (requires x402-fetch or x402-mcp-server — handles X-Payment header automatically)
curl -X POST https://transcribe.jameswisdom.ink/transcribe \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/meeting.mp3", "language": "en"}'

“Transcribe this audio recording and include word-level timestamps: https://example.com/interview.wav

{
"tool": "x402_transcribe_audio",
"arguments": {
"url": "https://example.com/interview.wav",
"word_timestamps": true
}
}

The response schema branches based on word_timestamps. The segments and timestamps fields are mutually exclusive — only one appears per response.

When word_timestamps: false (default) — segment-level output:

{
"text": "Full transcription text...",
"segments": [
{"start": 0.0, "end": 2.5, "text": "First sentence."},
{"start": 2.5, "end": 5.1, "text": "Second sentence."}
],
"language": "en",
"duration": 120.5
}

When word_timestamps: true — word-level output:

{
"text": "Full transcription text...",
"timestamps": [
{"word": "First", "start": 0.0, "end": 0.3},
{"word": "sentence", "start": 0.3, "end": 0.8}
],
"language": "en",
"duration": 120.5
}

Files exceeding the 25 MB size limit are rejected before download (no charge). Files exceeding the 10-minute duration limit are rejected after download — the charge applies.

CodeMeaning
400SSRF blocked — URL targets a private/reserved IP range
402Payment required — x402 handshake (handled automatically by MCP server)
413File exceeds 25 MB size limit
422Download failed, audio format unreadable, or duration exceeds 10 minutes
429Free test rate limit exceeded (100/hour per IP)
500Transcription model error
503Transcription model not loaded or temporarily unavailable