Hi there,
Abyssale now speaks MCP. Connect it to Claude.ai, Claude Code CLI, ChatGPT/Codex, or Cursor, and your AI assistant can work directly in your Abyssale workspace, no API integration required.
import_design_from_json builds a fully editable, multi-format design directly from a JSON payload, meaning an assistant can go from a brief to a real Abyssale design without anyone opening the editor first.Ask Claude to "generate this banner in every format for our Q4 campaign" or "build me an editable product design from this brief," and it can just do it, reading the design first so it never guesses at layer names, then rendering straight to a file URL.
mcp.json).
Hi there,
AI Translation in the Spreadsheet has been one of the quickest ways to localize a batch of creatives: select your text, pick a language, and Abyssale translates it while preserving context and meaning, optionally duplicating your rows so the originals stay intact.

It had one limitation that anyone running multilingual campaigns felt immediately: one target language per operation. Localizing a campaign into six markets meant selecting the same content, opening AI Actions, and running the translation six separate times. It worked, but it was repetitive in exactly the way automation is supposed to eliminate.
That limitation is gone. You can now select up to 10 target languages at once, and Abyssale translates your content into all of them in a single operation.
The flow is the same one you already know, with one difference at the language step:
One click, and every selected language is handled. With duplication enabled, a single source row becomes one row per target language, ready to generate a full multilingual variant set without a single repeated action.
There's a second improvement bundled in. If your spreadsheet has a language column (the one you can add via the Manage columns button), Abyssale now fills it in automatically for each translated row with the corresponding language.

Before, that column was something you had to fill by hand after translating, or leave empty. Now every duplicated row arrives already labeled with its language, so you can see at a glance which row belongs to which market, sort or filter by language, and, if you're using that column as a dynamic variable in your design, drive language-specific content or formats straight from the spreadsheet without any manual tagging.
The time saving is obvious, but the bigger shift is that the structure of your spreadsheet now matches how localization work actually happens. Campaigns aren't translated into one language; they're translated into a market list. Selecting that list in one go means:
Hi there,
The in-app API console has always been the fastest way to see what a generation request for a given design looks like: open it, and it hands you a ready-to-run JSON payload built from that design's configuration. Until now, though, that payload was always a synchronous request, which meant the console couldn't show you, or let you test the parts of the API that only exist in asynchronous generation.
That's changed. A new Query mode selector in the console lets you switch between Sync and Async, and the payload, the available options, and the result behavior all update to match.

The two modes correspond to the two generation paths in the API, and the console now generates the correct payload for whichever one you pick:
template_format_name (a single string).template_format_names (an array), and the API returns a generation request ID immediately.Switching modes isn't just a cosmetic toggle: it changes which AI parameters the console includes, because the two paths don't support the same set.
If you've enabled Remove Background or Text-to-Image on a design and wondered why the console's sync payload didn't reflect it, this is the reason. Those actions are only supported on asynchronous generation. Background removal can take longer than the synchronous path's 10-second limit, so it's deprecated in sync and not recommended there; Text-to-Image behaves similarly. Surfacing those parameters in a sync payload would produce a request that looks correct but fails at runtime — so the console deliberately filters them out.
Concretely, when the console builds a payload for a design:
auto_focus and auto_focus_properties)remove_bg and remove_bg_properties), and Text-to-Image
Before, the only way to test a Remove Background request from the console was to add those fields by hand. Now you switch to Async and they're generated from the design's configuration, the same way Auto Focus always has been.
A helper block below the console in sync mode explains this and links straight to the asynchronous generation docs, so anyone landing on the console for the first time understands why a design's AI settings don't all show up in the sync payload.
The File type selector (Auto, PNG, JPEG, WEBP, AVIF) previously only appeared in some contexts. It's now available in both modes, sitting right next to the Query mode selector, so a static design gets the same output-format control the other design types already had, and it's a visible reminder that the API supports several export types, not just one.
Async generation in production means receiving results via webhook or polling the request ID. In the console, you don't have to do either: run an async query and the result still appears below, exactly as it does for animated, print, and multi-page designs, which were already async-only. The console handles the polling for you, so you can iterate on an async payload with the same fast feedback loop you're used to from sync.
Hi there,
Background removal is one of the most-used AI actions in Abyssale, and one of the most common ways to waste credits on it is running it on an image that doesn't need it. If a batch mixes already cut-out PNGs with regular photos, every image gets processed the same way, including the ones that already have no background to remove.
A new Skip if Already Transparent option fixes that. Turn it on, and Abyssale checks each image for existing transparency before deciding whether to run background removal at all.

