---
title: "Create Bill Invoice Upload URL"
method: POST
path: "/bills/{bill_id}/invoice/presigned-url"
tags: ["Bills"]
---

# Create Bill Invoice Upload URL

`POST /bills/{bill_id}/invoice/presigned-url`

## Request

- Base URL: `https://api.meow.com/v1`
- URL: `https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-url`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/meow/apis/meow-api/docs/bills/:bill_id/invoice/presigned-url/post.ts> (a function with typed inputs; its response is checked against the schema)

Returns a short-lived upload URL for the bill's own invoice. Upload the file to it, then `POST /bills/{bill_id}/invoice` to attach it — the same two steps as the supporting-documents endpoints. The invoice is what an international wire files as proof of the payment and what the accounting integrations attach, so a bill that will be paid abroad should carry one.

## Path parameters

- `bill_id` string, uuid, required: The bill ID.

## Headers

- `x-entity-id` string, uuid

## Request body

- BillFileMetadata: Details of a file you intend to upload, used to mint its upload URL.
  - `filename` string, required: Name to store the document under, shown alongside the bill.
  - `content_type` string, required: MIME type of the file. Only PDF, JPEG, PNG, HEIC, and DOCX are accepted.
  - `size` integer, required: Size of the file in bytes. Must be between 1 KB and 50 MB, and must match what you actually upload — the upload URL enforces the same range.

## Response `200`

Successful Response

- BillPresignedUrlResponse
  - `uploads` BillPresignedUrlEntry[], required: One upload target per requested file, in the order you sent them.
    - `url` string, required: URL to POST the file to as `multipart/form-data`. Valid for 5 minutes.
    - `fields` object, required: Form fields to send with the upload, before the file part. Send them exactly as given — they carry the signature.
    - `object_key` string, required: Storage key for the uploaded file. Pass it to Confirm Bill Documents once the upload succeeds, to attach the file to the bill.
    - `filename` string, required: The filename you asked for, echoed so you can match entries to files.
    - `max_bytes` integer, required: Largest file size the upload URL accepts, in bytes.

## Other responses

- `400`: The request could not be processed.
- `401`: Authentication failed.
- `403`: The API key is not authorized for this operation, or the user of a global API key is an admin or controller without approved KYC. The KYC case returns the message `KYC is required for controllers and admins.` until that user completes KYC in the Meow dashboard.
- `429`: Too many requests.

---

[API](https://skmtc.dev/meow/apis/meow-api.md) - [All operations](https://skmtc.dev/meow/apis/meow-api/llms.txt) - [OpenAPI document](https://skmtc.dev/meow/apis/meow-api/revisions/ea2d7e25b63b?raw)
