# Submit an invoice

> Submits an invoice as structured fields for a creator you've already added. It waits for review in StrideHQ like an invoice uploaded there, and is matched to your purchase orders. Nothing is approved through the API. Uploading the invoice file through the API is coming later. `Idempotency-Key` is required.

```
POST https://api.sandbox.stridehq.ai/v1/invoices
```


Scope: `invoices:write`

## Headers

| Name | Type | Required | Description |
|---|---|---|---|
| `Idempotency-Key` | string | Yes | A unique value, such as a UUID. The same key and body within 24 hours returns the original response. |

## Body

| Name | Type | Required | Description |
|---|---|---|---|
| `creator_id` | string | Yes | The creator who sent the invoice. Add them first with Create a creator. |
| `invoice_number` | string | Yes | Up to 100 characters. Unique per creator. |
| `invoice_date` | string (date) | No |  |
| `due_date` | string (date) | No |  |
| `po_number` | string | No | Matched against your purchase orders. |
| `description` | string | No |  |
| `net_amount` | integer | No | Minor units. Optional; if you send it with vat_amount, they must add up to total_amount. |
| `vat_amount` | integer | No | Minor units. Optional; 0 if neither it nor net_amount is sent. |
| `total_amount` | integer | Yes | Minor units. |
| `currency` | string | Yes | ISO 4217. |
| `external_id` | string | No | Your own reference, up to 100 characters. Unique in your organisation. |
| `metadata` | object | No | Up to 20 string keys (up to 40 characters) and values (up to 500 characters), for your use. StrideHQ never reads them. Send null to clear it. |

## Responses

- **201**: The invoice, `in_review`.
- **400**: `unknown_field`, `invalid_parameter` (including a `creator_id` that isn't in your organisation), `idempotency_key_required`, `invalid_json` or `invalid_content_type`.
- **401**: `missing_api_key`, `invalid_api_key`, `revoked_api_key` or `wrong_environment`.
- **409**: `duplicate_invoice` (the same creator and invoice number) or `external_id_exists` (`error.existing_id` is the existing invoice's id), or `idempotency_key_reused` or `idempotency_key_in_use`.
- **422**: `currency_not_supported`.

```json
{
  "id": "inv_4b1e7d2a9c3f4e5d8a6b0c1d2e3f4a5b",
  "object": "invoice",
  "creator_id": "cre_8f3a2c1d9b7e4f60a1b2c3d4e5f60718",
  "invoice_number": "MC-0042",
  "invoice_date": "2026-10-10",
  "due_date": "2026-11-09",
  "purchase_order_id": "po_2d4f6a8b0c1e3a5b7d9f1a2b3c4d5e6f",
  "po_match": "matches",
  "description": "Autumn campaign, 3 videos",
  "net_amount": 250000,
  "vat_amount": 0,
  "total_amount": 250000,
  "currency": "GBP",
  "status": "approved",
  "action_required_reason": null,
  "rejection_reason": null,
  "payment_run_id": null,
  "payment_id": null,
  "has_file": true,
  "external_id": null,
  "metadata": {},
  "created_at": "2026-10-10T11:20:00Z",
  "updated_at": "2026-10-12T08:45:00Z"
}
```
