Conflict (409)

The request contradicts the current state of the resource. The detail field says which invariant was hit.

Where it happens

  • POST /v1/churches/{id}/verification: the church's legal details were already received, so they change only with Roster's help. A church that is already verified has its own type: church-already-verified.
  • Any POST whose Idempotency-Key belongs to a different body (a request that succeeded, is still running, or ended in a 5xx or a timeout) has its own type: idempotency-key-reused.
  • PUT /v1/flow-settings: someone saved the settings after you read them (your expected_version is no longer the current version), or you sent church overrides while customization.customize_churches is off. Both bodies also carry the current settings and version; in the first case, apply your change to settings (with church_id, to church_settings, sent whole) and resend with that version (see Concurrent saves).
  • PUT /v1/allowed_origins: one of the sites is registered to another partner, or the list changed while you were saving.
  • Church registration while new churches are paused has its own type: church-intake-paused.
  • POST /v1/donor_sessions where donor sessions are not open yet has its own type: donor-sessions-not-open.
  • POST /v1/refunds for a donation being sent to the church's bank has its own type: donation-in-flight. Canceling a refund that was approved for sending, that Roster reviewed while the rest of the donation goes to the church, or that already ended, has its own type too: refund-not-cancelable.

What to do: re-read the resource (GET it), reconcile your local state, and decide whether the operation still makes sense. Do not blind-retry a 409 — it will keep answering 409 until the state changes.