cURL
curl --request POST \
--url https://nano-gpt.com/api/youtube-transcribe \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"urls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/kJQP7kiw5Fk"
]
}
'import requests
url = "https://nano-gpt.com/api/youtube-transcribe"
payload = { "urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/kJQP7kiw5Fk"] }
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({
urls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'https://youtu.be/kJQP7kiw5Fk']
})
};
fetch('https://nano-gpt.com/api/youtube-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://nano-gpt.com/api/youtube-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([
'urls' => [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/kJQP7kiw5Fk'
]
]),
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://nano-gpt.com/api/youtube-transcribe"
payload := strings.NewReader("{\n \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\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://nano-gpt.com/api/youtube-transcribe")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://nano-gpt.com/api/youtube-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 \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"transcripts": [
{
"url": "<string>",
"success": true,
"title": "<string>",
"transcript": "<string>",
"error": "<string>"
}
],
"summary": {
"requested": 123,
"processed": 123,
"successful": 123,
"failed": 123,
"totalCost": 123
}
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Endpoint Examples
YouTube Transcription
Extract transcripts from YouTube videos programmatically. Supports multiple URLs per request and provides detailed response information including success/failure status for each video.
POST
/
youtube-transcribe
cURL
curl --request POST \
--url https://nano-gpt.com/api/youtube-transcribe \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"urls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/kJQP7kiw5Fk"
]
}
'import requests
url = "https://nano-gpt.com/api/youtube-transcribe"
payload = { "urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/kJQP7kiw5Fk"] }
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({
urls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'https://youtu.be/kJQP7kiw5Fk']
})
};
fetch('https://nano-gpt.com/api/youtube-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://nano-gpt.com/api/youtube-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([
'urls' => [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/kJQP7kiw5Fk'
]
]),
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://nano-gpt.com/api/youtube-transcribe"
payload := strings.NewReader("{\n \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\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://nano-gpt.com/api/youtube-transcribe")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://nano-gpt.com/api/youtube-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 \"urls\": [\n \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"https://youtu.be/kJQP7kiw5Fk\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"transcripts": [
{
"url": "<string>",
"success": true,
"title": "<string>",
"transcript": "<string>",
"error": "<string>"
}
],
"summary": {
"requested": 123,
"processed": 123,
"successful": 123,
"failed": 123,
"totalCost": 123
}
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Overview
The YouTube Transcription API allows you to extract transcripts from YouTube videos programmatically. This is useful for content analysis, accessibility, research, or any application that needs to work with YouTube video content in text format.Authentication
The API supports two authentication methods:1. API Key Authentication (Recommended)
Include your API key in the request headers:x-api-key: YOUR_API_KEY
2. Session Authentication
If you’re making requests from a browser with an active session, authentication will be handled automatically via cookies.Request Format
Headers
{
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY"
}
Body
{
"urls": [
"https://www.youtube.com/watch?v=VIDEO_ID_1",
"https://youtu.be/VIDEO_ID_2",
"https://youtube.com/watch?v=VIDEO_ID_3"
]
}
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
urls | string[] | Yes | Array of YouTube URLs to transcribe. Maximum 10 URLs per request. |
Supported YouTube URL Formats
https://www.youtube.com/watch?v=VIDEO_IDhttps://youtu.be/VIDEO_IDhttps://youtube.com/embed/VIDEO_IDhttps://m.youtube.com/watch?v=VIDEO_IDhttps://youtube.com/live/VIDEO_ID
Response Format
Success Response (200 OK)
{
"transcripts": [
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"success": true,
"title": "Rick Astley - Never Gonna Give You Up",
"transcript": "We're no strangers to love\nYou know the rules and so do I..."
},
{
"url": "https://youtube.com/watch?v=invalid",
"success": false,
"error": "Video not found or transcripts not available"
}
],
"summary": {
"requested": 2,
"processed": 2,
"successful": 1,
"failed": 1,
"totalCost": 0.01
}
}
Response Fields
transcripts Array
Each transcript object contains:
url(string): The original YouTube URLsuccess(boolean): Whether the transcript was successfully retrievedtitle(string, optional): Video title (only if successful)transcript(string, optional): The full transcript text (only if successful)error(string, optional): Error message (only if failed)
summary Object
requested: Number of URLs provided in the requestprocessed: Number of valid YouTube URLs found and processedsuccessful: Number of transcripts successfully retrievedfailed: Number of transcripts that failedtotalCost: Total cost in USD for successful transcripts
Error Responses
400 Bad Request
{
"error": "Please provide an array of YouTube URLs"
}
401 Unauthorized
{
"error": "Invalid session"
}
402 Payment Required
{
"error": "Insufficient balance. Current balance: $0.50, required: $1.00"
}
429 Too Many Requests
{
"error": "Rate limit exceeded. Please wait before sending another request."
}
Pricing
- Cost: $0.01 USD per successful transcript
- Billing: You are only charged for successfully retrieved transcripts
- Failed transcripts: No charge
Rate Limits
- 10 requests per minute per IP address
- 10 URLs maximum per request
Code Examples
const axios = require('axios');
async function getYouTubeTranscripts() {
try {
const response = await axios.post('https://nano-gpt.com/api/youtube-transcribe', {
urls: [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/kJQP7kiw5Fk'
]
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': 'YOUR_API_KEY'
}
});
console.log('Transcripts:', response.data.transcripts);
console.log('Summary:', response.data.summary);
} catch (error) {
console.error('Error:', error.response?.data || error.message);
}
}
import requests
def get_youtube_transcripts():
url = 'https://nano-gpt.com/api/youtube-transcribe'
headers = {
'Content-Type': 'application/json',
'x-api-key': 'YOUR_API_KEY'
}
data = {
'urls': [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/kJQP7kiw5Fk'
]
}
try:
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
result = response.json()
print('Transcripts:', result['transcripts'])
print('Summary:', result['summary'])
except requests.exceptions.RequestException as e:
print(f'Error: {e}')
if hasattr(e.response, 'json'):
print('Details:', e.response.json())
curl -X POST https://nano-gpt.com/api/youtube-transcribe \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"urls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/kJQP7kiw5Fk"
]
}'
<?php
$url = 'https://nano-gpt.com/api/youtube-transcribe';
$data = [
'urls' => [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'https://youtu.be/kJQP7kiw5Fk'
]
];
$options = [
'http' => [
'header' => [
"Content-Type: application/json",
"x-api-key: YOUR_API_KEY"
],
'method' => 'POST',
'content' => json_encode($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) {
die('Error occurred');
}
$response = json_decode($result, true);
print_r($response);
?>
Best Practices
- Batch Requests: Send multiple URLs in a single request (up to 10) rather than making individual requests for better efficiency.
-
Error Handling: Always check the
successfield for each transcript, as some videos may not have transcripts available. - Rate Limiting: Implement exponential backoff if you receive a 429 status code.
- URL Validation: The API automatically detects and validates YouTube URLs, but validating on your end can save API calls.
-
Cost Monitoring: Use the
summary.totalCostfield to track your spending.
Limitations
-
Transcript Availability: Not all YouTube videos have transcripts available. Videos may lack transcripts if:
- The creator hasn’t enabled auto-captions
- The video is private or age-restricted
- The video has been deleted
- The video is a live stream without captions
- Language: Transcripts are returned in their original language. The API doesn’t provide translation services.
- Formatting: Transcripts are returned as plain text with natural line breaks. Timestamp information is not included.
Use Cases
- Content Analysis: Analyze video content for keywords, topics, or sentiment
- Accessibility: Create accessible versions of video content
- Research: Study communication patterns, language use, or content trends
- SEO: Extract content for search engine optimization
- Education: Create study materials from educational videos
- Content Moderation: Check video content for compliance
Support
For technical support or questions about the YouTube Transcription API:- Email: support@nano-gpt.com
- Documentation: https://docs.nano-gpt.com
- Status Page: https://status.nano-gpt.com
Authorizations
Body
application/json
YouTube transcription parameters
Array of YouTube URLs to transcribe (maximum 10 URLs per request)
Required array length:
1 - 10 elementsYouTube URL in supported format
Example:
[
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/kJQP7kiw5Fk"
]