Bantefa for developers
Send us the audio of a meeting while it happens. Get a live transcript as it goes, and the full transcript, notes and deadlines when it ends.
What it does
- A live transcript while the meeting runs, about half a minute to a minute and a half behind the talk
- The whole transcript when it ends, every line with its time
- Notes and deadlines if you ask for them: the main points in clear sections, and every date someone gives
- A signed webhook when a recording is ready, so you don't have to keep asking
- The same engine that writes the class notes in the Bantefa app
Good to know first
- No speaker names. The transcript says what was said, not who said it.
- Live means close behind, not instant. Lines arrive 30 to 90 seconds after they're spoken, so it's a running transcript, not captions.
- You ask your users first. Get the consent of everyone you record, as Nigeria's data protection law expects, and tell them a transcript is made.
- Up to 2 hours a recording. After 2 hours of audio a recording takes no more, and you finish it to get the transcript.
- We don't keep it long. Audio is deleted 7 days after its transcript is ready, and the transcript and notes 30 days after that. Save your own copy, or delete a recording sooner yourself.
Pricing
Transcript
₦10 a minute
Live lines, then the full transcript with times.
With notes
₦15 a minute
The transcript, plus notes and deadlines when it ends.
- Billed by the second, from the length of the audio itself
- Every new key starts with ₦200 of credit to try it: about 20 minutes of transcripts
- Prepaid in naira. Top up through Paystack by card, transfer or USSD, from ₦5,000
- More for more: 10% extra credit on top-ups from ₦50,000, and 20% from ₦200,000
- When credit runs out, new recordings stop. Nothing you've sent is lost: it waits, and finishes by itself once you top up
Recording a lot every month? Write to us about a custom rate.
Quick start
Everything is under https://api.bantefa.com/v1/partner, with your key as a bearer token. Keep the key on your server, never in an app or a web page.
-
Start a recording when the meeting starts
curl -X POST https://api.bantefa.com/v1/partner/recordings \ -H "Authorization: Bearer $BANTEFA_KEY" \ -H "Content-Type: application/json" \ -d '{"externalId":"room-42-2026-11-02","title":"Biology study room","notes":true,"metadata":{"roomId":"room-42"}}'externalIdis your own id for it: sending the same one again gives back the same recording, so a retry is safe.notes: trueasks for notes and deadlines too. The reply has the recording'sid. -
Send the audio in pieces as it goes
curl -X PUT https://api.bantefa.com/v1/partner/recordings/7/audio/0 \ -H "Authorization: Bearer $BANTEFA_KEY" \ -H "Content-Type: audio/mp4" \ -H "X-Started-At: 2026-11-02T15:00:00Z" \ -H "X-Ended-At: 2026-11-02T15:01:00Z" \ --data-binary @piece-0.m4aNumber the pieces 0, 1, 2 and so on. Pieces of 30 to 60 seconds give live lines soonest, in m4a, mp3, wav, ogg or webm. Send the start and end times of each piece, so gaps in the meeting stay gaps. A piece can go again if an upload fails: it replaces the first copy.
-
Show the live lines
curl "https://api.bantefa.com/v1/partner/recordings/7/live?from=0" \ -H "Authorization: Bearer $BANTEFA_KEY"You get
lines(each withstartandendin milliseconds and itstext) andstableUntil. Lines beforestableUntilwon't change. Ask again every 10 to 15 seconds withfromset to it, and replace everything from there on. -
Finish when the meeting ends
curl -X POST https://api.bantefa.com/v1/partner/recordings/7/finish \ -H "Authorization: Bearer $BANTEFA_KEY" \ -H "Content-Type: application/json" \ -d '{"pieceCount":42}'With
pieceCountit waits for any piece still on its way. A recording nobody finishes is finished for you 30 minutes after its last piece. Once a recording has 2 hours of audio, more pieces get409 meeting_too_long: finish it then. -
Get the transcript
curl https://api.bantefa.com/v1/partner/recordings/7 \ -H "Authorization: Bearer $BANTEFA_KEY"When
statusisready:transcript(timed lines),text(plain text) and, with notes,summary(markdown) anddeadlines. Your webhook hears about it first, so there's no need to keep asking.
Also there: GET /v1/partner/usage for your balance and what each day used, POST /v1/partner/topups for a Paystack link to top up, GET /v1/partner/recordings to list them, and DELETE /v1/partner/recordings/:id to delete one now. We send the full reference with your key.
Webhooks
Set your address with PUT /v1/partner/webhook and {"url": "https://..."}. The reply has the secret that signs every delivery. We send recording.ready, recording.failed, recording.held (out of credit) and balance.low (under ₦1,000). Each has a Bantefa-Signature header: check it before you trust the body.
// Bantefa-Signature: t=<unix seconds>,v1=<hex HMAC SHA-256 of "t.body">
const [, t, v1] = req.headers["bantefa-signature"].match(/^t=(\d+),v1=([0-9a-f]{64})$/);
const want = crypto.createHmac("sha256", process.env.BANTEFA_WEBHOOK_SECRET)
.update(`${t}.${rawBody}`).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(want))
&& Number(t) + 300 > Date.now() / 1000; // sent in the last 5 minutes
Answer with any 2xx within 10 seconds. If you don't, we try again after 1, 5, 30, 120 and 360 minutes. The same event can come twice, so skip an id you've seen.
Limits
| What | To start |
|---|---|
| Recordings open at once | 3 (we raise it as you grow) |
| Requests a minute, per key | 300 |
| One recording | Up to 2 hours of audio |
| A piece of audio | Up to 25 MB |
| Audio kept | 7 days after its transcript is ready |
| Transcripts and notes kept | 30 days after that |
Past a limit you get a 429 with how long to wait, or 402 no_credit when the credit is used up. Every error has a code to branch on and a plain sentence to show.
Get a key
Write to [email protected] with:
- your app, and what you'll record (meetings, classes, study rooms)
- about how many hours a month you expect
- the email address for top-up receipts
We'll send your key with ₦200 of credit on it to try things out.
Email us for a key