RevKeenDocs

Mark invoices as already delivered

Bulk-mark a set of imported invoices as already delivered to customers (e.g., invoices that were emailed by PracticeHub or another external system). Writes delivered_to_customer_at = NOW() for each invoice and transitions imported → approved. Timestamp is always server-controlled — merchant-supplied backdating is not allowed to prevent reminder-ladder flooding. Request is rejected atomically if any invoice ID does not belong to the authenticated merchant.


Related endpoints

  • PUT /invoices/external/batch — Batch upsert invoices by external ID
  • GET /invoices — List invoices
  • POST /invoices — Create invoice
  • GET /invoices/{id} — Get invoice
  • PATCH /invoices/{id} — Update invoice
  • DELETE /invoices/{id} — Delete invoice
  • POST /invoices/{id}/refund — Refund invoice
  • POST /invoices/{id}/reject — Reject invoice

Common errors

  • 400 invalid_request — malformed payload or failed validation.
  • 403 permission_denied — key lacks the required scope, or the resource belongs to a different merchant.

Idempotency

Pass an Idempotency-Key header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see the idempotency guide.

POST
/invoices/mark-delivered
x-api-key<token>

Your RevKeen API key (powered by Unkey). Get it from Dashboard > Settings > API Keys. Use rk_sandbox_* for test mode and rk_live_* for production.

In: header

Request Body

application/json

Mark-delivered request

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://api.revkeen.com/v2/invoices/mark-delivered" \  -H "x-api-key: $REVKEEN_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "invoice_ids": [      "00000000-0000-0000-0000-000000000000"    ]  }'
{
  "success": true,
  "marked_delivered": 0,
  "reminder_eligible_now": 0,
  "reminder_eligible_within_7_days": 0,
  "skipped": [
    {
      "invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32",
      "reason": "string"
    }
  ],
  "requestId": "string"
}
Empty
Empty