When the option is enabled, Abyssale first checks whether the image already contains a significant amount of transparency:
Trim Transparent Pixels still applies either way. If you have both options enabled, an already-transparent image isn't re-processed by the removal model, but it's still cropped down to its subject, so the result stays compact and centered.
One thing to be aware of: the transparency check always costs 1 AI credit when the option is on, even when removal ends up running afterwards. If you know none of your source images are transparent, leave it off, there's nothing to save in that case.
You can enable it in two places:
Like the other Remove Background settings, this one can be saved as part of the layer's AI action, so it carries over automatically to every future variation of the design, whether generated through Quick Generation, a spreadsheet, or the API.
It's worth noting that Skip if Already Transparent is a design-level setting, not an API parameter. There's no API property for it: when the toggle is enabled on the layer, it applies to every generation of that design, including ones triggered via the API, and the API payload can't set or override it. That means once you've configured it in the editor, you don't need to think about it again in your integration.
The payoff is biggest in batch work. If you're running background removal across a product catalog, a set of user-uploaded images, or any source where some assets are already cut out and some aren't, this stops you from paying full model cost on images that would have come out unchanged anyway, and does it without you having to sort the images by hand first.
Hi there,
AI settings in Abyssale used to be a single on/off switch: AI features were either available to a workspace or they weren't.
That's still true, but it's no longer the whole picture. Administrators can now go a level deeper and control which specific AI models their team is allowed to use for each AI feature, and set which one is used by default.
As Abyssale has added more AI models across features like Text-to-Image and Remove Background, teams have ended up with real decisions to make about which models they actually want in play, not because every model isn't useful, but because "useful" depends on the team. A model might be excellent and still be the wrong choice for a given workspace: too expensive to run at volume, not aligned with a client's content policy, or simply inconsistent with the quality bar the team has settled on.
Until now, there was no way to express that at the workspace level, every enabled AI feature meant every model behind it was fair game, and standardizing on one meant trusting each person to pick the right one every time.
The new controls live in workspace AI settings, in a Models preferences section. For each AI feature, Text to Image, Remove Background, and so on, you'll see the full list of available models, along with:

