Skip to main content

Invoice Comments

Comments let your team annotate an invoice with context — the source of an evidence document, a note explaining a manual adjustment, or a question for a teammate. Comments support tagging other users (@mentions, which trigger an in-app notification) and file attachments. Only the comment’s author can edit or delete it.

Authentication

All endpoints require the standard headers:
string
required
Your API key for authentication
string
required
Your organization UUID. The invoice must belong to a facility owned by this organization, or the request returns 404.

Create a Comment

POST /v1/invoices/{invoice_id}/comments
uuid
required
UUID of the invoice to comment on
string
required
The comment text (1–10,000 characters)
uuid[]
IDs of users to tag. Invalid or non-existent user ids are silently dropped. Each valid mention receives an in-app notification.
cURL

List Comments

GET /v1/invoices/{invoice_id}/comments Returns all comments for the invoice, oldest first.

Edit a Comment

PATCH /v1/invoices/comments/{comment_id} Same body as create. Only the original author may edit; any other user gets 403. Only newly-added mentions (not already-mentioned users) receive a notification.

Delete a Comment

DELETE /v1/invoices/comments/{comment_id} Author-only, 403 otherwise. Deleting a comment also deletes its mentions and attachments.

Response Object

string
UUID of the comment
string
UUID of the invoice
string
Comment text
string | null
UUID of the author
object | null
Author details
string[]
UUIDs of users mentioned in this comment
array
List of attachment objects (see below)
datetime
When the comment was created
datetime | null
When the comment was last edited

Attachments

Attaching a file to a comment is a two-step flow: request a presigned upload URL, upload the file directly to S3, then register the attachment.

1. Request a Presigned Upload URL

POST /v1/invoices/comments/{comment_id}/attachments/presigned-url
string
required
Original file name with extension (no path separators)
string
MIME type of the file
Returns {"upload_url": "...", "file_id": "...", "file_name": "..."}. upload_url is a short-lived (5 minute) presigned S3 PUT URL.

2. Upload the File

PUT the raw file bytes directly to upload_url, setting the Content-Type header to match what you sent in step 1 (the URL signature covers Content-Type).

3. Register the Attachment

POST /v1/invoices/comments/{comment_id}/attachments
string
required
Same file name as step 1
string
required
The file_id returned in step 1. Must belong to this invoice’s own organization — a file_id issued for a different organization is rejected with 400.
integer
File size in bytes, for display purposes
Supported extensions: csv, xlsx, xls, pdf, jpg, jpeg, png, doc, docx, txt, json, xml. The attachment is also mirrored into your organization’s general Files listing.

Attachment Object

string
UUID of the attachment
string
UUID of the parent comment
string
Original file name
string
Public URL of the stored file
string
S3 key of the stored file
string | null
UUID of the user who uploaded it
datetime
When the attachment was registered

Common Errors

404 Not Found

Cause: The invoice (or comment) doesn’t exist, or doesn’t belong to your organization.

403 Forbidden

Cause: Attempting to edit or delete a comment you didn’t author.

400 Bad Request

Cause: Unsupported attachment file extension, or file_id wasn’t issued for this organization.

Get Invoice

Get a single invoice by ID

List Invoices

Retrieve invoices with filtering and pagination