MigrateAbyssale

AbyssaleOrshot
Migrate from Abyssale to Orshot

Paste your Abyssale API key and pick designs. Every format lands as a page, so your ad sets keep generating from the Orshot API.

Built on Abyssale's public API. Checked September 26, 2026.

Why teams switch

Your formats, your automations, no seat math

Everything your Abyssale designs do today keeps working, and the parts billed per seat stop being a line item.

01Step 1

Copy an Abyssale API key

The importer reads your designs through Abyssale's own API. No files to save.

  1. 1In Abyssale, open Workspace settings, then API key.
  2. 2Copy a key, or click Create new API key. Give it about 30 seconds.
Abyssale, Workspace settings, API key.
Only designs inside a project show up. A workspace template at the root needs duplicating into a project first.

Done when you have a key copied, from an Admin account.

02Step 2

Import the designs

Connect once and every design in the workspace is listed with its preview.

  1. 1Orshot, New Template, Abyssale tab. Paste the key, Connect.
  2. 2Pick one design to open it in the Studio, or up to 10 to save them in one go (paid plans).
  3. 3The key is kept encrypted for the workspace, so next time you just press Connect.
Every design in the workspace, with a preview. Select one or several.
In the Studio: the same design, one page per Abyssale format.

Done when your design opens in the Studio with all its formats as pages.

03Step 3

Match formats and parameters

Formats turn into pages in their original order. Layer names stay as they are.

In AbyssaleIn Orshot
facebook-postPage 1, facebook-post
facebook-feedPage 2, facebook-feed
instagram-storyPage 3, instagram-story
layer revenue_sumparameter revenue_sum
layer Hero Imageparameter hero_image
The API tab lists every parameter, with a page prefix for each format.
Want a layer changeable that was fixed in Abyssale? Set it as a parameter in the Studio.

Done when you know the page number of each format your code asks for.

04Step 4

Swap the API call

Drop the wrapper objects, change the header, and pick formats with includePages.

Convert your request

Replace the example with your own Abyssale request body, or the code that sends it. Runs in your browser, nothing leaves the page.

POST https://api.abyssale.com/banner-builder/{design}/generate
POST https://api.orshot.com/v1/studio/render
{
  "templateId": <YOUR_ORSHOT_TEMPLATE_ID>,
  "modifications": {
    "title": "Performance summary",
    "title.color": "#111111",
    "revenue_sum": "4,120€",
    "logo": "https://example.com/logo.png",
    "button_0.opacity": 0
  },
  "response": {
    "type": "url",
    "format": "png",
    "includePages": [
      1
    ],
    "mode": "async"
  },
  "webhook_url": "https://yourapp.com/webhooks/abyssale"
}
  • Add your Orshot template ID. It is in the API tab after import.
  • Formats "facebook-post" are pages in the imported template, named after the format. Set includePages to their page numbers (shown in the Studio), or drop it to render every format.
  • callback_url kept as webhook_url. The request runs in async mode and Orshot POSTs the finished job to it (one job, not a NEW_BANNER_BATCH).
AbyssaleOrshot
x-api-key headerAuthorization: Bearer
design ID (UUID)templateId (number)
elements: { name: { payload } }{ name: "text" }
elements: { name: { image_url } }{ name: "https://…" }
elements: { name: { color } }{ "name.color": "#f00" }
elements: { name: { hidden: true } }{ "name.opacity": 0 }
template_format_nameresponse.includePages: [n]
async generate + callback_urlresponse.mode: "async" + webhook_url
img.abyssale.com/{id}?name=…Signed Dynamic URL, name=…

Side by side

The calls Abyssale teams send most, and what they become.

The call most integrations make: one design, one format, a few overrides.

Abyssale|POST api.abyssale.com/banner-builder/64238d01-d402-474b-8c2d-fbc957e9d290/generate
{
  "template_format_name": "facebook-feed",
  "elements": {
    "title": { "payload": "Autumn drop is live" },
    "hero": { "image_url": "https://example.com/coat.jpg" }
  }
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "title": "Autumn drop is live",
    "hero": "https://example.com/coat.jpg"
  },
  "response": {
    "type": "url",
    "format": "png",
    "includePages": [2]
  }
}

No wrapper objects: the value goes straight in. The format is a page of the imported template, so includePages picks it.

Your whole ad set, one request, no batch to wait for.

