When a job fails, the Plugin API now tells you what went wrong in a form you can act on. GET /jobs/{id} and the outgoing webhook both return the same error object, and both were improved in the same way.
What changed
codeis now specific to the cause. A rejected prompt reportscontent_policy_violation, a missing source file reportssource_asset_unavailable, a provider rate limit reportsrate_limit_exceeded. Every value is one already listed in the published enum, so existing handling keeps working.- Failures that happened while a job was running additionally carry
category— the underlying failure class the code is derived from. message_i18nis always available in both English and Polish, anddoc_urlalways links to the documentation page for that code.retryablenow reflects whether the job will be retried, so a value offalsemeans resubmitting the same request cannot help.
What to check in your integration
message_i18n.en previously repeated the raw message our image provider returned. It now contains our own wording, written for a person to read. If you were storing, matching on or parsing that text, switch to code — it is the documented field to branch on, and it is stable. Raw provider text is no longer sent outside our systems.
Failures recorded before this change do not have a category; they continue to report generation_failed.
The full list of codes, and the table showing which category produces which code, is in the Plugin API error reference.