Invoices

Invoices are Flint's receivables resource. Every invoice is backed by an order: create one from an existing open order, or use quick pay input and Flint creates the backing order internally. A draft's snapshot.merchant_display_name shows your current business name. When you send an invoice, Flint freezes the customer-facing billing content, including that name, into a snapshot, issues a stable, revocable hosted invoice link, and emails the recipient.

Invoice status lifecycleStartFinal
  • draft moves to open on issue
  • draft moves to void on void
  • open moves to paid on full payment
  • open moves to partially_paid on partial payment
  • partially_paid moves to paid on balance paid
  • open moves to uncollectible on write off balance
  • open moves to credited on credit balance

credited is the one status that can move backward. Credit reaches an invoice through a credit note, and reversing that allocation reopens the invoice to open or partially_paid. paid, void, and uncollectible are final.

An invoice moves from draft to open on send, then to partially_paid or paid as money comes in, uncollectible if you write the balance off, credited if a credit note closes it, or void if you cancel it. Collection can be online (an invoice-owned hosted checkout session for card payment) or offline via manual payments for checks, cash, wires, and other external methods. Delivery attempts, reminders, activities, and PDFs are all tracked on the invoice itself, and payment activity publishes webhook events.

Issuing an invoice also schedules its follow-up. Flint sends reminders on the cadence in invoices.reminder_policy, marks the invoice overdue, raises a late fee notice when the payment terms carry one, and retries a saved card on invoices.autopay_retry_policy. Set late_fee_policy.application_mode on a payment term to automatic to apply its fee after the grace period. The default is manual, which emits the notice without changing the balance. Automatic fees apply once per invoice or installment, wait for resolving payments, and send a buyer notice when invoice email delivery is enabled. Changes to a payment term affect future invoices only. POST /v1/invoices/{invoice_id}/late-fees also assesses the frozen policy onto the balance, and POST /v1/invoices/{invoice_id}/late-fees/{invoice_late_fee_id}/waive waives the unpaid remainder. Each assessment lands in late_fees with its calculation inputs, assessed amount, and outstanding amount, and the issued line items, tax, and total stay fixed. reminders_paused reports whether the automatic reminders are paused, and reminders_paused_at records when. After issue, reminders_paused is the only field PATCH accepts: set it to true to pause reminders on an open or partially paid invoice and false to resume them. Each line in snapshot.line_items carries an invoice_line_item_id, which is what a credit note credits.

See the Invoicing guide for an end-to-end walkthrough, Credit notes for correcting an issued invoice, and Payment links vs checkout sessions vs invoices for choosing the right collection surface.

Automatic tax narrows the payment schedule. An automatic tax invoice takes one payment for its full balance, and editing the backing order after issue blocks collection until you void and reissue. See Tax on an invoice.

Create an invoice with schedule_entries to author its payment schedule, or omit the array to use the default derived from its terms. On draft PATCH, include the invoice's last-read version as expected_version when replacing the schedule. Include invoice_schedule_entry_id to retain an entry and omit it to create one. Omission leaves the schedule unchanged, [] clears the authored schedule, and null is invalid. The complete schedule must satisfy the invoice's amount and due-date rules, with at most 14 entries. Scalar edits and schedule changes succeed together. A stale version returns INVOICE_DRAFT_CHANGED.

Manual payments on gift card purchase lines issue each card when its full price has been paid. Partial payments retain their contribution until a whole card can be issued. Invoice late fees do not fund gift card value. Reversing a manual payment removes the value backed by that payment. If that value has been spent or reserved, the reversal returns a conflict and the payment stays recorded. Gift card load responses identify a manual reversal through purchase_refunds[].order_manual_reversal_id.

Invoice responses include version. You can also send expected_version when issuing, voiding, marking an invoice uncollectible, setting reminders_paused, regenerating its public link, or recording or reversing a manual payment. Use the version returned by the latest successful write for the next edit.

The Invoice object#

Every field on an invoice, as returned by retrieve and carried by the endpoints below.

Attributes

calculationone ofRequired
created_atstringRequired

RFC3339 timestamp.

external_reference_idstring

Caller-owned identifier for this resource in an external system.

invoice_payment_term_idstringRequired
late_fee_policyone of
merchant_idstringRequired
namestringRequired
statusenumRequired
  • active
  • archived
updated_atstringRequired

RFC3339 timestamp.

