---
title: "Settle a saved card"
method: POST
path: "/v1/orgs/{orgId}/billing/setup-intent/{setupIntentId}/complete"
tags: ["Billing"]
---

# Settle a saved card

`POST /v1/orgs/{orgId}/billing/setup-intent/{setupIntentId}/complete`

## Request

- Base URL: `https://api.openrelay.inc`
- URL: `https://api.openrelay.inc/v1/orgs/{orgId}/billing/setup-intent/{setupIntentId}/complete`
- Auth: HTTP bearer

Called right after stripe.confirmSetup succeeds. Settles the card the SetupIntent saved and reports whether it was saved, refused, or held.
Settlement runs once: a card tied to fraud, or a second card the bank did not verify when it was asked to, puts the account on hold (held, ACCOUNT_PENDING_VERIFICATION); a card the bank did not verify is removed (refused, CARD_NOT_VERIFIED); any other card becomes the account's default (saved). Calling it again, or after the Stripe webhook settled the card, answers the same outcome and changes nothing.

Requires the `billing.manage` permission. See [Permissions](https://docs.openrelay.inc/docs/permissions) for the roles and API key permissions that include it.

## Path parameters

- `orgId` string, required
- `setupIntentId` string, required

## Response `200`

How the card was settled

- SetupIntentCompletion
  - `code` 'CARD_NOT_VERIFIED' | 'ACCOUNT_PENDING_VERIFICATION': Why the card was not kept. Absent for a saved card.
  - `message` string, required: What to show the customer.
  - `status` 'saved' | 'refused' | 'held', required: saved: the card is the account's default. refused: the card was removed; add a different one. held: the card was removed and the account is on a verification hold.

## Other responses

- `401`: Missing or invalid API key
- `403`: The caller is authenticated but may not do this. The caller's role or the API key's permissions do not allow it, or the request targets another organization (FORBIDDEN, or NOT_A_MEMBER for a session); a permission denial also names the action it needed (permission), which kind of policy denied it (deniedBy) and the deciding policy ids (policies). Or the organization is suspended pending review (ORG_SUSPENDED) or has been deleted (ORG_DISABLED). A new API key or a wider scope clears neither of the last two; see [Account and balance refusals](https://docs.openrelay.inc/docs/errors#account-and-balance-refusals). A user session whose email address is not confirmed is refused on every operation (EMAIL_UNVERIFIED); confirm the address from the confirmation email, then sign in again.
- `404`: The SetupIntent does not exist or is not this organization's (SETUP_INTENT_NOT_FOUND).
- `409`: The SetupIntent has not succeeded yet (SETUP_INCOMPLETE).
- `503`: A required integration (e.g. payments) is not configured

## Changes

- **2026-10-26** `7fe59d94a9f5`: 5 info
  - added the optional property `requestId` to the response with the `401` status
  - added the optional property `requestId` to the response with the `403` status
  - added the optional property `requestId` to the response with the `404` status
  - added the optional property `requestId` to the response with the `409` status
  - …1 more
- **2026-10-10** `12b2fcbcc298`: 15 info
  - added the optional property `deniedBy` to the response with the `401` status
  - added the optional property `deniedBy` to the response with the `403` status
  - added the optional property `deniedBy` to the response with the `404` status
  - added the optional property `deniedBy` to the response with the `409` status
  - …11 more
- **2026-10-06** `1eb2b3fc2024`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/openrelay/apis/openrelay-api/changes/v1/orgs/:orgId/billing/setup-intent/:setupIntentId/complete/post.md)

---

[API](https://skmtc.dev/openrelay/apis/openrelay-api.md) - [All operations](https://skmtc.dev/openrelay/apis/openrelay-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openrelay/apis/openrelay-api/revisions/7fe59d94a9f5?raw)
