curl --request POST \
--url https://recoup-api.vercel.app/api/transcribe \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"audio_url": "https://example.com/song.mp3",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"artist_account_id": "550e8400-e29b-41d4-a716-446655440001",
"title": "My Song",
"include_timestamps": false
}
'import requests
url = "https://recoup-api.vercel.app/api/transcribe"
payload = {
"audio_url": "https://example.com/song.mp3",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"artist_account_id": "550e8400-e29b-41d4-a716-446655440001",
"title": "My Song",
"include_timestamps": False
}
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({
audio_url: 'https://example.com/song.mp3',
account_id: '550e8400-e29b-41d4-a716-446655440000',
artist_account_id: '550e8400-e29b-41d4-a716-446655440001',
title: 'My Song',
include_timestamps: false
})
};
fetch('https://recoup-api.vercel.app/api/transcribe', 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://recoup-api.vercel.app/api/transcribe",
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([
'audio_url' => 'https://example.com/song.mp3',
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'artist_account_id' => '550e8400-e29b-41d4-a716-446655440001',
'title' => 'My Song',
'include_timestamps' => false
]),
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://recoup-api.vercel.app/api/transcribe"
payload := strings.NewReader("{\n \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\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://recoup-api.vercel.app/api/transcribe")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://recoup-api.vercel.app/api/transcribe")
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 \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"audioFile": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fileName": "<string>",
"storageKey": "<string>"
},
"transcriptFile": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fileName": "<string>",
"storageKey": "<string>"
},
"text": "<string>",
"language": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Transcribe Audio
Transcribe audio files using OpenAI Whisper. The API saves both the original audio file and the generated markdown transcript to the customer’s files in Supabase Storage.
curl --request POST \
--url https://recoup-api.vercel.app/api/transcribe \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"audio_url": "https://example.com/song.mp3",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"artist_account_id": "550e8400-e29b-41d4-a716-446655440001",
"title": "My Song",
"include_timestamps": false
}
'import requests
url = "https://recoup-api.vercel.app/api/transcribe"
payload = {
"audio_url": "https://example.com/song.mp3",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"artist_account_id": "550e8400-e29b-41d4-a716-446655440001",
"title": "My Song",
"include_timestamps": False
}
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({
audio_url: 'https://example.com/song.mp3',
account_id: '550e8400-e29b-41d4-a716-446655440000',
artist_account_id: '550e8400-e29b-41d4-a716-446655440001',
title: 'My Song',
include_timestamps: false
})
};
fetch('https://recoup-api.vercel.app/api/transcribe', 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://recoup-api.vercel.app/api/transcribe",
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([
'audio_url' => 'https://example.com/song.mp3',
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'artist_account_id' => '550e8400-e29b-41d4-a716-446655440001',
'title' => 'My Song',
'include_timestamps' => false
]),
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://recoup-api.vercel.app/api/transcribe"
payload := strings.NewReader("{\n \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\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://recoup-api.vercel.app/api/transcribe")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://recoup-api.vercel.app/api/transcribe")
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 \"audio_url\": \"https://example.com/song.mp3\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"artist_account_id\": \"550e8400-e29b-41d4-a716-446655440001\",\n \"title\": \"My Song\",\n \"include_timestamps\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"audioFile": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fileName": "<string>",
"storageKey": "<string>"
},
"transcriptFile": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fileName": "<string>",
"storageKey": "<string>"
},
"text": "<string>",
"language": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Your Recoup API key. Learn more.
Body
Audio transcription request
Public URL to the audio file (mp3, wav, m4a, webm)
"https://example.com/song.mp3"
Owner account ID for file storage
"550e8400-e29b-41d4-a716-446655440000"
Artist account ID for file storage
"550e8400-e29b-41d4-a716-446655440001"
Optional title for the audio and transcription files
"My Song"
Whether to include timestamps in the markdown transcript
Response
Audio transcribed successfully
Whether the transcription was successful
Information about the saved audio file
Show child attributes
Show child attributes
Information about the saved transcript file
Show child attributes
Show child attributes
The full transcription text
Detected language code (e.g., 'en', 'es', 'fr')
