Developers
The payed.me API
Everything you can do to a document or a record in the portal, your own software can do over HTTP. Create invoices from your own system, keep a client list in step with your CRM, push tracked hours in at the end of the week.
Base URL
https://api.payed.me/apiAvailability
API tokens are included from the Professional plan. Every endpoint also stays behind whatever plan already gated it in the portal — a token never reaches further than your own account does.
Authenticating
Create a token in the portal underSettings → API tokens. It is shown once, at the moment you create it, and never again — we store only a hash of it, so nobody can recover it for you afterwards. Keep it where you keep your other secrets, and if you lose it, revoke it and create another.
Send it on every request as a bearer token:
curl https://api.payed.me/api/invoices \
-H "Authorization: Bearer pm_live_your_token_here"A token is accepted in that header and nowhere else — not in a cookie, not in a query string. It identifies your account, so requests made with it see exactly the invoices, clients and records you see when you sign in.
What a token cannot do
A token reaches documents and records. It does not reach anything that would let it entrench itself or change what your account is:
- It cannot create another token, or revoke one. If a token leaks, revoking it in the portal ends it — there is no way for the holder to mint a replacement.
- It cannot sign in, change your password, or touch your personal details.
- It cannot invite or remove colleagues. Team management is a portal action.
- It cannot change your subscription, start a checkout or cancel a plan.
- It cannot edit your settings or your invoice templates.
Anything not listed on this page answers 403. That is the default, not an exception: an endpoint has to be published deliberately before a token can reach it.
Endpoints
Invoices
ON EVERY PLAN
Create, send and track invoices, including credit notes — a credit note is an invoice with a negative total and is served by these same endpoints.
- GET
/invoicesList invoices - POST
/invoicesCreate an invoice - GET
/invoices/{id}Fetch one invoice - PUT
/invoices/{id}Update an invoice - DELETE
/invoices/{id}Delete an invoice - GET
/invoices/{id}/printDownload the PDF - POST
/invoices/{id}/sendEmail it to the client - POST
/invoices/draft-from-sourcesDraft an invoice from tracked work, expenses or mileage - GET
/invoices/dashboard/statsTotals by status - GET
/invoices/dashboard/revenueRevenue over time - GET
/invoices/dashboard/unbilledWork not yet invoiced - GET
/invoices/dashboard/customer-revenueRevenue by client
Quotes
ON EVERY PLAN
Quotes from draft to accepted, rejected or expired.
- GET
/quotesList quotes - POST
/quotesCreate a quote - GET
/quotes/{id}Fetch one quote - PUT
/quotes/{id}Update a quote - DELETE
/quotes/{id}Delete a quote - GET
/quotes/{id}/printDownload the PDF - POST
/quotes/{id}/sendEmail it to the client - GET
/quotes/dashboard/statsTotals by status
Clients
ON EVERY PLAN
The people and companies you bill. Your plan caps how many you can save — the API answers HTTP 402 when you reach it, exactly as the portal does.
- GET
/customersList clients - POST
/customersCreate a client - GET
/customers/{id}Fetch one client - PUT
/customers/{id}Update a client - DELETE
/customers/{id}Delete a client
Receipts
FROM BASIC
Receipts you issue against payments received.
- GET
/receiptsList receipts - POST
/receiptsCreate a receipt - GET
/receipts/{id}Fetch one receipt - PUT
/receipts/{id}Update a receipt - DELETE
/receipts/{id}Delete a receipt - GET
/receipts/{id}/printDownload the PDF - POST
/receipts/{id}/sendEmail it - GET
/receipts/dashboard/statsTotals by period
Expenses
FROM BASIC
What you spend, with an optional attachment on each record.
- GET
/expensesList expenses - POST
/expensesCreate an expense - GET
/expenses/{id}Fetch one expense - PUT
/expenses/{id}Update an expense - DELETE
/expenses/{id}Delete an expense - POST
/expenses/{id}/attachmentUpload a receipt image or PDF - GET
/expenses/{id}/attachmentDownload the attachment - DELETE
/expenses/{id}/attachmentRemove the attachment - GET
/expenses/dashboard/statsTotals by period - GET
/expenses/dashboard/spendingSpending by category
Inventory
FROM PROFESSIONAL
Stock items, movements and counts.
- GET
/inventoryList items - POST
/inventoryCreate an item - GET
/inventory/{id}Fetch one item - PUT
/inventory/{id}Update an item - DELETE
/inventory/{id}Delete an item - GET
/inventory/{id}/movementsMovement history - POST
/inventory/{id}/movementsRecord a movement - POST
/inventory/{id}/countRecord a stock count - GET
/inventory/dashboard/statsStock value and low stock
Purchase requests
FROM PROFESSIONAL
What you intend to buy, with lines and a printable document.
- GET
/purchase-requestsList requests - POST
/purchase-requestsCreate a request - GET
/purchase-requests/{id}Fetch one request - PUT
/purchase-requests/{id}Update a request - DELETE
/purchase-requests/{id}Delete a request - GET
/purchase-requests/{id}/printDownload the PDF
Tasks and time
FROM PROFESSIONAL
Tasks and the hours logged against them. Both sit behind the one time-tracking flag, together with mileage below.
- GET
/tasksList tasks - POST
/tasksCreate a task - GET
/tasks/{id}Fetch one task - PUT
/tasks/{id}Update a task - DELETE
/tasks/{id}Delete a task - POST
/tasks/{id}/time-logsLog time against a task - PUT
/tasks/{id}/time-logs/{logId}Update a time log - DELETE
/tasks/{id}/time-logs/{logId}Delete a time log
Mileage
FROM PROFESSIONAL
Trips, with an optional attachment on each record.
- GET
/mileageList trips - POST
/mileageRecord a trip - GET
/mileage/{id}Fetch one trip - PUT
/mileage/{id}Update a trip - DELETE
/mileage/{id}Delete a trip - POST
/mileage/{id}/attachmentUpload an attachment - GET
/mileage/{id}/attachmentDownload the attachment - DELETE
/mileage/{id}/attachmentRemove the attachment
Payment links
ON EVERY PLAN
Mint the public checkout link for one of your invoices, so your own software can send it wherever it likes.
- POST
/invoices/{id}/payment-linkCreate or fetch the payment link
When a request is refused
| Status | What happened | What to do |
|---|---|---|
| 401 | The token is missing, unknown, revoked or expired. | Check the Authorization header. The API deliberately does not say which of the four it was — mint a new token if you are unsure. |
| 402 | Your plan does not include the API, or does not include the resource you asked for. | The body names the capability and the plan that includes it. |
| 403 | The endpoint exists but is not part of the API. | Settings, team, billing and token management are portal-only. Only the endpoints on this page accept a token. |
| 404 | No such record, or it belongs to another account. | These two answer identically on purpose, so ids cannot be probed. |
| 400 | The body failed validation. | The response lists the fields that were rejected. |
Errors come back as JSON with a readable message. Plan refusals also carry a code and the plan that includes the capability, so your software can tell "upgrade needed" apart from "you sent something wrong".
Get started with payed.me today
Join payed.me today to streamline your invoicing process and achieve greater efficiency in your business.