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-Keybelongs to a different body (a request that succeeded, is still running, or ended in a5xxor a timeout) has its own type: idempotency-key-reused. -
PUT /v1/flow-settings: someone saved the settings after you read them (yourexpected_versionis no longer the currentversion), or you sent church overrides whilecustomization.customize_churchesis off. Both bodies also carry the currentsettingsandversion; in the first case, apply your change tosettings(withchurch_id, tochurch_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_sessionswhere donor sessions are not open yet has its own type: donor-sessions-not-open. -
POST /v1/refundsfor 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.