Abyssale|POST api.abyssale.com/async/banner-builder/64238d01-d402-474b-8c2d-fbc957e9d290/generate
{
  "template_format_names": [],
  "elements": {
    "title": { "payload": "Autumn drop is live" }
  },
  "callback_url": "https://yourapp.com/hooks/abyssale"
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "title": "Autumn drop is live"
  },
  "response": {
    "type": "url",
    "format": "png"
  }
}

Every page renders in the same synchronous call and data comes back as an array, one URL per format. Keep a webhook with response.mode async if you prefer.

Recolour, hide or resize a layer per render.

Abyssale|POST api.abyssale.com/banner-builder/64238d01-d402-474b-8c2d-fbc957e9d290/generate
{
  "elements": {
    "title": { "payload": "Sale", "color": "#E4002B", "font_size": 72 },
    "badge": { "hidden": true },
    "root": { "background_color": "#111111" }
  }
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": {
    "title": "Sale",
    "title.color": "#E4002B",
    "title.fontSize": 72,
    "badge.opacity": 0,
    "canvasBackgroundColor": "#111111"
  },
  "response": { "type": "url", "format": "png" }
}

Properties become dot keys on the parameter. hidden becomes opacity 0, and root.background_color becomes canvasBackgroundColor.

A flyer or certificate as a PDF from the same template.

Abyssale|POST api.abyssale.com/async/banner-builder/64238d01-d402-474b-8c2d-fbc957e9d290/generate
{
  "image_file_type": "pdf",
  "elements": {
    "name": { "payload": "Sarah Chen" }
  },
  "callback_url": "https://yourapp.com/hooks/abyssale"
}
Orshot|POST api.orshot.com/v1/studio/render
{
  "templateId": 12345,
  "modifications": { "name": "Sarah Chen" },
  "response": { "type": "url", "format": "pdf" },
  "pdfOptions": { "dpi": 300 }
}

Any template renders as PDF by changing the format, on every plan. Multi-page templates become one document.

A link that renders when it is opened, for emails and pages.

Abyssale
GET https://img.abyssale.com/{dynamicImageId}/facebook-feed
  ?title=Welcome%20back
  &logo.hidden=true
Orshot
GET https://api.orshot.com/v1/studio/dynamic-url/welcome.png
  ?templateId=12345
  &title=Welcome%20back
  &sign=YOUR_SIGNATURE

Same short form, name=value. Orshot links are signed, so nobody can change the query string and render on your credits.

Every option, including sizes and async mode, is in the render reference.

Done when a converted request returns your image with your data in it.

05Step 5

Move the automations

Pick where your renders come from. Each one points at the imported template with the same parameters.

  1. 1Make or n8n: Quick Connect, Copy as, then paste the blueprint or workflow.
  2. 2Zapier: the Orshot action Generate Image from Studio Template.
  3. 3Map the same fields, test once, then turn off the Abyssale step.
Copy as gives you a ready workflow with your key and parameters.

No third-party tool needed: Workflows connect a trigger, the template and a destination inside Orshot.

  1. 1Start from a sheet, a schedule or a webhook.
  2. 2Add the imported template and map each column to a parameter.
  3. 3Send the file to Dropbox, S3, Slack or a social account.
  1. 1Connect Claude, ChatGPT or Cursor under Agents & MCP.
  2. 2Ask for a render of the imported template in any format. It reads the parameters itself.
  3. 3Porting code? Hand it the migration prompt below.
Orshot for agents has setup steps per client.

Your img.abyssale.com links become Dynamic URLs: same name=value query, plus a signature.

Each highlighted key is a parameter you can change in the link.
Text parameters only; image swaps go through the API.

Teammates who used Abyssale's quick generation form get a Template Form: fields in, image out, no account needed.

Share the form by link or embed it.

Done when one automation generates from Orshot, with Abyssale still running as a fallback.

Free for up to 5 templates on any paid plan

  • We import your designs with every format and layer name
  • We rebuild the Make, n8n or Zapier steps that call them
  • You get one test render per format on your own data

More than 5 designs, or a workspace per client? Book a call and we plan it with you.

Where your automations run
Free for up to 5 templates on any paid plan. Bigger moves start with a call.

Let your agent update the code and workflows

Copy this prompt into Claude Code, Cursor, Codex or ChatGPT. It finds your Abyssale calls, rewrites them for Orshot and links every doc it needs.

migrate-from-abyssale.md
# Move this project from Abyssale to Orshot

