Maileditor Docs
PluginReference

Error codes

Every machine-readable error the Plugin API returns, grouped by where you will meet it, with what to check.

Every failure uses the same envelope. The code is in result.error; validation failures use errors keyed by field instead.

{
  "message": "This origin is not allowed for this plugin",
  "result": { "error": "origin_not_allowed", "origin": "https://staging.customer.com" }
}

Where to see them

  • In the editor. When the editor cannot start it shows "Plugin editor unavailable". Open your browser's network tab and read the session response.
  • From your server. Backend API responses carry the code directly.
  • In the dashboard. Failures show as form messages on the settings tabs.

Session errors

Returned by the session endpoint when the editor starts.

StatuserrorWhat to check
403origin_not_allowedThe page's origin is not on the allowed domains. Scheme and port must match exactly
403origin_requiredThe request had no usable origin
401invalid_pluginUnknown plugin id, inactive plugin, or wrong secret. Check the Plugin ID on the General tab
403identity_signature_requiredPlugin is in signed mode and the URL carries no signature. See identity signing
401identity_signature_invalidPayload built differently or wrong secret. Rebuild the payload exactly and count bytes
401identity_signature_expiredidentity_expires is in the past. Sign when the page loads, not at build time
422identity_expires_out_of_rangeMore than 15 minutes ahead, or milliseconds instead of seconds
403browser_sessions_disabledPlugin is in backend identity mode
402quota_exceededPlan's users allowance is spent and this is a new user. Upgrade the plan
422origin_invalidThe origin field in a server-side session request is malformed
422A secret was sent from a browser, or external_user_id starts with anon:
429Rate limited. 10 per minute per plugin and IP

Errors during a session

StatuserrorWhat to check
401invalid_tokenSession expired or revoked. The editor renews automatically; reload if it persists
403origin_mismatchToken used from an origin other than the one it was issued for
404template_not_foundNo such template, another user's, another plugin's, or a gallery template outside curation. Check template_id belongs to the same external_user_id
402quota_exceededA metered allowance is used up. result.feature names it: users, ai_generations, image_storage
402feature_not_in_planVersion history, the template gallery or the module library on a plan without it. result.feature names it
409plugin_not_provisionedPlugin is still being set up. Retry shortly
409storage_not_publicCustom storage has no public_url. Set it on the Custom Storage tab
404image_not_foundNot this user's image, or no such uuid
422unsupported_image_propertyOnly used_in_banner can be set
403ai_not_configuredNo AI key on the plugin. Add one on the AI Credentials tab
403no_ai_credentialA key exists but could not be read. Save it again
502ai_generation_failedThe provider refused or was unreachable. Check the key and the provider's status
502stock_provider_unavailableThe stock provider refused or was unreachable. Usually a bad or expired key, or its hourly limit. Check it on the Stock Images tab
422invalid_download_locationThe tracked URL is not one that provider accepts. Send the download_location from the image object unchanged
422invalid_stock_urlImport was given a URL that is not on a Pixabay host. Unsplash and Pexels images are used by URL, never imported
502stock_import_failedThe Pixabay download failed, or the file was empty or over 10 MB

Backend API errors

StatuserrorWhat to check
401credentials_requiredSend both X-Plugin-Id and X-Plugin-Secret
401invalid_credentialsWrong secret, unknown plugin, or suspended plugin
401credentials_in_queryCredentials must be headers, never query parameters
409plugin_not_provisionedRetry shortly
404template_not_foundThe id does not belong to this plugin
42960 per minute or 2000 per day exceeded. Honour Retry-After

On this page