Log in a donor across organizations
Authenticates a donor by username or email across all clients rather than a single client/program route. If multiple donor accounts match the credentials, the endpoint creates a short-lived Redis account-selection token and returns selection_required; otherwise it creates a donor Redis session and returns the donor, client, program context, and redirect URL. Public donor portal clients use this endpoint when scoped login route parameters are unavailable.
Body
Global donor login credentials.
Username or email address. Validator rule: required|string.
"jane@example.org"
Donor password. Validator rule: required|string.
"secret123"
Optional frontend return path. The controller only accepts relative /frontend/... donor portal paths for the selected donor's client/program.
"/frontend/donor_view/207/11"
Response
Login succeeded or account selection is required.
success for a completed login or selection_required when multiple accounts match.
"success"
"You have successfully logged in!"
A donor record. Donors give one-time donations and recurring commitments, and may be linked to entities (recipients) via sponsorships. Standardized profile columns (first_name, phone, address, etc.) coexist with arbitrary custom fields stored in json_fields and defined per hysform_id. The username/email/password columns also let donors sign in to the donor portal.
A Gratona client — the tenant of the multi-tenant system. Owns donors, entities, programs, users, and integrations. The client_id on every other resource scopes data to this row. Stripe Connect onboarding state, account-level settings, and the client's display name all live here.
Resolved donor program context from DonorProgramContextService.
"/frontend/donor_view/207/11/7f2c8f8d64b8a1d4a9e2"
"7f2c8f8d64b8a1d4a9e2"
true
"1b73f6..."
Returned only when account selection is required.