Lob's Checks API cancels a paper check only before it mails, and only on a paid edition

Lob's Checks API cancels a paper check only before it mails, and only on a paid edition

The Lob Checks API prints and mails physical checks drawn on a bank account you have verified with Lob. It has four operations: list, create, retrieve and cancel. The interesting one is cancel, because a check is the one Lob mail piece that moves money, and the contract says plainly that you usually cannot take it back.

Lob scores 52.9 on the Kin Score (developing) and 42.4 on Agent Readiness (agent-native). The API record says Checks is one of 48 APIs Lob publishes on the network. It ships an OpenAPI contract (version 1.20.2, served from https://api.lob.com/v1 with Basic auth) and links to docs.lob.com.

What the surface covers

Operation Method and path What it does
List GET /checks Newest first. Filters by date created, metadata, scheduled, send_date, mail_type and status
Create POST /checks Takes an optional idempotency key in a header or the query string
Retrieve GET /checks/{chk_id} Returns one check by ID
Cancel DELETE /checks/{chk_id} Works only before the scheduled send date

The cancel window is the contract

The cancel description reads: “This can only be done if the check has a send_date and the send_date has not yet passed.” If the cancel succeeds, you are not charged. The same description ends with “Scheduling and cancellation is a premium feature,” which is available only on a higher Print & Mail Edition.

Put those two sentences together and the design is clear. A check created without a future send_date goes into production right away, and the API has no undo. Any integrator who wants a review step, such as a hold for approval or a same-day correction, has to schedule every check into the future. That requires the paid tier.

The list filter supports that pattern. scheduled=true returns only checks whose send_date is later than date_created, so you can list exactly the checks you can still cancel.

Create is guarded, but only if you ask

Create accepts Idempotency-Key as a header or idempotency_key as a query parameter, each up to 256 characters. Both are optional. On an endpoint that prints money onto paper, a retry without a key can mail a second check. Treat the key as required in your own code even though Lob does not.

The body has firm limits that are worth validating before you call:

  • amount is in US dollars, rounded to two decimals, with a maximum of 999999.99.
  • mail_type accepts only usps_first_class.
  • memo can be up to 40 characters.
  • The bottom of the check page is a oneOf: either a message of up to 400 characters or a check_bottom template, but not both.
  • check_number starts at 10000 for a new bank account unless you set it. After that, it increments from the last number used.

What the contract leaves out

All four operations document only a 200 and a default response. No 4xx response is described, so the contract does not tell you what an expired cancel window, an unverified bank account or a duplicate idempotency key returns. You will find out by calling the API. Your error handling should branch on the error body, not on documented codes, until Lob publishes those responses.

Takeaway

Schedule every check you might need to stop, list scheduled=true to find the ones you can still cancel, and send an idempotency key with every create. The contract and docs are at apis.io/apis/lob/lob-checks-api/.

← Google Chrome vs Apple Safari, four facets lose to one contract
One of 11,877 rate-limit records on apis.io was published by the provider itself →