Skip to content

Confirm payment​

POST
/payments/confirm

Confirm a PaymentIntent that Stripe has reported as succeeded, and
settle the donation record.

The field is payment_intent_id (snake_case) — the value returned as
payment_intent_id by POST /payments/create-intent.

Safe to retry: a PaymentIntent whose donation is already paid is
returned as-is rather than double-counted. Stripe webhooks reconcile the
same donation independently, so a client that never reaches this call
still ends up with a settled donation — calling it just makes the
receipt available immediately.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)
or

Request Body​

application/json
JSON
{
"payment_intent_id": "pi_3abc123def456"
}

Responses​

Payment confirmed; the settled donation is returned.

application/json
JSON
{
"data": {
"id": "string",
"fundraiser_id": "string",
"donor_user_id": "string",
"donor_name": "string",
"donor_avatar": "string",
"amount_cents": 5000,
"currency": "USD",
"tip_amount_cents": 500,
"fee_amount_cents": 175,
"net_amount_cents": 4825,
"payment_status": "string",
"payment_provider": "string",
"payment_intent_id": "string",
"receipt_id": "string",
"comment": "string",
"is_anonymous": true,
"anonymous_key": "string",
"created_at": "string",
"campaign_title": "string",
"campaign_slug": "string",
"card_brand": "string",
"card_last4": "string",
"payment_method_type": "string"
}
}

Playground​

Server
Authorization
Body

Samples​

Powered by VitePress OpenAPI

Built with VitePress