I am switching image generation from Abyssale (api.abyssale.com) to Orshot (api.orshot.com). Orshot generates images, PDFs and videos from templates through one REST endpoint, and has native n8n, Make, Zapier, Pipedream and Airtable apps plus an MCP server (https://mcp.orshot.com/mcp, setup at https://orshot.com/agents). Connect to the MCP server first if you can: it lists my Orshot templates, their parameters, and runs test renders. Read the linked docs before you change code.

## 1. Inventory

List every Abyssale touchpoint with file paths:
- calls to `api.abyssale.com`: `/banner-builder/{designId}/generate`, `/async/banner-builder/{designId}/generate`, `/generation-request/{id}` polling, `/designs`
- the `@abyssale/sdk` (Node) or `abyssale` (Python) packages
- `ABYSSALE_API_KEY` or any `x-api-key` header sent to Abyssale
- design IDs (UUIDs), `template_format_name` / `template_format_names`, `elements` objects keyed by layer name
- webhook handlers for `NEW_BANNER_BATCH` events and `callback_url` values
- dynamic image links on `img.abyssale.com`
- n8n, Make or Zapier exports in the repo with Abyssale steps

## 2. Templates

I import the designs myself: New Template → Abyssale tab → paste the Abyssale API key → pick designs. Guide: https://orshot.com/migrate/from-abyssale

After import:
- one Orshot template per Abyssale design
- one page per Abyssale format, named after the format (`facebook-feed`, `instagram-story`…), in the design's order
- each layer name is a parameter with the same name (names with spaces become lowercase with underscores)

Ask me for the Orshot template IDs, or read them: https://orshot.com/docs/api-reference/studio-templates-list and https://orshot.com/docs/api-reference/studio-template-get
Build a table: Abyssale design ID → Orshot templateId, format name → page number. Show it to me before editing code.

## 3. Rewrite the calls

Reference: https://orshot.com/docs/api-reference/render-from-studio-template

Abyssale:
```http
POST https://api.abyssale.com/banner-builder/DESIGN_ID/generate
x-api-key: ABYSSALE_KEY
{ "template_format_name": "facebook-feed", "elements": { "title": { "payload": "Hello", "color": "#111" }, "hero": { "image_url": "https://…" }, "badge": { "hidden": true } } }
```

Orshot:
```http
POST https://api.orshot.com/v1/studio/render
Authorization: Bearer ORSHOT_KEY
{ "templateId": 12345, "modifications": { "title": "Hello", "title.color": "#111", "hero": "https://…", "badge.opacity": 0 }, "response": { "type": "url", "format": "png", "includePages": [2] } }
```

Rules:
- `elements` becomes a flat `modifications` object. `payload`, `image_url` and `video_url` become the value itself.
- Properties become dot keys: `color` → `"name.color"`, `background_color` → `"name.backgroundColor"`, `font_size` → `"name.fontSize"`, `font_weight` → `"name.fontWeight"`, `opacity: 40` → `"name.opacity": 0.4`, `hidden: true` → `"name.opacity": 0`. Docs: https://orshot.com/docs/dynamic-parameters
- `root.background_color` → `canvasBackgroundColor`.
- `font` is a UUID in Abyssale; use `"name.fontFamily": "Font Name"` or leave the font set on the layer.
- `template_format_name` → `response.includePages: [pageNumber]` using my mapping table. `template_format_names` (or none) → drop includePages: one call renders every page and `data` is an array, one entry per page with `page` and `pageId`.
- `vars` → a parameter per variable, after I make those texts parameters in the Studio.
- Layer settings (`fitting_type`, `alignment`, masks, filters, shadows, `auto_resize`, `max_lines`) are set once on the layer in Orshot, not per request. Flag any that change per render.
- `remove_bg`, `auto_focus`, `expand`, `text_to_image` have no equivalent; flag them.
- `image_file_type` → `response.format` (png, jpg, webp, avif, pdf, mp4, gif). `html5` has no equivalent. Video: `video.fps` → `videoOptions.fps`. Docs: https://orshot.com/docs/video-generation/video-options
- Orshot is synchronous by default: the file URL is in `data.content`. Remove `/generation-request` polling.
- If the code needs a webhook (`callback_url`), set `"mode": "async"` inside `response` and top-level `webhook_url`. The webhook body is `{ event: "render_job.finished", job }` per job, not a `NEW_BANNER_BATCH` list. Docs: https://orshot.com/docs/api-reference/async-render-start
- Auth: `x-api-key` → `Authorization: Bearer`. Store the key as `ORSHOT_API_KEY`. https://orshot.com/docs/quick-start/get-api-key
- SDKs (Node, Python, Ruby, PHP): https://orshot.com/docs/sdks. Errors: https://orshot.com/docs/error-reference

## 4. Dynamic image links

`https://img.abyssale.com/{dynamicImageId}/{format}?title=Hi` becomes an Orshot Dynamic URL: https://orshot.com/docs/integrations/dynamic-urls
Shape: `https://api.orshot.com/v1/studio/dynamic-url/{name}.png?templateId=12345&title=Hi&sign=SIGNATURE`
- Same `name=value` short form. Only text parameters travel in the URL.
- Orshot links are signed. The signature comes from the template's Quick Connect → Dynamic URL panel; ask me for it.
- Old img.abyssale.com links keep serving their cached variants; update only new sends.

## 5. Automations

- n8n: swap the Abyssale node for the Orshot node (`n8n-nodes-orshot`), or paste Quick Connect → Copy as → n8n workflow. https://orshot.com/docs/integrations/n8n
- Make: swap the module, or import Quick Connect → Copy as → Make blueprint. https://orshot.com/docs/integrations/make
- Zapier: Orshot → "Generate Image from Studio Template". https://orshot.com/docs/integrations/zapier
- Airtable: https://orshot.com/docs/integrations/airtable
- Plain HTTP callers: the template webhook maps any JSON to parameters. https://orshot.com/docs/integrations/webhooks
- AI agents: https://orshot.com/agents (MCP server https://mcp.orshot.com/mcp)

## 6. Verify, then switch

- Keep the Abyssale path behind a flag until each Orshot render matches on real data.
- Render every mapped template and format once and send me the URLs.
- Then remove the Abyssale SDK, key and batch webhook handler.

Everything else: https://orshot.com/llms.txt

Want the agent to render and check templates too? Connect Orshot for agents.

Pricing

Priced by credits, not seats

One credit is one image at any size, one PDF page or one second of video. Team members are included in the plan.

Credits per monthOrshot planOver that
1,500 credits1,500 images, PDF pages or video seconds$39/mo$0.036 per credit
5,000 credits5,000 images, PDF pages or video seconds$99/mo$0.036 per credit
20,000 credits20,000 images, PDF pages or video seconds$160/mo$0.03 per credit
40,000 credits40,000 images, PDF pages or video seconds$280/mo$0.03 per credit

1 credit = one image, one PDF page or one second of video. Free for up to 5 templates on any paid plan. Higher volumes and every plan detail on pricing.

FAQ

Before you switch from Abyssale

What is Orshot?

An API for automated image, PDF and video generation from templates. You design a template once, then generate from REST, Zapier, Make, n8n, Workflows or an AI agent.

Which Abyssale designs can I import?

Any design that lives in a project: static, animated and print. Workspace templates at the root are not reachable through Abyssale's API, so duplicate one into a project first.

Who can create the API key?

Reading a key in Abyssale needs an Admin role. A new key takes about 30 seconds to start working, so wait a moment if the first connect is rejected.

Is my Abyssale key safe with Orshot?

It is only used to read your designs. Orshot stores it encrypted for your workspace so you can import again later, and Remove it deletes it at any time.

What happens to my formats?

Each format becomes a page of one Orshot template, named after the format, with its own size and layout. One request renders all of them, or pick some with includePages.

What does not carry over?

Slide, scale and fade animations (the timing comes across), per-line highlight boxes on multi-line text (drawn as one block), button icons, and live ratings and QR codes, which arrive as fixed images.

Do fonts and images come across?

Images are copied into your Orshot storage on import. Google fonts match by name. A custom font needs one upload to the Brand Library, and the import tells you which.

What about my img.abyssale.com links?

Rebuild them as Orshot Dynamic URLs with the same name=value parameters. Orshot links are signed. Links you already sent keep serving their cached images from Abyssale.

What does the free migration cover?

Up to 5 designs on any paid plan, all formats included, plus the Zapier, Make or n8n step that calls them and a test render of each. Bigger moves start with a call.

Can I run Abyssale and Orshot side by side?

Yes, nothing changes in Abyssale when you import. Keep both behind a flag, move one automation, compare a week of renders, then decide.

Weighing it up first? Read Orshot vs Abyssale. Several workspaces or a big library? Let's talk it through.

Book a call