Skip to main content
Every failed request returns the same JSON shape, no matter which endpoint or what went wrong:
code is a stable, machine-readable string you can branch on. message is a human-readable description — useful for logs, but don’t parse it; it can change wording over time. When a target platform refuses a post, message begins with that platform’s own wording, unchanged — usually in English. Where MADIAD Hub has a Vietnamese rendering of it, that follows after · Tạm dịch:. The translation is a translation: it carries the platform’s clauses and its numbers, and adds no advice of ours. A message with no rendering stays English rather than being guessed at. The only other edits are to our own identifiers: the publishing backend’s name, support address and docs links are replaced with MADIAD’s, and internal profile identifiers are removed.

Error codes

See Idempotency for how Idempotency-Key prevents duplicate posts on retry, and Rate limits for the per-minute limit behind rate_limited.

Should you retry?

Branch on the status code, never on the wording of message:
Until 2026-08-07 every failure coming from the publishing backend was reported as 502, including permanent ones like a caption over the limit or a Profile with no connected account. Automations that retry on 5xx therefore retried requests that could never succeed. If your integration works around that by parsing message, you can now delete that code and branch on the status.

Errors without the standard envelope

A very large multipart upload can be rejected at the network edge before it reaches MADIAD Hub — the response is a plain 413 Request Entity Too Large (no JSON envelope). Send the images as photo_urls[] instead: MADIAD Hub downloads them server-side, so the request body stays small no matter how big the images are. Compressing the files also works for smaller overruns.