Gone (410)
The hosted-flow token is expired or already used, or the page that opened it is on a site that is not in your allowed origins. Tokens are single-use with a 30-minute TTL, and every dead link answers this same way — expired, consumed, or never-existed are indistinguishable on purpose (a link found in a log or screenshot must not become an oracle).
The donor who opens such a link sees "This link can't be opened" and is asked to go back to where they started and open a new link — so your page should be able to create one.
What to do
-
If the link was never opened, check
GET /v1/allowed_originsfirst. A page on a site that is not in your allowed origins cannot open the flow: in the sandbox, alocalhostport you did not register shows This link can't be opened; any other site shows the browser's blocked-frame page with aframe-ancestorserror in the console. The link is not spent: ifGET /v1/donor_sessions/{id}still sayscreated, add the site withPUT /v1/allowed_originsand open the sameurlagain. A new session would fail the same way. - Otherwise, create a new
donor_sessionand hand the donor the freshurl. - Never store or reuse hosted-flow URLs; treat them as one-shot.
-
A session whose link expired before anyone opened it emits
partner_session.expiredon your webhook and feed, but only once the session is read withGET /v1/donor_sessions/{id}or its link is opened afterexpires_at. Nothing sends it at the expiry time on its own. To re-send unopened links, read the session afterexpires_atand act onstatus: expired.