versionintegerRequired

List invoice payment terms#

GET/v1/invoice-payment-terms

Requires scope commerce.invoices.read or commerce.invoices.write

Returns a paginated list of invoice payment terms for the authenticated merchant.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

statusenum

Filter by payment term status.

  • active
  • archived
external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

querystring

Search across invoice payment term ID, external reference ID, and name. Text fields match any part of the value, and %, _ and \ are ordinary characters, not wildcards. IDs match from the start and need the type prefix, such as ord_01.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/invoice-payment-terms \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Create invoice payment term#

POST/v1/invoice-payment-termsIdempotent

Requires scope commerce.invoices.write

Create invoice payment term for the authenticated merchant.

Request body

calculationone ofRequired
external_reference_idstring

Caller-owned identifier for this resource in an external system.

late_fee_policyone of
namestringRequired

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/invoice-payment-terms \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "calculation": {
      "type": "on_receipt"
    },
    "name": ""
  }'
curl https://api.withflintpay.com/v1/invoice-payment-terms/{invoice_payment_term_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Update invoice payment term#

PATCH/v1/invoice-payment-terms/{invoice_payment_term_id}Idempotent

Requires scope commerce.invoices.write

Update invoice payment term for the authenticated merchant.

Path parameters

invoice_payment_term_idstringRequired

Flint invoice payment term ID.

Request body

calculationone of
expected_versioninteger

Optional version last read by the caller.

external_reference_idstring

Caller-owned identifier for this resource in an external system.

late_fee_policyone of or null
namestring

Response · 200

Same response as Create invoice payment term.

curl -X PATCH https://api.withflintpay.com/v1/invoice-payment-terms/{invoice_payment_term_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "calculation": {
      "type": "on_receipt"
    },
    "expected_version": 0,
    "external_reference_id": "",
    "late_fee_policy": {
      "grace_period_days": 0,
      "type": "fixed"
    },
    "name": ""
  }'
curl -X DELETE https://api.withflintpay.com/v1/invoice-payment-terms/{invoice_payment_term_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

List invoices#

GET/v1/invoices

Requires scope commerce.invoices.read or commerce.invoices.write

Returns a paginated list of invoices for the authenticated merchant.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

statusarray of enum

Filter by invoice status. Repeat the parameter or pass comma-separated values to match multiple statuses.

  • draft
  • open
  • partially_paid
  • paid
  • void
  • uncollectible
  • credited
customer_idstring

Filter by Flint customer ID.

order_idstring

Filter by Flint order ID.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

created_afterstring

RFC3339 lower bound for created_at.

created_beforestring

RFC3339 upper bound for created_at.

due_afterstring

RFC3339 lower bound for due_at.

due_beforestring

RFC3339 upper bound for due_at.

is_overdueboolean

Filter by whether the invoice is overdue.

has_amount_dueboolean

Filter by whether the invoice has a remaining amount due.

sort_byenum

Sort field.

  • created_at
  • updated_at
  • due_at
  • invoice_number
  • outstanding_money
sort_directionenum

Sort direction.

  • asc
  • desc
querystring

