REST API for image, video & PDF generation
Generate images, video, GIF, PDF and HTML5 creatives programmatically with the Abyssale REST API. One integration, on-brand output, production-ready visuals on demand.
14 day free trial - no credit card required
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
{
"template_format_names": ["instagram-story", "facebook-post"],
"elements": {
"title-1": {
"payload": "A New Kind",
"color": "#000000",
"font_size": 97,
"font_weight": 300,
"alignment": "top left",
"auto_resize": true,
"min_font_size": 79
},
"image-1": {
"image_url": "https://production-banners.s3-eu-west-1.amazonaws.com/templates/v2/e0d292f2-ec21-11e9/v2_3a64d1f9.png",
"fitting_type": "fill",
"alignment": "middle center",
"hidden": false
}
}
}Developer experience,
built for production
Skip the manual design work. The Abyssale REST API generates production-ready visuals programmatically from your templates and data — scale your content creation with a few lines of code.
One API for all
your visual needs
From social posts to full campaigns, generate any visual asset programmatically — from a product feed, a catalog, or your own app.
Ad Network Solutions
Content Platforms
eCommerce Automation
SaaS Integration
RESTful endpoints,
endless creativity
As easy
as API
Simple Endpoints, Powerful Results
Webhook Support
Status Polling
Included CDN

Production at Scale
Developer API
Visual Generation API
A simple REST API to generate banners, social ads, PDFs, HTML5, GIF and MP4 programmatically — from any stack, at any scale.
Simple Endpoints, Powerful Results
One request, done
Send a template ID and your data — get production-ready visuals in seconds. Sync or async, webhooks supported. OpenAPI spec included.
Official SDKs: @abyssale/sdk for Node.js and TypeScript, abyssale for Python — both typed from the OpenAPI spec, with sync and async clients.
// npm install @abyssale/sdk
// export ABYSSALE_API_KEY="{YOUR-API-KEY}"
import abyssale from '@abyssale/sdk';
const { data, error } = await abyssale.generateImage('YOUR_DESIGN_ID', {
template_format_name: 'facebook-feed',
elements: {
text_title: { payload: 'Summer sale — 40% off' },
},
});
if (error) console.error(error.id, error.message);
else console.log(data.file.cdn_url);curl -X POST \
https://api.abyssale.com/banner-builder/YOUR_DESIGN_ID/generate \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_format_name": "facebook-feed",
"elements": {
"text_title": { "payload": "Summer sale — 40% off" }
}
}'# pip install abyssale
# export ABYSSALE_API_KEY="{YOUR-API-KEY}"
from abyssale import Abyssale
with Abyssale() as client:
banner = client.generate_image("YOUR_DESIGN_ID", {
"template_format_name": "facebook-feed",
"elements": {
"text_title": {"payload": "Summer sale — 40% off"},
},
})
print(banner.file.cdn_url)Start building your
own custom workflow!
Our API gives you complete control.
Developer hub
API reference
Platform comparison
Dynamic image URLs
API questions, answered
What are the API rate limits?
Two limits apply in sequence and both answer 429 — the id in the body tells you which. A global ceiling of 10 requests per second covers every endpoint (rate_limit_exceeded). On top, each endpoint sits in a tier with a per-minute and a per-hour budget, both enforced: write 60/min and 1,200/hour, read 120/min and 3,000/hour, validation 120/min and 2,400/hour, polling 600/min and 18,000/hour (request_rate_limited). In practice you meet the endpoint budget first. Every response from a budgeted endpoint carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a 429 also carries Retry-After in seconds. A missing header means no information, not unlimited budget — and retrying into a 429 still spends your hourly budget, so one refusal becomes two. Full rate limit reference
Is rendering synchronous or asynchronous?
Single images return synchronously. Multi-format renders, MP4 video, animated GIF and multi-page print PDF run as queued background jobs: POST /async/banner-builder/{designId}/generate returns a generation_request_id, then your webhook fires when the assets are ready. Polling is the fallback — honour next_check_after_ms and concurrent jobs stay inside the limit. Both SDKs wrap this as waitForGenerationRequest and wait_for_generation_request with exponential backoff. Multi-format jobs can partially succeed: the result carries a per-format errors array alongside the finished assets, so check it rather than assuming all formats rendered. Asynchronous generation guide
How are credits deducted — per request or per asset?
Per rendered format, not per request. One design generated in six formats costs six times a single render, so a multi-format call is priced by what it produces. Static outputs cost 1 credit each; animated outputs cost 1 credit per second, so a 5-second GIF is 5 credits. Reads, listings, imports and dry runs cost nothing. AI-layer features draw a separate AI-credit balance, so a request using background removal spends both balances at once. How credits are counted
How should my application handle API errors and retries?
Branch on error.id, never on the message text. request_rate_limited means you were too fast for that endpoint's tier — wait Retry-After seconds. feature_not_in_plan means plan gating rather than a bad request, so retrying never helps. The trap worth coding for: rate_limit_exceeded means either the global 10 requests-per-second ceiling or an empty credit balance. No amount of backoff recovers from an empty balance — stop the queue, top up, then resume, because each retry also spends your hourly budget. Both SDKs auto-retry with backoff and expose max_retries and max_retry_wait if you want to control or disable it. Error reference
How do I authenticate, and how do I verify webhook deliveries?
Requests carry a single x-api-key header — no OAuth flow and no token refresh. Webhook deliveries are signed with a separate per-workspace signing secret, fetched through the API and independently rotatable or revocable. It proves the delivery came from Abyssale and grants no account access, so it cannot spend credits if leaked. Verify the signature before trusting a payload; both SDKs ship a helper for it (verifyWebhookSignature and verify_webhook_signature). Webhook signature verification
Which languages have official SDKs?
Two official clients: @abyssale/sdk on npm for Node.js and TypeScript, and abyssale on PyPI for Python. Both are generated from the OpenAPI spec, ship synchronous and asynchronous clients with identical method names and return types, and include auto-retry plus webhook signature verification. Any other language calls the REST endpoints directly. The API is versioned by release date and keeps one version live at a time, so there is only ever one pairing to track. An MCP server for LLM-driven and agent workflows is available at mcp.abyssale.com. SDK reference
Can I test the API during the free trial, and which plans include it?
Yes — the API is available during the 14-day free trial, which grants 30 generation credits and 100 AI credits for the whole trial period, with no credit card required. After the trial, API access starts at the Pro plan. Output formats are gated separately from API access: animated formats such as GIF and MP4 need Pro, while HTML5 banner ads and print-ready CMYK PDF need Suite. Asking for a format your plan does not include returns feature_not_in_plan rather than failing silently. Compare plans
Have more specific questions?
Build better with our API guides
Deep dive into visual generation at scale. Explore tutorials on template manipulation, batch processing, webhooks integration, and performance optimization.
.webp)

Image Generation API for Automated Creative Production (2026 Guide)
