Skip to main content
Bill Pay is Meow’s accounts-payable surface. You record what you owe a vendor as a bill, including its line items, due date, and how it should be paid, and the API saves it as a draft. Someone on your team approves the bill in the Meow dashboard, and only then does it get paid.
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:read to list and retrieve bills, and billpay:write to create, update, delete, and attach documents to them.
  • A contact for each vendor, created with banking (ACH, wire, or check) counterparty details. A bill is payable to a contact that must already exist; create one first with POST /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-id header to choose which entity the bill belongs to.

1. Create a bill

A bill is payable to a contact_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 header so a retried request never creates a duplicate.
Response
Save id. It is the {bill_id} for attaching documents, tracking, updating, or canceling the bill below.
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.
1

Request upload URLs

Describe each file, giving its filename, content_type, and size in bytes, and get a short-lived upload target for each.
Response
2

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

Confirm the attachment

Confirm each upload with the object_key and filename you received. The response is the updated bill, now carrying the document under additional_documents with a short-lived download URL.
Response

3. Track bills

GET /bills returns a paginated list and filters by status, vendor, amount, and date ranges, plus full-text search.
Retrieve one bill with GET /bills/{bill_id}:
A bill moves through these statuses as it’s approved and paid:

4. Update or cancel a draft

While a bill is still a DRAFT, 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).
Cancel a bill that hasn’t been approved yet by deleting it:
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 iCalendar rrule (with a DTSTART) when you create it. Each occurrence is generated as its own draft for approval. Recurring bills are never paid automatically.
Building the schedule string by hand is fiddly. A tool like the RRULE generator will assemble the DTSTART/RRULE for you.

End to end

The bill now sits as a 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.