REST API first. Faster-launch tools when you need them.
Video Download API for downloader products
Start free, get an API key, try the API, and build downloader tools with a REST API designed for custom apps, workflow automation, and production download experiences.
REST API is the core product
Create a download job
curl "https://p.savenow.to/ajax/download.php?format=mp3&url=VIDEO_URL&apikey=YOUR_API_KEY"
- Job flow
- Request, poll, return URL
- Formats
- MP3, MP4, subtitles
- Launch path
- Docs to API key
Product overview
Build with the API. Launch faster with supporting options.
SaveNow is built around a REST Video Download API for teams that need control over downloader UX, pricing, formats, and polling. Widgets, cards, buttons, and templates are supporting paths for teams that want a smaller integration surface.
Primary product
REST API
Create download jobs, poll progress, and return video, audio, subtitle, transcript, thumbnail, and metadata results from your own product.
Fast embed
Widget API
Drop a hosted converter experience into a page when speed matters more than full interface control.
UI shortcuts
Cards and buttons
Use prebuilt cards or action buttons to add downloader flows without designing every state yourself.
Starter projects
Templates
Start with ready-made downloader templates for common frontend and Laravel launches.
Pricing teaser
Pay as you launch and scale
Start free, test with your API key, then use usage-based pricing for production downloader traffic.
View pricingDocs and resources
Use OpenAPI, examples, and templates
Open the API reference for request details, or use resource templates when you want a faster downloader launch.
Support paths
Find the right next step
Existing users can jump back into the dashboard, while new teams can reach support before committing build time.
Implementation options
Widgets, cards, buttons, and templates are launch accelerators
Choose REST API when the downloader is part of your product. Choose the supporting options when you need a hosted interface, embedded UI, or starter code.
Choose the integration method that best fits your needs
REST API
PaidDirect REST API for advanced integrations. Build custom download interfaces with full control over the user experience and download process. Perfect for mobile apps and custom applications.
First API call
Get from signup to polling in four steps
Use this path when you want the fastest working REST request: create an account, grab the generated API key, copy a request example, then poll the job ID until the download URL is ready.
-
1
-
2
Copy your API key
Open the dashboard and copy the API key shown in your account widgets before replacing
Open dashboardYOUR_API_KEY. -
3
Copy a request example
Start with the cURL example, then switch to JavaScript or PHP when you are ready to integrate.
-
4
Poll progress with the job ID
Read the
View progress endpointidfrom the download response and check progress every 2-3 seconds.
🎉 Now Available on RapidAPI!
We're excited to announce that our API is now also available on RapidAPI platform with additional payment options! The pricing remains the same, but you now have more flexibility in how you want to subscribe and pay.
OpenAPI Documentation
Explore our full interactive API reference powered by OpenAPI. Try endpoints directly, download the spec in YAML or JSON, and integrate with tools like Postman or Insomnia.
Load Balancing Endpoints
Due to recent domain takeovers and regional restrictions in certain countries (including UK and India), we provide multiple load balancing endpoints for maximum availability and redundancy.
Primary Endpoint
p.savenow.to
Secondary Endpoint
p.lbserver.xyz
Regional Availability
Important: If one endpoint is inaccessible in your region, simply switch to the alternative endpoint. All endpoints provide identical functionality and pricing. Additionally, our progress endpoints now return an array of alternative download URLs to ensure your users can always access their downloads regardless of regional blocking.
Download Endpoint
/ajax/download.php
Query Parameters
format
Required
The file format to download (mp3, 1080, 720, etc.)
url
Required
The URL-encoded video URL
apikey
Required
Your API key for authentication
add_info
Optional
Include additional metadata (set to 1)
audio_quality
Optional
Audio quality in kbps (128, 320)
allow_extended_duration
Premium
Enable downloads for videos exceeding base duration limits
max_duration
Premium
Maximum video duration in minutes (e.g., 240 for 4 hours). Use with allow_extended_duration=1 to cap the maximum duration and prevent abuse. If not provided, defaults to unlimited.
no_merge
Optional
Control stream merging behavior. If set to 1, audio and video streams will not be merged together and users will get a zip file containing all files. Default is 0.
audio_language
Optional
Specify the language code for the audio track (YouTube only). If the requested language is not available, the default audio track will be used. Supported codes: af, az, id, ms, bs, ca, cs, da, de, et, en-IN, en-GB, en, es, es-419, es-US, eu, fil, fr, fr-CA, gl, hr, zu, is, it, sw, lv, lt, hu, nl, no, uz, pl, pt-PT, pt, ro, sq, sk, sl, sr-Latn, fi, sv, vi, tr, be, bg, ky, kk, mk, mn, ru, sr, uk, el, hy, iw, ur, ar, fa, ne, mr, hi, as, bn, pa, gu, or, ta, te, kn, ml, si, th, lo, my, ka, am, km, zh-CN, zh-TW, zh-HK, ja, ko
start_time
Optional
Start time in seconds for video segment download.
end_time
Optional
End time in seconds for video segment download.
Request Examples
curl --location 'https://p.savenow.to/ajax/download.php?format=1080&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DK1Pu75yJUOE&apikey=YOUR_API_KEY&add_info=1&audio_quality=128&allow_extended_duration=1&max_duration=240'
Response Example
{
"success": true,
"id": "abc123xyz789",
"content": "PGRpdiBjbGFzcz0iZG93bmxvYWQtY29udGVudCI+Li4uPC9kaXY+",
"info": {
"image": "https://i.ytimg.com/vi/K1Pu75yJUOE/maxresdefault.jpg",
"title": "Amazing Video Title - 4K Quality"
},
"extended_duration": {
"multiplier": 3,
"original_price": 0.00025,
"final_price": 0.00075
}
}
Format Options & Pricing
Audio Formats
Video Formats
Base Duration Limits Explained
Each format has a base duration limit included in the standard price. Videos exceeding these limits require the Extended Duration feature with tiered pricing.
Audio Language Examples
The audio_language parameter allows you to download YouTube videos with audio tracks in specific languages (if available).
Download MP3 with Spanish audio:
curl --location 'https://p.savenow.to/ajax/download.php?format=1&url=https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3Dxxx&audio_language=es&apikey=YOUR_API_KEY'
Download 720p video with French audio:
curl --location 'https://p.savenow.to/ajax/download.php?format=7&url=https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3Dxxx&audio_language=fr&apikey=YOUR_API_KEY'
Download with German audio:
curl --location 'https://p.savenow.to/ajax/download.php?format=1&url=https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3Dxxx&audio_language=de&apikey=YOUR_API_KEY'
Important Notes:
- This parameter only works for YouTube videos
- If the requested language audio track is not available, the download will automatically use the default audio track
- The language code should match YouTube's language codes (use base language codes like 'en', 'es', 'fr')
- The feature works for both audio-only downloads (MP3, M4A, etc.) and video downloads
- No additional cost for using this parameter
Supported Language Codes:
Subtitles & Transcripts Endpoint
/ajax/subtitles
Generate subtitle or transcript files for a video, then poll the returned progress_url until the Progress endpoint returns a final download_url.
Query Parameters
url
Required
The URL-encoded video URL to generate subtitles or transcripts for.
api
Required
Your API key for subtitle requests.
lang
Optional
Subtitle language code, such as en, es, or fr.
format
Optional
Output format for the subtitle file. Supported values: vtt and srt.
Request Example
curl --location 'https://p.savenow.to/ajax/subtitles?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DK1Pu75yJUOE&api=YOUR_API_KEY&lang=en&format=vtt'
Accepted Response
{
"success": true,
"id": "subtitle-job-123",
"title": "Amazing Video Title",
"progress_url": "https://p.savenow.to/ajax/progress.php?id=subtitle-job-123",
"content": "PGRpdiBjbGFzcz0ic3VidGl0bGUtY29udGVudCI+Li4uPC9kaXY+"
}
Polling flow
Save the returned id or call the returned progress_url. When progress reaches 1000, use download_url from the Progress endpoint to fetch the subtitle file.
Advanced Pricing Calculator
Calculate your costs with Extended Duration Downloads support
Audio Formats 120 min base
Video Formats
Extended Duration Downloads
Premium feature for videos longer than base duration
Price Breakdown
Minimum charge: $1.00
Extended Duration
Premium pricing for longer videos
Tiered Pricing
Transparent duration-based costs
Volume Discounts
Better rates at higher volumes
No Hidden Fees
What you see is what you pay
About Extended Duration Downloads
Base Duration Limits
Pricing Structure
Note: Extended Duration Downloads is a premium feature available only for YouTube videos. Enable the feature above to see pricing for videos longer than the base duration limits.
Response Documentation
Response Properties:
| Parameters | Description |
|---|---|
success
|
A boolean value indicating the success of the download operation. If true, the download was successful; if false, there was an error.
|
id
|
A unique identifier for the download request. This ID can be used to query the progress of the download using the progress endpoint. |
content
|
The Base64 encoded HTML content for the UI representation of the download. This content can be rendered to display the progress and download options to the user. |
info
|
An object containing additional information about the downloaded content. |
extended_duration
|
An object containing extended duration pricing details. Only present when allow_extended_duration=1 and the video exceeds base duration limits.
|
Info Object Properties:
| Parameters | Description |
|---|---|
image
|
The URL of an image associated with the downloaded content. This image could be used as a thumbnail or preview for the downloaded content. |
title
|
A title or description of the downloaded content. This could provide more context about what the content is, helping users identify their downloads. |
Extended Duration Object Properties:
| Parameters | Description |
|---|---|
multiplier
|
The price multiplier applied based on video duration (e.g., 3 for 3x pricing). |
original_price
|
The base price for the selected format before multiplier is applied. |
final_price
|
The final price after applying the duration multiplier. |
Status Codes:
| Parameters | Description |
|---|---|
200 OK
|
Successful response. |
400 Bad Request
|
Missing or invalid parameters. |
500 Internal Service Error
|
Server error. |
Complete Response Example
{
"success": true,
"id": "abc123xyz789",
"content": "PGRpdiBjbGFzcz0iZG93bmxvYWQtY29udGVudCI+Li4uPC9kaXY+",
"info": {
"image": "https://i.ytimg.com/vi/K1Pu75yJUOE/maxresdefault.jpg",
"title": "Amazing Video Title - 4K Quality"
},
"extended_duration": {
"multiplier": 3,
"original_price": 0.00050,
"final_price": 0.00150
}
}
Integration Tips
-
Always check the
successproperty before processing other fields -
Use the
idto track download progress via the progress endpoint -
The
contentfield contains Base64 encoded HTML - decode before displaying -
extended_durationobject only appears when premium pricing applies -
Use the
download_urlsarray as backup options if the primary URL is blocked in your region
Progress Endpoint
/ajax/progress
Parameters
id
Required
The unique download ID from the initial request
Response Properties
progress: 0-1000 (1000 = 100%)success: 1 for success, 0 for failuredownload_url: Final download link (when ready)download_urls: Array of alternative download URLs (when ready)text: Human-readable statusExample Request
curl --location 'https://p.savenow.to/ajax/progress?id=YOUR_JOB_ID'
Example Response
{
"success": 1,
"progress": 1000,
"download_url": "https://cdn.example.com/randomcharhere",
"text": "Finished",
"message": "Random message here",
"alternative_download_urls": {
{
"type": "nip.io",
"url": "https://cdn1.example.com/awepkfjslkdjei",
"has_ssl": true
},
{
"type": "sslip.io",
"url": "https://cdn2.example.com/llske93lskd",
"has_ssl": false
},
{
"type": "traefik.me",
"url": "https://backup.example.com/kdwlkejlfllsl",
"has_ssl": true
}
}
}
Regional Availability Feature
The alternative_download_urls array provides multiple download links to ensure accessibility across all regions.
If the primary download_url is blocked in your user's region,
try the alternative URLs from the array sequentially until you find one that works.
Extended Duration Downloads
PremiumDownload YouTube videos longer than standard base limits with transparent tiered pricing based on video length.
How Pricing Works
Pricing Example (4K Format)
Base duration for 4K/8K formats: 15 minutes
Duration Cap with max_duration
Use the max_duration parameter to set a maximum video duration limit (in minutes) and prevent unexpected costs.
Example Usage:
allow_extended_duration=1&max_duration=240
This allows extended duration downloads but caps at 4 hours (240 minutes). Videos longer than 240 minutes will be rejected.
Important Notes
- • Currently supports YouTube videos only
- • Without
max_duration, pricing scales automatically with no hard limit - • Use
max_durationto prevent abuse and cap costs - • Feature activates only when
allow_extended_duration=1 - • Insufficient balance will prevent download initiation
YouTube-Specific Features
Audio Language Selection
Download videos with specific audio languages when available. Perfect for educational content and international media.
audio_language=es
Spanish audio example
Time Range Downloads
Download specific segments using start_time and end_time parameters.
start_time=60&end_time=180
Download from 1 minute to 3 minutes
Stream Control
Control how audio and video streams are merged using the no_merge parameter.
no_merge=1
Separate files in ZIP format
Supported Languages
Status Codes & Error Handling
HTTP Status Codes
Best Practices
Poll Progress Wisely
Check progress every 2-3 seconds, not more frequently
Handle Timeouts
Implement proper timeout handling for long downloads
Use Alternative URLs
Implement fallback logic using the download_urls array for regional availability
Validate URLs
Ensure URLs are properly encoded before sending
Card API
FreeComplete download interface with progress tracking, format selection, and thumbnail preview. Perfect for embedding a full-featured downloader into your website with monetization capabilities.
Real-time Progress Tracking
Visual progress bar with percentage completion and status updates
Multiple Format Support
Audio (MP3, M4A, FLAC) and video formats (360p to 8K)
Ad Revenue Integration
25% of downloads redirect to your ad URL for monetization
Auto-Resize & Responsive
Automatically adjusts height and works on all devices
Best for:
Websites wanting a complete download solution with built-in monetization. Perfect for content creators, educational platforms, and media websites.
URL Parameters
| Parameter | Description | Required |
|---|---|---|
url
|
The YouTube URL you want to download | Yes |
adUrl
|
Your AD URL - 25% of downloads redirect here for monetization | Optional |
css
|
Link to your custom CSS file to style the download interface | Optional |
Implementation Example
<!-- Basic Card API Integration -->
<iframe
id="cardApiIframe"
scrolling="no"
width="100%"
height="100%"
allowtransparency="true"
style="border: none; border-radius: 12px;"
src="https://p.savenow.to/api/card2/?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ&adUrl=https://youradurl.com">
</iframe>
<!-- Put the Library in your <head> tag -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.9/iframeResizer.min.js"></script>
<!-- Put the resizer code after the <iframe> tag -->
<script>
iFrameResize({
log: false,
checkOrigin: false // Required for cross-origin iframes
}, "#cardApiIframe")
</script>
<!-- Custom CSS Styling (Optional) -->
<iframe
id="styledCardApi"
scrolling="no"
width="100%"
height="100%"
allowtransparency="true"
style="border: none; border-radius: 12px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);"
src="https://p.savenow.to/api/card2/?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ&adUrl=https://youradurl.com&css=https://yoursite.com/custom-style.css">
</iframe>
Live Demo
This shows how the Card API interface appears to users
Widget API
FreeComplete widget with URL input field that allows users to paste any YouTube URL. Perfect for creating standalone downloader tools with built-in monetization capabilities.
URL Input Interface
Built-in input field where users can paste YouTube URLs
Auto-Detection
Automatically detects video information and available formats
Auto-Resize
Automatically adjusts to content and responsive design
Revenue Generation
25% of downloads redirect to your ad URL for monetization
Best for:
Websites wanting a complete downloader tool where users input their own URLs. Perfect for standalone downloader sites, tool websites, and apps.
URL Parameters
| Parameter | Description | Required |
|---|---|---|
url
|
The YouTube URL you want to download | Yes |
adUrl
|
Your AD URL - 25% of downloads redirect here for monetization | Optional |
css
|
Link to your custom CSS file to style the widget interface | Optional |
Implementation Example
<!-- Basic Widget API Integration -->
<iframe
id="widgetApiIframe"
width="100%"
height="100%"
allowtransparency="true"
scrolling="no"
style="border: none; border-radius: 12px;"
src="https://p.savenow.to/api/widget?adUrl=https://youradurl.com">
</iframe>
<!-- Put the Library in your <head> tag -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.9/iframeResizer.min.js"></script>
<!-- Put the resizer code after the <iframe> tag -->
<script>
iFrameResize({
log: false,
checkOrigin: false // Required for cross-origin iframes
}, "#widgetApiIframe")
</script>
<!-- Custom Styled Widget -->
<div class="widget-container" style="max-width: 600px; margin: 0 auto;">
<iframe
id="customWidgetApi"
width="100%"
height="100%"
allowtransparency="true"
scrolling="no"
style="border: none; border-radius: 15px; box-shadow: 0 8px 25px rgba(0,0,0,0.15);"
src="https://p.savenow.to/api/widget?adUrl=https://youradurl.com&css=https://yoursite.com/widget-style.css">
</iframe>
</div>
<script>
iFrameResize({
log: false,
checkOrigin: false, // Required for cross-origin iframes
heightCalculationMethod: 'taggedElement'
}, "#customWidgetApi")
</script>
Widget Preview
This shows how the Widget API interface appears to users
Templates
FreeExplore our free templates designed specifically for YouTube downloader websites! Get started easily with different frameworks like React, Laravel, Vue, and JavaScript. These templates make it simple to build a fully functional downloader, providing a sleek and efficient way for users to save YouTube content in various formats. Our templates have got you covered—completely free and ready to customize!