error is English prose for a human. Branch on the status, not on the wording.
Status codes
Validation errors are not errors
Ad-copy validation is the exception worth knowing about.POST /api/v1/campaigns/ad-copy/validate answers 200 with valid: false and a list of problems — the text being wrong is the expected outcome of asking, not a failed request.
Campaign creation, by contrast, refuses the same text with a 400 whose message lists every problem and the span of markup each occupies. See Ad copy.
Retrying safely
Only campaign creation is idempotent, throughidempotencyKey. Reuse the same UUID for a retry of the same intent; anything else creates a second campaign and a second charge.
Everything else is either a read, or an action guarded by the object’s own state — approving an already-approved placement is a 409, not a double charge.