Create Transcription
curl --request POST \
--url https://easy-peasy.ai/api/transcriptions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://example.com/audiofile.mp3",
"audio_type": "podcast",
"language": "English",
"name": "Interview with John Doe",
"detect_speakers": true,
"enhanced_quality": true
}
'import requests
url = "https://easy-peasy.ai/api/transcriptions"
payload = {
"url": "https://example.com/audiofile.mp3",
"audio_type": "podcast",
"language": "English",
"name": "Interview with John Doe",
"detect_speakers": True,
"enhanced_quality": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: 'https://example.com/audiofile.mp3',
audio_type: 'podcast',
language: 'English',
name: 'Interview with John Doe',
detect_speakers: true,
enhanced_quality: true
})
};
fetch('https://easy-peasy.ai/api/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://easy-peasy.ai/api/transcriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://example.com/audiofile.mp3',
'audio_type' => 'podcast',
'language' => 'English',
'name' => 'Interview with John Doe',
'detect_speakers' => true,
'enhanced_quality' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://easy-peasy.ai/api/transcriptions"
payload := strings.NewReader("{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://easy-peasy.ai/api/transcriptions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://easy-peasy.ai/api/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}"
response = http.request(request)
puts response.read_body{
"uuid": "4bc4e8ee-f29e-4a53-996e-5da955c42927",
"dashboard_url": "https://easy-peasy.ai/audios/4bc4e8ee-f29e-4a53-996e-5da955c42927"
}{
"error": "Invalid input"
}{
"error": "Invalid API key"
}{
"error": "Invalid API key"
}{
"error": "Server error"
}Transcription
Create Transcription
Programmatically create AI Transcriptions from audio files.
POST
/
api
/
transcriptions
Create Transcription
curl --request POST \
--url https://easy-peasy.ai/api/transcriptions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://example.com/audiofile.mp3",
"audio_type": "podcast",
"language": "English",
"name": "Interview with John Doe",
"detect_speakers": true,
"enhanced_quality": true
}
'import requests
url = "https://easy-peasy.ai/api/transcriptions"
payload = {
"url": "https://example.com/audiofile.mp3",
"audio_type": "podcast",
"language": "English",
"name": "Interview with John Doe",
"detect_speakers": True,
"enhanced_quality": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: 'https://example.com/audiofile.mp3',
audio_type: 'podcast',
language: 'English',
name: 'Interview with John Doe',
detect_speakers: true,
enhanced_quality: true
})
};
fetch('https://easy-peasy.ai/api/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://easy-peasy.ai/api/transcriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://example.com/audiofile.mp3',
'audio_type' => 'podcast',
'language' => 'English',
'name' => 'Interview with John Doe',
'detect_speakers' => true,
'enhanced_quality' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://easy-peasy.ai/api/transcriptions"
payload := strings.NewReader("{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://easy-peasy.ai/api/transcriptions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://easy-peasy.ai/api/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://example.com/audiofile.mp3\",\n \"audio_type\": \"podcast\",\n \"language\": \"English\",\n \"name\": \"Interview with John Doe\",\n \"detect_speakers\": true,\n \"enhanced_quality\": true\n}"
response = http.request(request)
puts response.read_body{
"uuid": "4bc4e8ee-f29e-4a53-996e-5da955c42927",
"dashboard_url": "https://easy-peasy.ai/audios/4bc4e8ee-f29e-4a53-996e-5da955c42927"
}{
"error": "Invalid input"
}{
"error": "Invalid API key"
}{
"error": "Invalid API key"
}{
"error": "Server error"
}Complete workflow
Transcription is asynchronous — after submitting an audio file, you need to poll for results. Here’s the full workflow:Step 1: Submit audio for transcription
Submit a publicly downloadable audio URL with this endpoint. A paid subscription and remaining monthly transcription allowance are required. The response includes auuid you’ll need for the next steps.
Transcription typically takes 1–5 minutes depending on audio length. Save the
uuid from the response.Step 2: Poll for results
Use Get Transcription Result with the same account’s API key. Poll every 15–30 seconds whiletranscription_status is processing.
API-key responses return content, segments, and transcription_status at the top level, without an audio wrapper. done means complete even if no speech was detected and content is empty. Stop on failed. Older records may contain transcript text without a status.
The following Node.js 20+ example stops after ten minutes. Keep the UUID if it times out so you can check the existing job later.
async function waitForTranscription(uuid, apiKey) {
const deadline = Date.now() + 10 * 60 * 1000;
while (Date.now() < deadline) {
const response = await fetch('https://easy-peasy.ai/api/audios', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
body: JSON.stringify({ audio_id: uuid }),
signal: AbortSignal.timeout(Math.max(1, Math.min(30000, deadline - Date.now()))),
});
const data = await response.json().catch(() => null);
if (!response.ok) {
throw new Error(`Transcription ${uuid}: HTTP ${response.status}: ${data?.error || 'Could not retrieve transcription'}`);
}
if (!data || data.uuid !== uuid) {
throw new Error(`Unexpected response for transcription ${uuid}`);
}
if (data.transcription_status === 'failed') {
throw new Error(`Transcription ${uuid} failed`);
}
if (data.transcription_status === 'done' ||
(!data.transcription_status && data.content)) {
return data;
}
if (data.transcription_status && data.transcription_status !== 'processing') {
throw new Error(`Unknown transcription status: ${data.transcription_status}`);
}
await new Promise(resolve => setTimeout(resolve, Math.max(0, Math.min(15000, deadline - Date.now()))));
}
throw new Error(`Timed out waiting for transcription ${uuid}. Keep this UUID and check it later.`);
}
Step 3: Generate AI content (optional)
Once the transcription is complete, use Generate Audio Content to create summaries, titles, action items, and more.curl -X POST https://easy-peasy.ai/api/generate-audio-content \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"audio_id": "YOUR_AUDIO_UUID"}'
curl -X POST https://easy-peasy.ai/api/generate-audio-content \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"audio_id": "YOUR_AUDIO_UUID",
"fields": ["summary", "title", "keywords"]
}'
| Audio Type | Fields |
|---|---|
| Meeting | summary, title, description, action items, keywords, timestamped overview, topics & bullets, LinkedIn post |
| Podcast | summary, title, description, show notes, Twitter thread, article, newsletter, keywords, questions, LinkedIn post, timestamped overview, topics & bullets |
| Therapy Session | summary, title, description, progress note, SOAP note, DAP note, keywords, timestamped overview, topics & bullets, LinkedIn post |
Authorizations
API key for authentication. Get yours at https://easy-peasy.ai/settings/api
Body
application/json
The audio parameters to create transcriptions
The URL of the audio file
Example:
"https://example.com/audiofile.mp3"
The type of audio (e.g., podcast, meeting)
Example:
"podcast"
The language of the audio (e.g., English, Chinese, French)
Example:
"English"
The name of the transcription
Example:
"Interview with John Doe"
Whether to detect multiple speakers
Example:
true
Whether to use enhanced quality for transcription
Example:
true
Was this page helpful?
