Transcription your servers can call
Post a file or a URL, poll one endpoint, get back timestamped, speaker-labelled text. The same engine that powers Hear2Text, behind an HTTP API — included with every subscription, at no extra cost per minute.
curl -X POST https://heartotext.com/api/public/v1/transcriptions \
-H "Authorization: Bearer h2t_live_..." \
-H "Idempotency-Key: 7f3c9a12" \
-F "file=@meeting.m4a" \
-F "language=en"
{
"id": "0f2f5f6a-2c6c-4f4e-9d1e-5d8f2a1b3c4d",
"status": "queued",
"title": null,
"language": "en",
"duration_seconds": null,
"created_at": "2026-09-19T10:11:12+00:00",
"updated_at": "2026-09-19T10:11:12+00:00",
"source": { "type": "file", "name": "meeting", "url": null },
"workspace": null,
"progress": { "step": null, "percent": null, "indeterminate": false },
"failure_reason": null
}Upload a recording and get an id back.
What you can build
Anything that needs speech turned into text without a person in the loop.
Meeting notes
Drop the recording from your conferencing tool in as the call ends and have the transcript waiting in your workspace before anyone opens their laptop again.
Podcast pipelines
Generate show notes, chapter markers and SRT subtitles from the master file as part of your publishing job.
Call quality review
Score support and sales calls automatically: speaker labels tell you who spoke, timestamps tell you when.
Media archives
Backfill years of audio and video into searchable text, one request per file, at the pace your fair-use ceiling allows.
Three requests, start to finish
No SDK to install, no webhooks to host. Create, poll, fetch.
Create
POST the file or a URL. You get an id and the status "queued" straight back.
curl -X POST https://heartotext.com/api/public/v1/transcriptions \
-H "Authorization: Bearer h2t_live_..." \
-H "Idempotency-Key: 7f3c9a12" \
-F "file=@meeting.m4a" \
-F "language=en"
{
"id": "0f2f5f6a-2c6c-4f4e-9d1e-5d8f2a1b3c4d",
"status": "queued",
"title": null,
"language": "en",
"duration_seconds": null,
"created_at": "2026-09-19T10:11:12+00:00",
"updated_at": "2026-09-19T10:11:12+00:00",
"source": { "type": "file", "name": "meeting", "url": null },
"workspace": null,
"progress": { "step": null, "percent": null, "indeterminate": false },
"failure_reason": null
}Poll
GET the transcription until status reads "completed". The response carries a progress step and percentage while it works.
curl https://heartotext.com/api/public/v1/transcriptions/0f2f5f6a-2c6c-4f4e-9d1e-5d8f2a1b3c4d \
-H "Authorization: Bearer h2t_live_..."
{
"id": "0f2f5f6a-2c6c-4f4e-9d1e-5d8f2a1b3c4d",
"status": "completed",
"title": null,
"language": "en",
"duration_seconds": 1845,
"created_at": "2026-09-19T10:11:12+00:00",
"updated_at": "2026-09-19T10:14:40+00:00",
"source": { "type": "file", "name": "meeting", "url": null },
"workspace": null,
"progress": { "step": null, "percent": null, "indeterminate": false },
"failure_reason": null
}Fetch
GET the segments, cursor-paginated, or ask for the whole thing as txt, srt, vtt, pdf or docx.
curl "https://heartotext.com/api/public/v1/transcriptions/0f2f5f6a-2c6c-4f4e-9d1e-5d8f2a1b3c4d/segments?limit=100" \
-H "Authorization: Bearer h2t_live_..."
{
"data": [
{ "index": 0, "start": 61.0, "end": 65.0, "speaker": "A", "text": "Hello" }
],
"has_more": true,
"next_cursor": "eyJvIjoxMDB9"
}核心功能
Speaker labels
Every segment carries the speaker it belongs to, worked out from the audio itself.
Timestamped segments
Start and end times on every segment, ready for subtitles or for seeking in a player.
Automatic language detection
Send the audio without a language and it is detected, or pin it with an ISO code.
Export formats
txt, srt, vtt, pdf and docx from the same transcription, without re-running it.
Safe retries
Send an Idempotency-Key with a create and a repeated request returns the first response instead of a second transcription.
One error shape
Every failure is a JSON body with a stable error code and a human message.
Included with every Hear2Text subscription
The API is not a separate product and has no separate bill. Any paid plan turns it on; there is no per-minute API price and no free API tier. Your key stops working if the subscription lapses, and starts again when it resumes.
Keys are created and revoked in your profile, under the API tab. A key is shown once, at creation.
Limits
These are the numbers the API enforces, read straight from the running configuration.
| Limit | Value |
|---|---|
| Longest single recording | 6 hours |
| Audio per day (fair use) | 1200 minutes |
| Transcriptions running at once | 5 |
| Largest upload | 512 MB |
| Requests per minute, per key | 120 |
| New transcriptions per hour, per account | 60 |
| New transcriptions per day, per account | 500 |
Go over a rate limit and you get a 429 with a Retry-After header — nothing is dropped, and nothing is billed extra.
常见问题
How much does the API cost?
Is there a free tier or a trial key?
Do you send webhooks when a transcription finishes?
Can I translate or use the AI assistant through the API?
Can I call the API from the browser?
What happens to my keys if I cancel?
Start building
The reference, the error catalogue and copy-paste examples are all in the docs.
