Tools

Audio to Markdown API

Submit any audio file. Get back a readable Markdown document with the full transcript, duration, and metadata.

Try it below:

FILEDrop a file or click to upload

Production-ready

Private by design

Security-first

Scalable

Production-ready

Private by design

Security-first

Scalable

Production-ready

Private by design

Security-first

Scalable

Turn audio files into Markdown

Upload an audio file or submit a URL, get Markdown back.

# Support call ticket #4821

**Kind:** audio
**Created:** 2026-07-24T14:30:00.000Z
**MIME Type:** audio/mpeg
**Size:** 4718592 bytes
**Chunks:** 12

## Media

**Duration:** 387.4s
**Transcript:**
Hi, thanks for calling Acme support. My name is James. How can I help you today?

Hi James, I'm having trouble with the webhook configuration. I set the URL in the dashboard but I'm not receiving any notifications when jobs complete.

OK, let me pull up your account. Can you confirm which endpoint you configured? And are you seeing any entries in the webhook logs?

The endpoint is our staging server, https://staging.example.com/webhooks. I checked the logs and there's nothing there at all. No attempts.

Got it. So if there are no log entries, that means the webhook hasn't fired at all. A couple of things that could cause this. First, can you confirm the extraction jobs are actually reaching completed state? Sometimes if they're stuck in processing the webhook won't trigger.

Yeah, I checked that. The jobs are completing. I can see the results when I poll the API directly. It's just the webhook that's not firing.

OK, that's helpful. Second thing to check is whether the webhook URL was saved correctly. Can you go to the extract settings endpoint and do a GET to confirm what's stored?

Sure, one sec. Oh, interesting. The webhookUrl field is null. It didn't save.

That's your issue. The PUT request to save the settings might have failed silently. Can you try setting it again and check the response status?

Just did it. Got a 200 back this time, and the GET confirms the URL is stored now. Let me trigger a test webhook on one of the completed jobs.

Perfect. Use the manual trigger endpoint, POST to /v2/extract/{jobId}/webhook/trigger. That'll dispatch it without reprocessing the job.

Got the trace ID back, and I can see the log entry now. Status 200 from our server. We're good. Thanks James.

No problem. Glad it was a quick fix. Anything else I can help with?

No, that's everything. Thanks again.

What is Exabase's audio to Markdown API?

Submit an audio file to the Exabase Extract API and get a Markdown document back instead of JSON. The same extraction pipeline runs: transcription, metadata extraction, and chunking. The difference is the output. Pass ?format=markdown when retrieving the result and you get a human-readable Markdown document with the full transcript instead of a JSON object.

The Markdown output includes the audio duration, MIME type, file size, and the complete transcript as continuous text. MP3, WAV, M4A, OGG, FLAC, and other major formats are supported. No speech-to-text model to deploy, no GPU to provision.

What you get back

The Markdown response is a single text document. Duration appears in the metadata block at the top. The full transcript follows under a ## Media section. The result is ready to feed directly into an LLM context window, store as a readable note, or use as a reference.

You can also configure webhooks with webhookFormat: "markdown" so completed jobs POST the Markdown document directly to your server.

One multi-modal API

The same POST /v2/extract endpoint handles every content type Exabase supports, and the ?format=markdown parameter works across all of them. For audio, you get duration and the full transcript. For video, you get duration, dimensions, and the transcript. For PDFs, you get document metadata and text. For images, you get dimensions and OCR text. For web pages, you get the page title, site name, and content.

The submission flow is identical across all types: one endpoint, one SDK method, one webhook configuration. You learn the pattern once and use it for everything. The Extract docs cover each content type in detail.

What you can build with it

Feed transcripts directly into your agent's context window as readable text. Build a meeting assistant that transcribes recordings and stores the Markdown for search and review. Power a podcast search platform where transcripts are indexed as readable documents.

Store transcribed audio as Resources in a Base and the transcript becomes searchable through Deep Search at the paragraph level. Workers can process new recordings as they arrive.

Beyond Markdown

The Extract API also returns JSON (the default) with timestamped chunks you can use for seek-to-source UIs or subtitle generation. The JSON and Markdown formats are two views of the same extraction. Use Markdown for LLM context and human review, JSON for structured processing with timestamps. The Audio to JSON tool page covers the JSON output.

How do I use it?

  1. Get your API key