Search across invoice_id, invoice_number, external_reference_id, recipient_email, reference, and the customer name and email on the invoice. Text fields match any part of the value, and %, _ and \ are ordinary characters, not wildcards. IDs match from the start and need the type prefix, such as ord_01.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/invoices \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "cc_emails": [
        "owner@example.com"
      ],
      "collection_block_status": "",
      "collection_mode": "buyer_initiated",
      "created_at": "2026-03-21T15:03:00Z",
      "credit_money": {
        "amount": 0,
        "currency": "USD"
      },
      "currently_due_money": {
        "amount": 15000,
        "currency": "USD"
      },
      "customer_id": "cus_01J00000000000000000000000",
      "delivery_mode": "email",
      "due_at": "2026-03-31T23:59:59Z",
      "invoice_id": "inv_01J00000000000000000000000",
      "invoice_number": "1042",
      "is_overdue": false,
      "issued_at": "2026-03-21T15:04:05Z",
      "late_fees": null,
      "merchant_id": "mer_01J00000000000000000000000",
      "order_id": "ord_01J00000000000000000000000",
      "outstanding_money": {
        "amount": 15000,
        "currency": "USD"
      },
      "paid_money": {
        "amount": 0,
        "currency": "USD"
      },
      "recipient_email": "buyer@example.com",
      "reference": "PO-1042",
      "refund_status": "none",
      "refunded_money": {
        "amount": 0,
        "currency": "USD"
      },
      "reminders_paused": false,
      "snapshot": {
        "buyer_tax_identity": null,
        "customer_display_name": "Avery Buyer",
        "customer_email": "buyer@example.com",
        "line_items": [
          {
            "base_subtotal_money": {
              "amount": 15000,
              "currency": "USD"
            },
            "discount_money": {
              "amount": 0,
              "currency": "USD"
            },
            "invoice_line_item_id": "",
            "modifier_total_money": {
              "amount": 0,
              "currency": "USD"
            },
            "name": "Consulting session",
            "quantity": 1,
            "subtotal_money": {
              "amount": 15000,
              "currency": "USD"
            },
            "tax_money": {
              "amount": 0,
              "currency": "USD"
            },
            "total_money": {
              "amount": 15000,
              "currency": "USD"
            },
            "unit_price_money": {
              "amount": 15000,
              "currency": "USD"
            }
          }
        ],
        "memo": "Payment due within 10 days.",
        "merchant_display_name": "Flint Services",
        "pricing_amounts": {
          "charge_money": {
            "amount": 0,
            "currency": "USD"
          },
          "discount_money": {
            "amount": 0,
            "currency": "USD"
          },
          "requested_tip_money": {
            "amount": 0,
            "currency": "USD"
          },
          "subtotal_money": {
            "amount": 15000,
            "currency": "USD"
          },
          "tax_money": {
            "amount": 0,
            "currency": "USD"
          },
          "total_money": {
            "amount": 15000,
            "currency": "USD"
          }
        },
        "seller_tax_identity": null
      },
      "status": "open",
      "updated_at": "2026-03-21T15:04:05Z",
      "version": 1,
      "written_off_money": {
        "amount": 0,
        "currency": "USD"
      }
    }
  ],
  "next_page_token": "example",
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Create invoice draft#

POST/v1/invoicesIdempotent

Requires scope commerce.invoices.write

Creates an invoice draft. Provide exactly one source: order_id for an order-backed draft, or quick_pay for a hidden backing-order draft.

Request body

Send exactly one of these

cc_emailsarray of string
collectionone of
external_reference_idstring

Caller-owned identifier for this resource in an external system.

footerstring
memostring
metadatamap of string
order_idstringRequired
payment_dueone of
po_numberstring
quick_payobject
recipient_emailstring
referencestring
remit_to_addressobject
schedule_entriesarray of one of

Complete draft payment schedule with at most 14 entries. Omission preserves the current or default schedule; [] clears the authored schedule. Null is not accepted. On PATCH, include invoice_schedule_entry_id to retain an entry and expected_version to detect concurrent edits.

scheduled_send_atstring

RFC3339 timestamp.

service_atstring

RFC3339 timestamp.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/invoices \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "collection": {
      "mode": "buyer_initiated",
      "payment_policy": {
        "enabled_payment_options": [
          "card",
          "ach_debit"
        ]
      }
    },
    "memo": "Payment due within 10 days.",
    "payment_due": {
      "due_at": "2026-03-31T23:59:59Z",
      "type": "absolute"
    },
    "quick_pay": {
      "customer_id": "cus_01J00000000000000000000000",
      "line_items": [
        {
          "name": "Consulting session",
          "quantity": 1,
          "unit_price_money": {
            "amount": 15000,
            "currency": "USD"
          }
        }
      ]
    },
    "recipient_email": "buyer@example.com",
    "reference": "PO-1042"
  }'

Get invoice#

GET/v1/invoices/{invoice_id}

Requires scope commerce.invoices.read or commerce.invoices.write

Returns a single invoice by ID.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Query parameters

expandarray of enum

Supported expansions: customer, order. Expansion requires commerce.invoices.read plus the read scope for each expanded resource. Limits: at most 10 unique expand paths per request; path depth at most 2. Repeat expand, for example expand=customer&expand=order, or pass one comma-separated value.

  • customer
  • order

Response · 200

Same response as Create invoice draft.

curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "cc_emails": [
      "owner@example.com"
    ],
    "collection_block_status": "",
    "collection_mode": "buyer_initiated",
    "created_at": "2026-03-21T15:03:00Z",
    "credit_money": {
      "amount": 0,
      "currency": "USD"
    },
    "currently_due_money": {
      "amount": 15000,
      "currency": "USD"
    },
    "customer_id": "cus_01J00000000000000000000000",
    "delivery_mode": "email",
    "due_at": "2026-03-31T23:59:59Z",
    "invoice_id": "inv_01J00000000000000000000000",
    "invoice_number": "1042",
    "is_overdue": false,
    "issued_at": "2026-03-21T15:04:05Z",
    "late_fees": null,
    "merchant_id": "mer_01J00000000000000000000000",
    "order_id": "ord_01J00000000000000000000000",
    "outstanding_money": {
      "amount": 15000,
      "currency": "USD"
    },
    "paid_money": {
      "amount": 0,
      "currency": "USD"
    },
    "recipient_email": "buyer@example.com",
    "reference": "PO-1042",
    "refund_status": "none",
    "refunded_money": {
      "amount": 0,
      "currency": "USD"
    },
    "reminders_paused": false,
    "snapshot": {
      "buyer_tax_identity": null,
      "customer_display_name": "Avery Buyer",
      "customer_email": "buyer@example.com",
      "line_items": [
        {
          "base_subtotal_money": {
            "amount": 15000,
            "currency": "USD"
          },
          "discount_money": {
            "amount": 0,
            "currency": "USD"
          },
          "invoice_line_item_id": "",
          "modifier_total_money": {
            "amount": 0,
            "currency": "USD"
          },
          "name": "Consulting session",
          "quantity": 1,
          "subtotal_money": {
            "amount": 15000,
            "currency": "USD"
          },
          "tax_money": {
            "amount": 0,
            "currency": "USD"
          },
          "total_money": {
            "amount": 15000,
            "currency": "USD"
          },
          "unit_price_money": {
            "amount": 15000,
            "currency": "USD"
          }
        }
      ],
      "memo": "Payment due within 10 days.",
      "merchant_display_name": "Flint Services",
      "pricing_amounts": {
        "charge_money": {
          "amount": 0,
          "currency": "USD"
        },
        "discount_money": {
          "amount": 0,
          "currency": "USD"
        },
        "requested_tip_money": {
          "amount": 0,
          "currency": "USD"
        },
        "subtotal_money": {
          "amount": 15000,
          "currency": "USD"
        },
        "tax_money": {
          "amount": 0,
          "currency": "USD"
        },
        "total_money": {
          "amount": 15000,
          "currency": "USD"
        }
      },
      "seller_tax_identity": null
    },
    "status": "open",
    "updated_at": "2026-03-21T15:04:05Z",
    "version": 1,
    "written_off_money": {
      "amount": 0,
      "currency": "USD"
    }
  },
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Update invoice#

PATCH/v1/invoices/{invoice_id}Idempotent

Requires scope commerce.invoices.write

Updates mutable fields on a draft invoice. After issue, the only writable field is reminders_paused, which pauses or resumes automatic reminders on an open or partially paid invoice.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

cc_emailsarray of string
collectionone of
expected_versioninteger

Invoice version last read. Required when schedule_entries is present.

external_reference_idstring

Caller-owned identifier for this resource in an external system.

footerstring
memostring
metadatamap of string or null

Caller-owned metadata. Omit this field to leave metadata unchanged. Send an object to merge by key, set a key to null to remove it, or set metadata to null to clear all metadata. An empty object makes no change. Empty strings are stored. Keys starting with flint_ are reserved and cannot be written through the public API.

payment_dueone of
po_numberstring
recipient_emailstring
referencestring
reminders_pausedboolean

Pauses (true) or resumes (false) the automatic reminder cadence. Accepted only on an open or partially paid invoice with a balance remaining, and only alone or with expected_version: every other field is draft-only. While paused, manual send-reminder calls still work, and invoice.overdue and invoice.late_fee_due still fire. On resume, reminder times that passed while paused do not fire. Sending the current value succeeds without changing the invoice.

remit_to_addressobject
schedule_entriesarray of one of

Complete draft payment schedule with at most 14 entries. Omission preserves the current or default schedule; [] clears the authored schedule. Null is not accepted. On PATCH, include invoice_schedule_entry_id to retain an entry and expected_version to detect concurrent edits.

scheduled_send_atstring

RFC3339 timestamp.

service_atstring

RFC3339 timestamp.

Response · 200

Same response as Create invoice draft.

