---
title: "Mark Invoice Ready"
method: POST
path: "/api/v1/admin/block/s3-invoices/mark-ready"
tags: ["Admin APIs", "block-s3-invoices"]
---

# Mark Invoice Ready

`POST /api/v1/admin/block/s3-invoices/mark-ready`

Lock one held invoice's applied S3 tokens. **Does not send it, and is not what sends it.**

The daily pass finalizes and emails every held invoice on its send date, locked or not
(PRO-3535). What this changes is who may still alter the applied tokens before then: a locked
invoice leaves the client's Next Billing surface, so this is how an operator makes an override
stick. To send *now*, call ``/send-now``, which exists as a separate endpoint precisely
because that send cannot be undone.

Outstanding S3 credits are written to Stripe as part of this call, since an override is the
usual reason to lock and leaves exactly the state the guard below refuses on. Still refused
with 409 ``invoice_not_ready`` when a credit write is awaiting confirmation from Stripe, or
when writing it here did not succeed — locking over an uncredited invoice would let it go out
at full price while the client's tokens are consumed against a discount never given.

## Request body

- BlockInvoiceMarkReadyRequest — Lock one held invoice's applied S3 tokens. Never sends it, and is not what makes it send — every held invoice goes out on its own send date. See the send-now request to bring that forward.
  - `block_invoice_draft_id` string, uuid, required

## Response `200`

Successful Response

- BlockInvoiceReviewRow — The review state of one held Block invoice, for E3's Upcoming Invoices tab. Deliberately carries no payment fields. ``state`` answers "where is this in our own flow", ``payment_state`` answers "does the customer owe us money", and a draft is emphatically not money owed — merging the two would put "Overdue" on an invoice the customer has never been shown.
  - `id` string, uuid, required
  - `stripe_invoice_id` string, required
  - `client_id` string, uuid, required
  - `period_seq` integer, nullable
  - `state` string, required
  - `send_date` string, date-time, nullable
  - `edit_window_days` integer, required
  - `approval_overdue_at` string, date-time, nullable
  - `marked_ready_at` string, date-time, nullable
  - `marked_ready_by` string, nullable
  - `finalized_at` string, date-time, nullable
  - `sent_at` string, date-time, nullable
  - `positive_subtotal_cents` integer, nullable
  - `tokens_applied_cents` integer, nullable
  - `net_cents` integer, nullable
  - `manual_override_at` string, date-time, nullable
  - `manual_override_by` string, nullable
  - `manual_override_reason` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/carbonarc/apis/carbon-arc-client-admin-api.md) · [All operations](https://skmtc.net/carbonarc/apis/carbon-arc-client-admin-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/carbonarc/carbon-arc-client-admin-api/revisions/a8ca30023371/schema)
