Algrow API
Programmatic access to Algrow's text-to-speech, AI media studio, and YouTube data tools. Generate TTS audio, create AI images and videos, scrape YouTube channels, and search terminated channel data — all via a simple REST API.
Quickstart
Get your first audio file in under 60 seconds.
Get your API key
Go to Settings → API Keys in your Algrow dashboard and generate a key.
Submit a job
Send a POST to /api/generate-simple with your script and voice ID.
Get your audio
Poll /api/job-status/:id until complete. The response includes a permanent audio URL.
API Reference
AUTH Authentication GET /api/healthHow It Works
The API is fully asynchronous. You submit a generation request and receive a job ID immediately. Audio is generated in the background — poll the status endpoint until it's ready.
multipart/form-data encoding. Send parameters as form fields, not JSON.
audio.algrow.online and will not expire. You can safely store and reference these URLs long-term.
Authentication
All endpoints (except /api/health) require a valid API key. Include it using one of these methods:
Authorization Header (Recommended)
Authorization: Bearer algrow_...
Query Parameter
?api_key=algrow_...
Form Data Field
api_key=algrow_...
Sent in the multipart form body
Text-to-Speech
Generate high-quality TTS audio programmatically. Submit a script, choose a voice, and receive a permanent hosted audio URL. Uses character-based credits (see Credits & Billing).
Browse and search available ElevenLabs voices. Returns voice IDs you can use with provider=elevenlabs. For Stealth voices, use /api/voices/stealth instead.
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | Required | Bearer token: Bearer YOUR_API_KEY |
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| search | string | Optional | — | Search by voice name or labels |
| gender | string | Optional | — | Filter by gender: male, female, or neutral |
| age | string | Optional | — | Filter by age: young, middle_aged, or old |
| language | string | Optional | — | Language code (e.g. en, es, fr) |
| accent | string | Optional | — | Filter by accent (e.g. american, british) |
| sort | string | Optional | trending | Sort by: trending, created_date, usage_character_count_1y |
| page_size | integer | Optional | 30 | Results per page (max 100) |
| page | integer | Optional | 0 | Page number (0-indexed) |
Create a text-to-speech generation job. Returns a job_id immediately. The audio is generated asynchronously — poll /api/job-status/:job_id to check progress and retrieve the audio URL when complete.
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | Required | Bearer token: Bearer YOUR_API_KEY |
| Content-Type | string | Auto | Set automatically by curl -F. If manual: multipart/form-data |
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| script | string | Required | — | Text to convert to speech. Maximum 200,000 characters. |
| voice_id | string | Required | — | ElevenLabs voice ID. Example: 21m00Tcm4TlvDq8ikWAM (Rachel) |
| provider | string | Optional | elevenlabs | TTS engine. Values: elevenlabs, stealth |
| model_id | string | Optional | eleven_multilingual_v2 | Model to use. Also available: eleven_v3, eleven_turbo_v2_5, eleven_flash_v2_5, eleven_turbo_v2, eleven_flash_v2 |
| stability | float | Optional | 0.5 | Voice consistency. Higher = more stable, lower = more expressive. Range: 0.0 – 1.0 |
| similarity_boost | float | Optional | 0.5 | How closely to match the original voice. Range: 0.0 – 1.0 |
| style | float | Optional | 0.0 | Speaking style exaggeration. Higher values amplify the voice's style. Range: 0.0 – 1.0 |
| speed | float | Optional | 1.0 | Playback speed multiplier. Range: 0.7 – 1.2 |
| voice_name | string | Optional | voice_id | Human-readable label for this voice (for your reference only) |
| custom_title | string | Optional | — | Custom filename for the output MP3 (without extension) |
| generate_srt | string | Optional | false | Set to true to generate an SRT subtitle file (ElevenLabs only) |
| temperature | float | Optional | 1.1 | Voice expressiveness (Stealth only). Higher = more expressive. |
| speaking_rate | float | Optional | 1.0 | Speaking speed multiplier (Stealth only). |
When
provider=stealth: only temperature and speaking_rate are used. Parameters stability, similarity_boost, style, speed, and model_id are ignored.When
provider=elevenlabs (default): only stability, similarity_boost, style, speed, and model_id are used. Parameters temperature and speaking_rate are ignored.
stealth-tts-1.5-max — the most expressive model. Max input: 200,000 characters (auto-chunked at ~1,900 char boundaries). Output: MP3, uploaded to CDN.
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the request was accepted |
| job_id | string | Unique job identifier. Use this to poll for status. |
| status | string | Current job status: pending |
| status_detail_message | string | Human-readable status message |
| message | string | Informational message |
| payload | object | Echo of the submitted parameters (text, voice_id, settings, etc.) |
Retrieve the current status and result of a generation job. Poll this endpoint every 2–3 seconds until status is completed or failed. Typical generation time is 3–15 seconds depending on script length.
| Name | Type | Required | Description |
|---|---|---|---|
| job_id | string | Required | The job_id returned from POST /api/generate-simple |
| Field | Type | Description |
|---|---|---|
| success | boolean | Always true if the job was found |
| job_id | string | The job identifier |
| status | string | One of: pending, processing, completed, failed |
| status_detail_message | string | Human-readable status: "Processing", "Completed", or "Failed" |
| created_at | float | Unix timestamp when the job was created |
| completed_at | float | Unix timestamp when the job finished (only present when done) |
| audio_url | string | Permanent URL to the MP3 file. After generation, audio is uploaded to Cloudflare R2 and served via our CDN at audio.algrow.online — this URL will not expire. (Only when status=completed) |
| transcript_url | string | Permanent URL to the SRT subtitle file. Only present when generate_srt=true was set and status=completed. |
| error | string | Error description (only when status=failed) |
| error_code | string | Machine-readable error code, e.g. TERMS_OF_SERVICE_VIOLATION (only when status=failed, if available) |
| error_message | string | Human-readable error message from the provider (only when status=failed, if available) |
pending → processing → completed or failed. Typical completion time is 3–15 seconds.
List your generation jobs, sorted by creation time (newest first). Returns only jobs belonging to the authenticated user. Useful for debugging and monitoring your recent generations.
Check API health and view your current job counts. No authentication required. Use this to verify the API is online and check how many concurrent slots you have available.
Voice Management
Manage your Stealth TTS voices — list available voices, clone custom voices from audio samples, and delete cloned voices.
List available Stealth voices. Returns built-in voices plus any voices you have cloned.
| Field | Type | Description |
|---|---|---|
| voice_id | string | Use this as the voice_id parameter in /api/generate-simple |
| name | string | Display name of the voice |
| language | string | Language code (e.g. en, es, de) |
| is_cloned | boolean | Whether this voice was cloned by you |
Clone a custom Stealth voice from an audio sample. Upload up to 30 seconds of clear speech audio. The cloned voice can then be used with provider=stealth in the generate endpoint.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| displayName | string | Required | — | Name for the cloned voice |
| audioFile | file | Required | — | Audio sample (MP3, WAV, M4A, OGG, WEBM). Max 15MB, max 30 seconds. |
| langCode | string | Optional | EN_US | Language of the audio. Values: EN_US, ES_ES, FR_FR, DE_DE, PT_BR, IT_IT, JA_JP, KO_KR, ZH_CN, RU_RU, AR_SA, PL_PL, NL_NL, HI_IN, HE_IL |
| transcription | string | Optional | — | Text transcription of the audio sample (improves clone quality) |
| description | string | Optional | — | Description of the voice |
| tags | string | Optional | — | Comma-separated tags (e.g. narrator,deep) |
| removeBackgroundNoise | string | Optional | false | Set to true to remove background noise from the sample |
Delete a cloned Stealth voice. Only voices you own can be deleted. This action is permanent.
| Name | Type | Required | Description |
|---|---|---|---|
| voice_id | string | Required | The voice_id of the cloned voice to delete |
Media Generation
Generate images, videos, and remove captions/watermarks from videos. All media endpoints use studio credits, require a Professional or Ultimate plan, and follow the same async job pattern — submit a request, receive a job_id, then poll /api/job-status/:job_id for results.
Remove captions and watermarks from a video. Accepts a publicly accessible video URL, processes it via AI, and returns a cleaned video uploaded to CDN. Credits are deducted upfront and refunded automatically if processing fails.
| Name | Type | Required | Description |
|---|---|---|---|
| video_url | string | Required | Publicly accessible URL of the video to process |
Remove the OpenAI watermark from a Sora 2 video. Accepts a Sora video URL (sora.chatgpt.com/p/s_...), processes it via AI, and returns a cleaned video uploaded to CDN. Credits are deducted upfront and refunded automatically if processing fails.
| Name | Type | Required | Description |
|---|---|---|---|
| video_url | string | Required | Sora 2 video URL. Must be from sora.chatgpt.com (e.g. https://sora.chatgpt.com/p/s_abc123...) |
Generate AI images from a text prompt. Supports multiple models with optional reference images. Returns one or more image URLs uploaded to CDN. Credits are deducted upfront and refunded automatically if generation fails.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Required | — | Text description of the image to generate |
| model | string | Optional | nano-banana-2 | Image model. See model table below. |
| aspect_ratio | string | Optional | 16:9 | Output aspect ratio (e.g. 16:9, 9:16, 1:1, 4:3) |
| reference_image_url | string | Optional | — | URL of a reference image for style guidance. Required for seedream-4.5-edit. |
| Model | Credits | Notes |
|---|---|---|
nano-banana-2 | 2 | Fast general-purpose generation (default) |
nano-banana-pro | 3 | Higher quality, supports up to 8 reference images |
seedream-4.5-edit | 2 | Image editing — requires reference_image_url |
seedream-5.0-lite | 2 | Lightweight generation, optional reference |
Generate AI videos from a text prompt. Supports multiple models including Sora, Kling, Grok, and Veo. Returns a video URL uploaded to CDN. Credits are deducted upfront and refunded automatically if generation fails.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Required | — | Text description of the video to generate |
| model | string | Optional | sora-2 | Video model. See model table below. |
| input_reference_url | string | Conditional | — | Reference image URL. Required for kling-2.6, grok-image-to-video, and veo3-fast. |
| seconds | string | Optional | 4 | Video duration in seconds (Sora only). Values: 4, 8, 12 |
| size | string | Optional | 720x1280 | Output resolution (Sora only). e.g. 720x1280, 1280x720 |
| duration | string | Optional | 5 | Video duration (Kling only). Values: 5, 10 |
| sound | boolean | Optional | false | Enable audio generation (Kling only). Doubles the credit cost. |
| aspect_ratio | string | Optional | 9:16 | Output aspect ratio (Veo only). e.g. 9:16, 16:9 |
| Model | Credits | Reference Image | Notes |
|---|---|---|---|
sora-2 | 13 / 18 / 25 | Optional | OpenAI Sora. Cost varies by duration: 4s / 8s / 12s |
kling-2.6 | 8 – 30 | Required | Image-to-video. Cost varies by duration and sound. |
grok-image-to-video | 3 | Required | Grok image-to-video generation |
veo3-fast | 8 | Required | Google Veo 3.1 Fast video generation |
/api/job-status/:job_id every 5 seconds for updates.
Search terminated/deleted YouTube channels. Returns channel metadata, growth metrics at time of termination, and up to 3 top videos per channel. Supports keyword matching and advanced filters. Available on Professional and Ultimate plans only.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | Optional | — | Search query. Matches against channel titles and video titles. Comma-separated for multiple keywords. |
| languages | string | Optional | — | Filter by language. Comma-separated (e.g. English,Spanish) |
| sort | string | Optional | date_desc | Sort field and direction. Format: {field}_{asc|desc}. Fields: subs, views, videos, age, views_24h, subs_24h, views_48h, date, similarity (when using q) |
| page | integer | Optional | 1 | Page number (1-indexed) |
| per_page | integer | Optional | 20 | Results per page (max 50) |
| min_subs | integer | Optional | — | Minimum subscriber count |
| max_subs | integer | Optional | — | Maximum subscriber count |
| min_views | integer | Optional | — | Minimum total view count |
| max_views | integer | Optional | — | Maximum total view count |
| min_avg_views | integer | Optional | — | Minimum average views per video |
| max_avg_views | integer | Optional | — | Maximum average views per video |
| min_age | integer | Optional | — | Minimum channel age in days (from first upload) |
| max_age | integer | Optional | — | Maximum channel age in days |
| min_uploads | integer | Optional | — | Minimum number of videos |
| max_uploads | integer | Optional | — | Maximum number of videos |
| monetized | string | Optional | — | Filter by monetization status: yes or no |
| min_views_24h | integer | Optional | — | Minimum views gained in last 24h before termination |
| max_views_24h | integer | Optional | — | Maximum views gained in last 24h before termination |
| min_views_48h | integer | Optional | — | Minimum views gained in last 48h before termination |
| max_views_48h | integer | Optional | — | Maximum views gained in last 48h before termination |
| Field | Type | Description |
|---|---|---|
| channel_id | string | YouTube channel ID |
| channel_title | string | Channel name at time of termination |
| subscriber_count | integer | Subscriber count at termination |
| view_count | integer | Total channel views at termination |
| avg_views_per_video | integer | Average views per video |
| total_videos | integer | Number of videos on the channel |
| primary_language | string | Detected content language |
| monetized | boolean | Whether the channel was monetized |
| is_low_quality | boolean | Whether the channel was flagged as low quality |
| thumbnail_url | string | Channel profile picture URL |
| first_upload_date | string | Date of the channel's first upload (ISO 8601) |
| terminated_date | string | Date the channel was terminated (ISO 8601) |
| terminated_days_ago | integer | Days since the channel was terminated |
| view_increase_24h | integer|null | Views gained in last 24h before termination |
| sub_increase_24h | integer|null | Subscribers gained in last 24h before termination |
| view_increase_48h | integer|null | Views gained in last 48h before termination |
| sub_increase_48h | integer|null | Subscribers gained in last 48h before termination |
| similarity_score | integer|null | AI similarity score (0–100) when using q search |
| recent_videos | array | Top 3 videos by views with video_id, title, view_count, thumbnail_url, url |
Search for viral videos across Shorts and Longform channels. Filter by video views, channel size, growth metrics, upload recency, language, and more. Search supports keyword matching and similarity scoring.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| content_type | string | Optional | shorts | Content type: shorts or longform |
| search | string | Optional | — | Search query. Matches video titles and channel names with similarity scoring. |
| languages | string | Optional | English | Filter by language. Comma-separated (e.g. English,Spanish). Defaults to English if omitted. |
| sort_by | string | Optional | views | Sort by: views (most viewed), recent (newest fetched), upload_date (newest uploaded), similarity (most similar, auto-selected when searching) |
| page | integer | Optional | 1 | Page number (1-indexed) |
| per_page | integer | Optional | 20 | Results per page (max 50) |
| min_video_views | integer | Optional | — | Minimum video view count |
| max_video_views | integer | Optional | — | Maximum video view count |
| min_subs | integer | Optional | — | Minimum channel subscriber count |
| max_subs | integer | Optional | — | Maximum channel subscriber count |
| min_uploads | integer | Optional | — | Minimum channel video count |
| max_uploads | integer | Optional | — | Maximum channel video count |
| min_channel_age | integer | Optional | — | Minimum channel age in days |
| max_channel_age | integer | Optional | — | Maximum channel age in days |
| min_upload_date | integer | Optional | — | Newest allowed upload (days ago, 0 = today) |
| max_upload_date | integer | Optional | — | Oldest allowed upload (days ago, e.g. 365 = 1 year) |
| min_duration | integer | Optional | — | Minimum video duration in minutes (longform only) |
| max_duration | integer | Optional | — | Maximum video duration in minutes (longform only) |
| min_views_24h | integer | Optional | — | Minimum channel views gained in last 24h (shorts only) |
| max_views_24h | integer | Optional | — | Maximum channel views gained in last 24h (shorts only) |
| min_views_48h | integer | Optional | — | Minimum channel views gained in last 48h (shorts only) |
| max_views_48h | integer | Optional | — | Maximum channel views gained in last 48h (shorts only) |
| Field | Type | Description |
|---|---|---|
| video_id | string | YouTube video ID |
| title | string | Video title |
| channel_name | string | Channel name |
| channel_id | string | YouTube channel ID |
| view_count | integer | Total video views |
| thumbnail_url | string | Video thumbnail URL |
| upload_date | string|null | Upload date (ISO 8601) |
| url | string | Full YouTube URL |
| subscriber_count | integer | Channel subscriber count |
| duration | integer|null | Video duration in seconds |
| view_increase_24h | integer|null | Channel views gained in last 24h (shorts with realtime filters only) |
| view_increase_48h | integer|null | Channel views gained in last 48h (shorts with realtime filters only) |
| similarity_score | integer|null | Similarity score (0–100) when using search. Higher = more similar. |
Scrape video data from a YouTube channel or single video. Returns video metadata (title, views, likes, duration, thumbnails), with optional transcripts and comments. Async job — submit a request, then poll for results.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | Required | — | YouTube channel URL or video URL. Auto-detects single video vs. channel mode. |
| video_type | string | Optional | both | Type of videos to scrape: shorts, videos, or both |
| sort | string | Optional | recent | Sort order: recent or popular |
| max_videos | integer | Optional | 20 | Maximum videos to scrape (1–100) |
| include_transcripts | boolean | Optional | false | Include full video transcripts in the response |
| include_comments | boolean | Optional | false | Include top comments for each video |
Poll for the result of a YouTube scraping job. Returns pending or processing while running, and the full video data when completed.
| Field | Type | Description |
|---|---|---|
| video_id | string | YouTube video ID |
| title | string | Video title |
| url | string | Full YouTube URL |
| thumbnail | string | Thumbnail image URL (highest resolution available) |
| view_count | integer | Total views |
| like_count | integer | Total likes |
| comment_count | integer | Total comments |
| duration_seconds | integer | Video length in seconds |
| duration_human | string | Human-readable duration (e.g. “3m 32s”) |
| publish_date | string | Publish date (ISO 8601) |
| channel | string | Channel name |
| channel_id | string | YouTube channel ID |
| transcript | string|null | Full transcript (only if include_transcripts: true) |
| comments | array|null | Top comments (only if include_comments: true) |
Rate Limits
The API enforces the following limits to ensure fair usage and service stability.
429 response — wait for some jobs to complete and retry.
Credits & Billing
Algrow uses two credit systems: TTS credits (character-based) for voice generation, and studio credits for media generation and video processing. Credits are checked before each job and only deducted after successful completion — you are never charged for failed jobs.
TTS Credits
| Package | Characters | Price | Per 1K chars |
|---|---|---|---|
| Starter | 1,000,000 | $6.00 | $0.006 |
| Creator | 5,000,000 | $25.00 | $0.005 |
| Studio | 10,000,000 | $45.00 | $0.0045 |
Studio Credits
| Feature | Credits | Notes |
|---|---|---|
| Image Generation | 2–3 | Varies by model (see available models) |
| Video Generation | 3–30 | Varies by model and duration (see available models) |
| Caption Removal | 12 per minute | 0.2 per second, rounded up |
| Sora Watermark Removal | 2 | Per video |
402 Payment Required with the exact number of credits available and needed. Purchase more credits from your Algrow dashboard.
Error Handling
All errors follow a consistent format. Check success: false and read the error field for details.
| HTTP Code | Meaning | When it happens | What to do |
|---|---|---|---|
| 400 | Bad Request | Missing or invalid parameters (e.g. missing script, invalid url, max_videos out of range, invalid job_id) |
Check your request parameters against the endpoint docs |
| 401 | Unauthorized | API key is missing, invalid, or deactivated | Verify your API key is correct and active |
| 402 | Payment Required | Not enough TTS or studio credits for this request | Purchase more credits from your dashboard |
| 403 | Forbidden | Feature requires a higher plan (e.g. YouTube Scraper and Terminated Channels require Professional or Ultimate) | Upgrade your plan in Settings |
| 404 | Not Found | Resource does not exist (e.g. job_id not found, voice not found) |
Verify the ID is correct and belongs to your account |
| 429 | Too Many Requests | You have 5 active jobs already (per-user limit) | Wait for some jobs to complete before submitting new ones |
| 500 | Server Error | Unexpected internal error | Retry the request. If persistent, contact support. |
Code Examples
Complete, copy-paste examples with error handling for every API category.
Algrow
Shorts Channels