curl -X PATCH https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "cc_emails": [
      "owner@example.com"
    ],
    "memo": "Updated delivery instructions.",
    "recipient_email": "accounts-payable@example.com"
  }'

List invoice activities#

GET/v1/invoices/{invoice_id}/activities

Requires scope commerce.invoices.read or commerce.invoices.write

Returns a read-only history of an invoice for timelines and debugging, newest first. Use sort_direction=asc for chronological order. Read the invoice and the resources each row references for authoritative state.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

sort_directionenum

Sort direction. Defaults to desc, newest first.

  • asc
  • desc
typearray of enum

Filter by activity type. Repeat the parameter or pass comma-separated values to OR multiple types.

  • draft_created
  • issued
  • sent
  • delivery_sent
  • reminder_sent
  • viewed
  • payment_attempt_started
  • payment_applied
  • manual_payment_recorded
  • manual_payment_reversed
  • refund_succeeded
  • voided
  • token_regenerated
  • collection_blocked
  • collection_block_resolved
  • updated
  • marked_uncollectible
  • payment_processing
  • issue_failed
  • overdue
  • reminder_due
  • late_fee_due
  • late_fee_assessed
  • late_fee_waived
  • credited

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/activities \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "activity_type": "payment_applied",
      "actor_type": "system",
      "amount_money": {
        "amount": 12500,
        "currency": "USD"
      },
      "created_at": "2026-03-24T10:12:00Z",
      "description": "Card payment applied",
      "invoice_activity_id": "inevt_01J00000000000000000000001",
      "payment_intent_id": "pi_01J00000000000000000000000"
    },
    {
      "activity_type": "delivery_sent",
      "actor_id": "mer_01J00000000000000000000000",
      "actor_type": "merchant",
      "channel": "email",
      "created_at": "2026-03-21T15:04:05Z",
      "description": "Invoice email sent",
      "invoice_activity_id": "inevt_01J00000000000000000000000",
      "invoice_delivery_attempt_id": "indel_01J00000000000000000000000",
      "to_email": "buyer@example.com"
    }
  ],
  "next_page_token": "example",
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Get or create invoice checkout collection#

POST/v1/invoices/{invoice_id}/checkout-sessionIdempotent

Requires scope commerce.invoices.write

Returns the current open invoice checkout session and aligned card attempt when they still match the invoice balance and collection run. A newly created session and attempt share the fixed expiration of the active invoice public-link generation. Unexpired sessions are reused regardless of remaining lifetime; active payment work returns a resolving conflict instead of creating competing collection. When the invoice's order has items to deliver, a new session offers the delivery methods in settings.checkout.default_delivery_method_ids, and the request fails with a validation error when those methods cannot deliver every item. return_url sets where the checkout sends the buyer after paying. A reused session takes a new return_url only until a payment starts on it, and keeps the one it has after that.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

invoice_schedule_entry_idstring
page_originstring

Origin of the page where you render this embedded checkout, such as https://shop.example.com. Only this origin can show the checkout's gift card challenge and receive its result. It does not let the browser call the Flint API. Accepted only when surface is embedded. Use HTTPS and a lowercase DNS hostname. Do not include a path, query, fragment, or default port. In test mode, localhost, names ending in .localhost, and 127.0.0.1 also work over HTTP or HTTPS.

redirectsobject

Buyer destinations. Embedded checkout requires success_redirect_url when a redirect payment option is offered. Keep return_url and redirects.success_redirect_url consistent when sending both.

return_urlstring

Where the checkout sends the buyer after paying, such as the invoice's page in the customer account. It must be an HTTPS address of the merchant's customer account: /{merchant_id} on Flint's account host, the merchant's active custom account domain, or the host of customer_account.merchant_account_url when the merchant hosts the account. HTTP is accepted only for localhost in test mode. Anything else fails with INVALID_RETURN_URL.

surfaceenum

Defaults to hosted. The same surface reuses the open checkout. A different surface replaces it only while no payment is in progress; otherwise the request returns CHECKOUT_SURFACE_CHANGE_NOT_ALLOWED.

  • hosted
  • embedded

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/checkout-session \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "invoice_schedule_entry_id": "",
    "page_origin": "",
    "redirects": {
      "cancel_redirect_url": "",
      "success_redirect_url": ""
    },
    "return_url": "",
    "surface": "hosted"
  }'

Collect invoice#