Each model has a simple toggle. ON means it's available for the team to select when generating content. OFF hides it from selection entirely, team members won't be able to use it, even if their subscription plan technically includes it.
This is the mechanism for restricting usage: disable anything that doesn't meet your organization's cost, quality, or compliance bar, and it disappears from the picker for everyone in the workspace.
For any enabled model, the ⋯ (more options) menu includes Set model as default. That model is then pre-selected automatically whenever someone on the team starts a new AI generation, so the team defaults to whatever you've decided is the right choice, instead of relying on each person to remember and pick it manually every time.
Two rules keep this consistent: a model has to be enabled before it can be set as default, and disabling the current default forces you to choose a new one.
Put together, enabling/disabling models and setting a default give admins three concrete levers:
This sits alongside the existing workspace-wide AI Features Access toggle and the AI Model Training setting (which controls whether anonymized workspace data can be used to improve Abyssale's models), both still available in the same settings area, for admins who want to manage AI access at that broader level too.
→ Read the full guide: Control AI Features and Content Training in Abyssale
Hi there,
Webhook deliveries can now be signed, so anything receiving them can verify a payload actually came from Abyssale and hasn't been tampered with in transit. It's opt-in: nothing changes for existing integrations until a workspace fetches its signing secret for the first time.
Signing is controlled through three endpoints:
GET /signing-secret : fetches the workspace's signing secret, minting one if it doesn't exist yet. This is the action that turns signing on for a workspace. Until it's called, deliveries go out unsigned exactly as before.POST /signing-secret/rotate : generates a new secret. The previous one stays valid for 24 hours, so you can roll the new secret out to your receiver on your own schedule instead of everything needing to happen atomically.POST /signing-secret/revoke : ends that overlap early, if you don't want to wait out the full 24 hours. Takes effect within 60 seconds.Once a workspace has a secret, every webhook delivery carries two headers:
X-Abyssale-Signature: t=…,v1=… : an HMAC-SHA256 signature computed over the raw request body, along with the timestamp it was signed atX-Abyssale-Delivery-Id : a unique ID per delivery, meant for deduplication on the receiving endVerifying a signature is standard HMAC verification: recompute the HMAC-SHA256 over the raw body using your signing secret, compare it against the v1 value, and check the t timestamp is recent enough to reject replayed deliveries.
Both official SDKs support signing as of this release:
@abyssale/sdk 1.3.0 (Node.js/TypeScript) — signing secret management plus a signature verifier, importable on its own from @abyssale/sdk/webhooks so a receiver can verify incoming payloads without an API key configured at all.abyssale 1.1.0 (Python) — the same secret management methods and a verifier, available via abyssale.webhooks.In both cases, verification is pure local cryptography it doesn't call the Abyssale API, so it works even in a minimal webhook receiver that has no other reason to hold credentials.
Without signing, any endpoint receiving Abyssale webhooks has to trust that a POST claiming to be from Abyssale actually is there's no way to distinguish a real delivery from a forged one. Signing closes that gap: verify the header, know the payload is genuine, and use the delivery ID to safely ignore duplicates if a delivery gets retried.
Because it's opt-in, there's no migration required to keep existing integrations working. Turning it on is a single call to GET /signing-secret whenever you're ready.
Hi there,
Building on top of the Abyssale API has meant hand-rolling HTTP requests since day one — right auth headers, right payload shape, your own retry logic if a request timed out. That's no longer the only option. Abyssale just shipped its first official SDKs:
@abyssale/sdk for Node.js/TypeScript (now at 1.3.0),abyssale for Python (now at 1.1.0).Both SDKs wrap the core REST API — designs, generation, projects, workspace templates, exports, and, as of this release, webhook signing — in a typed, idiomatic client for their respective language, so integrating Abyssale into a codebase looks like using any other well-maintained SDK, not stitching together fetch calls.
Install it with:
npm install @abyssale/sdk
Node.js 20.3 or later is required — not just Node 20. The retry middleware relies on AbortSignal.any, which only landed in 20.3.0, so installing on 20.0–20.2 succeeds but fails at runtime.
Configuration is entirely environment-variable driven — no constructor, no setup step beyond setting ABYSSALE_API_KEY. Note that the SDK throws at import time if that variable isn't set, which occasionally surprises people in test environments:
import abyssale from '@abyssale/sdk';
const { data, error } = await abyssale.generateImage('your-design-id', {
elements: {
title: { payload: 'Hello World' },
background: { background_color: '#FF0000' },
},
template_format_name: 'facebook-post',
});
console.log(data?.file.cdn_url);
A few things worth knowing:
{ data, error, response }, so error handling stays explicit instead of relying on try/catch around network calls.5xx is retried on reads only — a generation POST is never repeated, since a timeout doesn't mean the render didn't happen, and retrying it could bill you twice. A 429 carrying a Retry-After header gets the full retry ladder; a bare 429 gets a single one-second probe, since that status alone can mean either "out of credits" or "hit the gateway's per-second ceiling." feature_not_in_plan is never retried. Retry count is configurable via ABYSSALE_MAX_RETRIES.waitForGenerationRequest and waitForDuplicationRequest handle the poll loop for async jobs (multi-format generation, multi-page PDFs, workspace template duplication) so you don't have to write your own polling logic.@abyssale/sdk/webhooks — it needs no API key at all, since verifying a signature is pure local cryptography, not an API call.One caveat: the design-import surface is deliberately left out of the SDK for now, since it's still in Alpha and the format may change — the OpenAPI spec used to generate the client strips those endpoints so a routine regeneration can't accidentally reintroduce them before things stabilize.
→ npmjs.com/package/@abyssale/sdk
→ github.com/getabyssale/abyssale-sdk
→ developers.abyssale.com/sdks/nodejs
The same core coverage is now available for Python teams, published to PyPI as abyssale, at 1.1.0.
pip install abyssale
from abyssale import abyssale, AbyssaleAPIError
try:
banner = abyssale.generate_image(
"your-design-id",
elements={
"title": {"payload": "Hello World"},
"background": {"background_color": "#FF0000"},
},
template_format_name="facebook-post",
)
print(banner.file.cdn_url)
except AbyssaleAPIError as e:
print("API error:", e.id)
The two SDKs are built on the same underlying API, but they don't handle errors the same way. Where the Node SDK returns { data, error } and never throws, the Python SDK raises AbyssaleAPIError on failure, carrying a machine-readable id you can match against. Worth keeping in mind if you're used to one and picking up the other.
Request bodies in Python are plain dicts by design rather than generated model classes — the elements schema is an anyOf with no discriminator, so a strict model would risk mis-coercing valid payloads.
Like the Node SDK, this release also adds webhook signing support via abyssale.webhooks: the same list/create/delete methods for your signing secret, plus a signature verifier that works without an API key configured.
And the same Alpha caveat applies here too: design-import endpoints are intentionally excluded from the generated client while that feature's format is still settling.
→ github.com/getabyssale/abyssale-python-sdk
→ developers.abyssale.com/sdks/python
Every integration built directly against the raw REST API was solving the same problems over and over: retry logic that doesn't double-bill you, polling for async jobs, verifying webhook signatures by hand. With official, typed SDKs for both Node.js and Python — and now first-class webhook signing in both — that work is done once, centrally, and maintained alongside the API itself.
Questions about migrating an existing integration to one of the SDKs? Reach out at help@abyssale.com.
Hi there,
For as long as the Abyssale API has existed, it's followed the same rule: build the design in the editor first, generate from it after. That rule just changed.
You can now send a full design as a single JSON payload and have Abyssale create it for you — and export any existing design back into that same shape.
On top of that, workspace templates are now reachable by API too, alongside a round of platform-level improvements aimed squarely at anyone running Abyssale as part of an integration.
Until now, the editor was a mandatory first step. Every design, however simple, had to be built by hand before the API could generate a single asset from it. That dependency is gone: a design can now be described entirely as JSON and imported directly, without ever opening the builder.
The reverse works too — any existing design can be exported into that same JSON shape, which means you can pull a design out, inspect or modify its structure, and import it back as a new one.
This isn't limited to simple static visuals. It covers:
This turns design creation itself into something automatable, not just design generation. A few things become possible that weren't before:
The feature is marked Alpha because the JSON format itself may still evolve — but it's live and rolled out to everyone, with no partner signup or waitlist required to access it. Anyone can start using it today.

Workspace templates, your brand masters, standardized layouts, whatever your team treats as a starting point — were previously something you could only spin up into a project from inside the builder. That's now available by API as well: list the templates in a workspace, and turn any one of them into a new project programmatically.
This is particularly useful if you're standardizing on a fixed set of brand templates across multiple teams or client accounts and want project creation to be part of an automated flow rather than a manual step someone has to remember.
Alongside the two feature additions, this release includes a set of changes to the API's underlying behavior:
In practice, this means fewer support tickets from integrations breaking in confusing, hard-to-diagnose ways — and a clear, consistent answer any time someone asks "why did my request fail?"

The developer documentation has been rebuilt from the ground up, with a quickstart, a full error reference, a changelog, and a complete endpoint catalogue, all in one place.
Hi there,
For a while, AI in Abyssale meant reaching into a menu, buried a click or two away from the layer you were actually working on. That's changed. Remove Background, Auto Focus, the Eraser, and AI Text-to-Image now sit together in a single AI toolbar that appears the moment you select an image layer, and each of them just got meaningfully more capable.
Here's a full walkthrough of what's new, with a link to the dedicated guide for each feature if you want the details.

Select any image layer in the Design Editor and an AI toolbar appears at the bottom of the canvas, with all four AI actions right there: Remove Background, Focus, Erase, and Ai text to image. No more navigating through separate modals or side-panel menus depending on which action you needed, it's the same entry point every time, for every action.
From there, each action opens its own context directly in the toolbar, where you configure it and generate without leaving the canvas.
Background removal now gives you a choice of model instead of a single fixed engine. Click the model dropdown to see the available options, each labeled with its relative AI credit cost:

If your first pass doesn't cleanly isolate the subject, especially around tricky edges, switching models is usually faster than repeating the same one. Two additional controls round out the feature: Trim Transparent Pixels, which crops the image down to its subject after removal, and Manual Selection, which lets you draw a box around the area you want to guarantee is kept (Design Editor only, not available via API).
Once you're happy with a result, you can save it as the rule for that layer going forward, so every future variation gets the same treatment automatically.
→ Read the full guide: Remove Image Backgrounds
Auto Focus keeps your subject perfectly framed regardless of the original image's size or orientation, and it offersn the two detection models depending on what you're framing:

During automated variations, if the AI detects the tags you've chosen in a new image, it merges them automatically to keep your composition consistent at scale, useful for anything from headshots to product shots run through a large batch.
→ Read the full guide: Auto Focus

The AI Eraser lets you paint over any object, logo, or unwanted detail in an image and have it intelligently replaced with matching background content — no manual retouching required. It's a natural fit for cleaning up product photos, removing logos from reused assets, or hiding distracting background elements.
Two selection modes are available: brush mode, with an adjustable size for fine edges or broader areas, and bounding box mode, for quickly clearing larger or simpler shapes. Like the other AI actions, you now choose which AI model handles the erase before applying it, and the edit is non-destructive until you confirm it.
→ Read the full guide: Erase Unwanted Objects from Images

Text-to-Image turns a written description into a custom visual directly inside the builder, no stock photo search, no manual illustration. The feature now supports multiple AI models instead of a single one, and depending on the model you choose, you can add up to 4 reference images to steer the generation instead of working from the prompt alone.
Other capabilities carried over and still worth knowing:
Text-to-Image is also available through the API: pass a text_to_image prompt on an image element instead of a static URL, and Abyssale generates the visual in real time as part of your automation.
→ Read the full guide: AI Text to Image

The biggest shift isn't any single action, it's that none of them are one-off anymore. Save an AI action once (Remove Background, Auto Focus, or Text-to-Image) and it becomes the standing rule for that image layer.
Every future variation of the design inherits it automatically, whether it's generated through Quick Generation, a spreadsheet, or the API, including having each variation generate its own unique AI image, not just reuse the same one.
That reach comes with control. In Design Settings, you decide whether AI Text-to-Image is allowed on a design at all. For Quick Generation specifically, you can also decide whether the end user creating a new variation is allowed to generate an AI image inside it, or not, so self-serve generation stays exactly as open, or as locked down, as you want it.
For the technical details on wiring any of this into your own workflows, remove_bg, auto_focus, and text_to_image element properties, model names, and payload examples — the API reference has the full spec.
Hi there,
You can now generate print-ready PDFs for large formats directly in Abyssale, at actual dimensions, no workarounds needed.
Create print formats up to 10 000 mm per side. Metro posters, roll-ups, billboards, bus shelters, all supported natively.

Set the exact resolution your printer requires, independently for each format in your design. 300 DPI for close-up print, 72–150 DPI for large outdoor formats.

The generation cost in credits is displayed in real time as you adjust dimensions and DPI — no surprises before you generate.

Import source files up to 500 MB, so you can bring in high-res images and assets without compression.
New design : Create a new design, select a Print design type (Multi format or Multipage), then define your format dimensions in mm or inches. For each format, set the DPI that matches your print requirements in the design editor.
Existing design : Already have a print design? Simply add a new format on it to your large format size, then adjust the DPI accordingly.
The maximum available DPI updates automatically based on your canvas size, you'll always see what's possible before generating.