Free, no credit card:

Sign up at exabase.io and copy your API key from the dashboard.

  1. Submit an audio file

Using the SDK (Node.js):

import { Exabase } from "@exabase/sdk";
import { createReadStream } from "fs";

const api = new Exabase({
  apiKey: process.env.EXABASE_API_KEY,
});

const job = await api.extract.createFromFile({
  file: createReadStream("./team-standup.mp3"),
  name: "Team standup — July 2026",
});

console.log(job.id);    // extraction job id
console.log(job.state); // "pending"
  1. Get Markdown back

Poll the job until state reaches completed, then request the Markdown format.

curl 'https://api.exabase.io/v2/extract/<jobId>?format=markdown' \
  -H 'X-Api-Key: <EXABASE_API_KEY>'

One API call. No speech-to-text model, no GPU, no Markdown conversion.

Example output

# Support call ticket #4821

**Kind:** audio
**Created:** 2026-07-24T14:30:00.000Z
**MIME Type:** audio/mpeg
**Size:** 4718592 bytes
**Chunks:** 12

## Media

**Duration:** 387.4s
**Transcript:**
Hi, thanks for calling Acme support. My name is James. How can I help
you today?

Hi James, I'm having trouble with the webhook configuration. I set the
URL in the dashboard but I'm not receiving any notifications when jobs
complete

API quick reference

Endpoint

Method

Description

/v2/extract

POST

Submit extraction job

/v2/extract

GET

List extraction jobs

/v2/extract/{jobId}

GET

Poll for result

/v2/extract/{jobId}/chunks

GET

Fetch timestamped chunks (JSON only)

/v2/extract-settings

PUT

Configure webhook

Auth: X-Api-Key header on all requests.

File retention: Stored files are retained for 1 day from job creation. Download or copy anything you need before they expire.

Need file extraction or full page content?

Exabase offers a full set of tools to extract content from any media, document or website.

All your data extraction needs in one place.

Why Exabase

Use cases

FAQs

What is Exabase?

Exabase is infrastructure for AI agents. It gives your agents memory, versioned file storage, AI deep search, and context automation through a set of APIs. Store what your agent learns, search inside any content type, and keep knowledge bases current automatically. Built for production use. Give your agent precise context and cut your token spend by up to 81%.

Who uses Exabase?

Developers and teams building AI agents, copilots, and RAG applications. If your agent needs to remember things between sessions, store and retrieve files, search across documents and media, or stay up to date without manual maintenance, Exabase handles that infrastructure so you can focus on your product.

How fast is transcription?

Processing time depends on the file length and format. Most audio files complete in seconds to a few minutes. Processing is asynchronous, so your application is not blocked while transcription runs.

How do I get Markdown instead of JSON?

Add ?format=markdown to the GET /v2/extract/{jobId} request. For webhooks, set webhookFormat: "markdown" in your extract settings.

Does the Markdown output include timestamps?

The Markdown output includes the full transcript as continuous text and the total duration. For per-segment timestamps, use the JSON format and fetch chunks via GET /v2/extract/{jobId}/chunks.

Can I still get JSON?

Yes. JSON is the default. Both formats are available from the same extraction job.

How is this different from Audio to JSON?

Same extraction pipeline, different output format. Audio to JSON returns a structured JSON object with timestamped chunks. Audio to Markdown returns a readable text document. Both are available from the same job.

What happens if extraction fails?

The job state moves to failed. You can call the reprocess endpoint to retry without re-uploading the original file.

What audio formats are supported?

MP3, WAV, M4A, OGG, FLAC, and other major formats. The API auto-detects the content type.

Do I have to poll for results?

No. Configure a webhook with webhookFormat: "markdown" to receive the Markdown document on completion.

How long are files retained?

Stored files are retained for 1 day from job creation, then permanently deleted.

Is there an SDK?

Yes. The @exabase/sdk package for Node.js/TypeScript handles file streaming, job polling, and chunk retrieval. Install with npm install @exabase/sdk. Or call the REST API directly from any language.

What other content types support Markdown output?

All of them. See the PDF to Markdown, Video to Markdown, Image to Markdown, and Website to Markdown tool pages.

Deciding?

Ask your favourite AI about Exabase:

Cut your token spend and give your agent precise context.

Get started in minutes.

Cut your token spend and give your agent precise context.

Get started in minutes.