Every bill you touch through the API stays a draft pending approval. Creating
a bill, editing it, or attaching documents never moves money on its own — payment
happens only after a human approves the bill in the dashboard.
You’ll need
- An API key with
billpay:readto list and retrieve bills, andbillpay:writeto create, update, delete, and attach documents to them. - A contact for each vendor, created with banking (
ACH, wire, or check)counterpartydetails. A bill is payable to a contact that must already exist; create one first withPOST /contacts. (The Contacts guide covers USDC crypto contacts, which Bill Pay doesn’t use.) - If your key can access more than one entity, pass the
x-entity-idheader to choose which entity the bill belongs to.
1. Create a bill
A bill is payable to acontact_id and is made of one or more line items. Each
line item is either an EXPENSE (a flat amount) or an ITEM (a unit amount
times a quantity); the bill total is calculated from the lines. Send a unique
idempotency_key so a retried request never creates a duplicate.
Response
id — it’s the {bill_id} for attaching documents, tracking, updating, or
canceling the bill below.
| Field | Description |
|---|---|
idempotency_key | Required. A key you generate so retrying never creates a duplicate bill; reusing a key is rejected. |
contact_id | The vendor this bill is payable to. The vendor must already exist as a contact. |
payment_type | How the bill is paid once approved: ACH (default), WIRE, or CHECK. |
account_id | The account to pay from, in the id format returned by GET /accounts. Defaults to your configured bill pay account. |
currency | The bill’s currency (ISO 4217). Defaults to USD. |
bill_date / bill_due_date | The date on the bill and the date it’s due (YYYY-MM-DD). |
line_items | The lines that make up the bill. Use type: "ITEM" with a quantity for itemized lines, or type: "EXPENSE" for a flat amount. |
rrule | An iCalendar RRULE to make this a recurring bill. |
Bill Pay accepts the
ACH, WIRE, and CHECK payment types. Crypto and
international payments are arranged in the Meow dashboard, not through this API.2. Attach supporting documents
Attaching the vendor’s invoice or a receipt is a three-step flow: ask for upload URLs, upload each file, then confirm the attachment. You can attach up to five documents per confirm call.Request upload URLs
Describe each file — its
filename, content_type, and size in bytes — and
get a short-lived upload target for each.Response
Upload each file
POST the file to its
url as a multipart form, including every entry from
fields and putting the file last. Keep it under max_bytes and upload before
the URL expires.3. Track bills
GET /bills returns a paginated list and filters by status, vendor, amount, and
date ranges, plus full-text search.
| Parameter | Description |
|---|---|
statuses | Filter by one or more bill statuses; repeat the parameter for several. |
contact_id | Filter to bills payable to specific vendors. |
amount_min / amount_max | Filter by bill total. |
bill_date_from / bill_date_to | Filter by the date on the bill. |
due_date_from / due_date_to | Filter by due date. |
search | Full-text search across bill fields. |
sort_by / sort_descending | Order the results. |
limit / offset | Page through results using the nextOffset from the previous response. |
GET /bills/{bill_id}:
status | Meaning |
|---|---|
DRAFT | Created and waiting for approval in the dashboard. |
PENDING | Submitted and moving through approval. |
APPROVED | Approved and ready to be scheduled. |
SCHEDULED | Approved with a payment scheduled; see scheduled_at. |
PAYMENT_INITIATED | Payment is on its way. |
PAYMENT_DELIVERED | Payment delivered; see paid_at. |
PAYMENT_FAILED | The payment attempt failed. |
REJECTED | An approver declined the bill. |
CANCELED | The bill was canceled before payment. |
4. Update or cancel a draft
While a bill is still aDRAFT, you can edit it. PATCH uses partial semantics —
only the fields you send change, and sending line_items replaces the existing
lines (send an empty list to clear them).
Once a bill is approved (or paid), it can no longer be edited or deleted through
the API.
5. Schedule recurring bills
To generate a bill on a repeating schedule, include an iCalendarrrule (with a
DTSTART) when you create it. Each occurrence is generated as its own draft for
approval — recurring bills are never paid automatically.
End to end
DRAFT with its invoice attached, waiting for an approver
in the dashboard.
See also
Create a contact
Register a vendor with banking
counterparty details to pay bills to.Create a bill
Full request contract for
POST /bills.List bills
Every filter, sort, and pagination option.
Update a bill
Edit a draft with
PATCH partial semantics.Confirm bill documents
Attach uploaded invoices and receipts.