POST/v1/invoices/{invoice_id}/collectIdempotent

Requires scope commerce.invoices.write

Charges the invoice's saved payment method or the supplied saved payment method. This command requires a caller-chosen Idempotency-Key that is reused for retries of the same collection request.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

invoice_schedule_entry_idstring
payment_method_idstring

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/collect \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "invoice_schedule_entry_id": "",
    "payment_method_id": ""
  }'

List invoice delivery attempts#

GET/v1/invoices/{invoice_id}/delivery-attempts

Requires scope commerce.invoices.read or commerce.invoices.write

Returns email delivery attempts for send and reminder actions.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/delivery-attempts \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "channel": "email",
      "created_at": "2026-03-21T15:04:05Z",
      "delivery_type": "send",
      "invoice_delivery_attempt_id": "indel_01J00000000000000000000000",
      "sent_at": "2026-03-21T15:04:06Z",
      "status": "sent",
      "to_email": "buyer@example.com"
    }
  ],
  "next_page_token": "example",
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Issue invoice#

POST/v1/invoices/{invoice_id}/issueIdempotent

Requires scope commerce.invoices.write

Issues the invoice, creates the buyer-access link, and uses the selected delivery mode. Safe to retry with the same Idempotency-Key.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

delivery_modeenum
  • merchant_default
  • email
  • caller_managed
expected_versioninteger

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/issue \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "delivery_mode": "email"
  }'
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/late-fees \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{}'
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/late-fees/{invoice_late_fee_id}/waive \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "reason_message": "Courtesy waiver"
  }'

Record manual invoice payment#

POST/v1/invoices/{invoice_id}/manual-paymentsIdempotent

Requires scope commerce.invoices.write

Applies an offline/manual payment to an issued invoice. Recording is rejected with INVOICE_PAYMENT_RESOLVING while an online payment is still resolving; an idle open checkout does not block. A payment that clears the balance invalidates the open checkout session. Safe to retry with the same Idempotency-Key.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

amount_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

expected_versioninteger
external_reference_idstring

Caller-owned identifier for this resource in an external system.

notestring
received_atstring

RFC3339 timestamp.

Response · 200

Same response as Create invoice draft.

curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/manual-payments \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "amount_money": {
      "amount": 5000,
      "currency": "USD"
    },
    "external_reference_id": "manual-payment-1024",
    "note": "Paid by check #1024",
    "received_at": "2026-03-22T10:00:00Z"
  }'

Reverse manual invoice payment#

POST/v1/invoices/{invoice_id}/manual-payments/reverseIdempotent

Requires scope commerce.invoices.write

Reverses previously applied manual/offline payment amount from an invoice. Safe to retry with the same Idempotency-Key.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Request body

amount_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

expected_versioninteger
external_reference_idstring

Caller-owned identifier for this resource in an external system.

notestring
received_atstring

RFC3339 timestamp.

Response · 200

Same response as Create invoice draft.

curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/manual-payments/reverse \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "amount_money": {
      "amount": 5000,
      "currency": "USD"
    },
    "external_reference_id": "manual-payment-1024",
    "note": "Paid by check #1024",
    "received_at": "2026-03-22T10:00:00Z"
  }'
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/mark-uncollectible \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 0
  }'

List invoice payment attempts#

GET/v1/invoices/{invoice_id}/payment-attempts

Requires scope commerce.invoices.read or commerce.invoices.write

Lists card and ACH collection attempts for an invoice in reverse chronological order.

Path parameters

invoice_idstringRequired

Flint invoice ID.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

idempotency_keystring

Return the attempt created with this caller-chosen idempotency key.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/payment-attempts \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get invoice payment attempt#

GET/v1/invoices/{invoice_id}/payment-attempts/{invoice_payment_attempt_id}

Requires scope commerce.invoices.read or commerce.invoices.write

Returns one card or ACH collection attempt for the invoice.

Path parameters

invoice_idstringRequired

Flint invoice ID.

invoice_payment_attempt_idstringRequired

Flint invoice payment attempt ID.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/payment-attempts/invpa_01J00000000000000000000000 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/payment-attempts/invpa_01J00000000000000000000000/cancel \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
curl https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/pdf \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/send-reminder \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
curl -X POST https://api.withflintpay.com/v1/invoices/inv_01J00000000000000000000000/void \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 0
  }'

Was this helpful?