> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Assert billing readiness

> Confirm a direct-billed buyer is billable before their account can transact

`POST /api/v2/storefront/account-mappings/relationships/{relationshipId}/ready-to-invoice`

Accepting or linking a buyer account decides *admission* — whether the buyer
gets in at all. It does not decide *billing readiness* — whether you can
actually invoice them. For **operator** or **advertiser** billing, those are
two separate facts: your finance system (CRM, ERP, a staff member, or an
external workflow) has to say the buyer is billable before their account can
place direct-billed media buys. **Agent** billing (Interchange settlement)
never needs this — Interchange handles collection, not you.

Until that assertion exists, an operator/advertiser-billed account stays
`pending_approval` even after you've accepted it or linked it to an existing
account — no account is created until readiness exists. Your accept/link
decision is remembered; asserting readiness completes it immediately,
activating the account without you having to decide again.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.interchange.io/api/v2/storefront/account-mappings/relationships/512/ready-to-invoice \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "invoiceParty": "operator",
      "billingEntity": { "legal_name": "Acme Media Ltd" },
      "authority": "erp",
      "evidence": { "reference": "ERP-88213" }
    }'
  ```
</CodeGroup>

## Parameters

| Field            | Type                                                     | Required | Notes                                                                                                                                                                                     |
| ---------------- | -------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `relationshipId` | string (path)                                            | Yes      | The account relationship id, from `GET /account-mappings` or the `accountId`'s owning relationship.                                                                                       |
| `invoiceParty`   | `operator` \| `advertiser`                               | Yes      | Which party this assertion covers. A relationship can have at most one active assertion per party at a time — a new one automatically supersedes the prior active one for the same party. |
| `billingEntity`  | object                                                   | Yes      | The legal entity being invoiced (same shape as the `link_existing` decision's `billingEntity`).                                                                                           |
| `authority`      | `crm` \| `erp` \| `finance_staff` \| `external_workflow` | Yes      | Where this fact came from. Creating a CRM account or native advertiser is never itself an assertion — only your configured authority explicitly returning one counts.                     |
| `evidence`       | object                                                   | No       | A bounded reference (for example a finance-system record id) or short note. Never a document or payment instrument.                                                                       |
| `validUntil`     | string (ISO 8601 datetime)                               | No       | Optional expiry after which the assertion is no longer active. Omit for no expiry.                                                                                                        |

## Response

`200 OK` with the created assertion:

```json theme={null}
{
  "id": "331",
  "relationshipId": "512",
  "invoiceParty": "operator",
  "billingEntity": { "legal_name": "Acme Media Ltd" },
  "authority": "erp",
  "evidence": { "reference": "ERP-88213" },
  "state": "active",
  "validFrom": "2026-08-29T20:25:04.000Z",
  "validUntil": null,
  "supersedesId": null,
  "createdAt": "2026-08-29T20:25:04.000Z",
  "createdBy": "ops@example-seller.com"
}
```

## Errors

* `400 VALIDATION_ERROR` — `invoiceParty` is missing or not `operator`/`advertiser`, or `billingEntity` failed validation.
* `401 UNAUTHORIZED` — missing or invalid API key.
* `404 NOT_FOUND` — no account relationship with this id under your storefront.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Revoke billing readiness" href="/v2/storefront/buyer-account-mapping/tasks/revoke-ready-to-invoice" icon="ban">
    Withdraw a confirmation that stopped being true
  </Card>

  <Card title="Recover a billing-readiness assertion" href="/v2/storefront/buyer-account-mapping/tasks/list-ready-to-invoice" icon="magnifying-glass-dollar">
    Find the assertion id for an account that's already active
  </Card>

  <Card title="Buyer Account Mapping" href="/v2/storefront/buyer-account-mapping" icon="diagram-project">
    The review queue, whose `billingGate` field reflects this state
  </Card>
</CardGroup>
