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

# Update billing info

> Set the billing contact, delivery emails, address, and tax ID for your invoices

`PUT /api/v2/billing/info`

Updates the billing (payer) info Apostra invoices you with. Admin-only. Send at
least one field; omitted fields are left unchanged. The response returns the
full updated record. At minimum, Apostra needs a payer name (`contactName`) and
a payer address (`address`, `city`, `countryAlpha2`) to issue an invoice — set
both before your first billing cycle. Also available in the UI under
**Account settings → Plan & Billing → Payment & invoices**.

## Request

```bash curl theme={null}
curl -X PUT https://api.apostra.com/api/v2/billing/info \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contactName": "Dana Whitfield",
    "email": ["ap@bluepeakbrands.example"],
    "ccEmails": ["finance@bluepeakbrands.example"],
    "phone": "+1 415 555 0182",
    "address": "225 Mission St",
    "address2": "Floor 8",
    "city": "San Francisco",
    "region": "CA",
    "postalCode": "94105",
    "countryAlpha2": "US",
    "taxId": "83-1234567"
  }'
```

## Parameters

| Field | Type | Required | Notes |
| - | - | - | - |
| `contactName` | string | No\* | Billing contact / payer name (1–255). \*Needed before an invoice can be issued |
| `email` | array | No | Up to 10 email addresses invoices are sent to |
| `ccEmails` | array | No | Up to 10 email addresses CC'd on invoices |
| `phone` | string | No | Billing phone number (max 64) |
| `address` | string | No\* | Billing street address, line 1 (max 255). \*Needed before an invoice can be issued |
| `address2` | string | No | Billing street address, line 2 (max 255) |
| `city` | string | No | Billing city (max 128) |
| `region` | string | No | State/province/region (max 128) |
| `postalCode` | string | No | Postal/ZIP code (max 32) |
| `countryAlpha2` | string | No | ISO 3166-1 alpha-2, uppercase (e.g. `US`) |
| `taxId` | string | No | Tax/VAT identifier shown on invoices (max 64) |
| `paymentTerms` | string | No | Payment terms to ask sellers for: `net_15`, `net_30`, `net_45`, `net_60`, or `net_90`. Unlike the other fields, `null` is refused: the choice can be changed but not cleared, so to use the default terms, send them. Send it on its own, without other fields. See [Payment terms](/v2/buyer/account/setup#payment-terms) |

## Response

```json theme={null}
{
  "billingInfo": {
    "contactName": "Dana Whitfield",
    "email": ["ap@bluepeakbrands.example"],
    "ccEmails": ["finance@bluepeakbrands.example"],
    "phone": "+1 415 555 0182",
    "address": "225 Mission St",
    "address2": "Floor 8",
    "city": "San Francisco",
    "region": "CA",
    "postalCode": "94105",
    "countryAlpha2": "US",
    "taxId": "83-1234567"
  }
}
```

The response mirrors [Get billing info](/v2/buyer/billing/tasks/get-billing-info)
after the update.

## Errors

* `400 VALIDATION_ERROR` — a malformed email in `email`/`ccEmails`, a lowercase
  or non-ISO `countryAlpha2`, or an empty body (at least one field is required).
  Also returned, with `field: "paymentTerms"`, when `paymentTerms` is `null`,
  is sent with other fields, or is sent before choosing payment terms is
  available for your organization.
* `401 UNAUTHORIZED` — missing or invalid bearer token.
* `403 FORBIDDEN` — the caller is not an admin of the account.

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

## Related

<CardGroup cols={2}>
  <Card title="Get billing info" href="/v2/buyer/billing/tasks/get-billing-info" icon="address-card">
    Read the details on file
  </Card>

  <Card title="Billing overview" href="/v2/buyer/billing/overview" icon="file-invoice-dollar">
    How invoicing and remittance work
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.