Supplier invoices
Add supplier invoices in bulk the way the CRM's grid does, read and update them, and mark them exported — which locks them until unmarked.
A supplier invoice is what the CRM lists under Purchasing → Supplier Invoices: one row per invoice or credit note from a supplier, with the supplier's own number, a date, net, VAT and total, a nominal code and VAT rate, and optionally the purchase order and contract it belongs to. There are no line items and no status. The one state an invoice has is exported: once an accounts export has taken it, it is read-only here until it is unmarked.
GET List suppliers
/v1/suppliersThe suppliers you can invoice against, by id or code, with the nominal code and VAT rate an
invoice gets when the row leaves them out. Inactive suppliers are listed so you can read their
invoices, but cannot be invoiced, as in the CRM. Only suppliers with exportToAccounts are
picked up by the CRM's accounts exports. No parameters. Cached for five minutes.
curl https://api.evacrm.co.uk/v1/suppliers \
-H "Authorization: Bearer sk_..."{
"object": "list",
"data": [
{
"id": "c5c5ea34-994b-4278-8f34-1fb9047cb6fe",
"code": "EMP",
"name": "Emplas Windows Systems Ltd",
"tradingName": null,
"active": true,
"onStop": false,
"exportToAccounts": true,
"accountsReference": "EMP01",
"defaults": { "nominalCode": { "code": "000", "name": "None - Use contract nc" }, "vatRate": { "code": "0", "name": "Zero-Rated" } }
}
]
}GET Reference data
/v1/supplier-invoices/typesWhat the write calls accept: the invoice types, the nominal codes flagged for suppliers, and the VAT rates with the percentage in force today. Send a type by name, value or id; a nominal code by code or id; a VAT rate by code, name or id. No parameters. Cached for five minutes.
curl https://api.evacrm.co.uk/v1/supplier-invoices/types \
-H "Authorization: Bearer sk_..."{
"types": [
{ "id": "b96b8164-873e-47c2-aa3e-2c4741d518bf", "name": "Invoice", "value": "invoice", "credit": false },
{ "id": "c8575baa-242e-4e1f-b4ed-7e0a9e64f2e2", "name": "Credit Note", "value": "credit_note", "credit": true }
],
"nominalCodes": [{ "id": "2c4f4109-86c6-4d73-aa28-dc51aa455d9b", "code": "201", "name": "COS - Supply Only - Windows & Doors" }],
"vatRates": [
{ "id": "79785292-0368-40fd-a119-3ef06abb33e2", "code": "1", "name": "Standard Rates", "percent": 20, "default": true },
{ "id": "f84f5a52-55f3-40cb-921a-2ca8aabc6290", "code": "0", "name": "Zero-Rated", "percent": 0, "default": false }
]
}GET List supplier invoices
/v1/supplier-invoicesNewest first, with cursor paging as for leads. A supplier's invoice
number is not unique, so lookup by number is a list with supplier and number.
supplierstring · listOne or more suppliers by id or code.
numberstring · max 64Exact match, case-insensitive.
referencestring · max 255Exact match, case-insensitive.
typestring · listOne or more types by name, value or id.
creditbooleanexportedbooleannominalCodestring · listOne or more, by id or code.
vatRatestring · listOne or more, by id, code or name.
purchaseOrderstringA purchase order's code or id.
contractIdstring · uuidInvoices on a contract, directly or through its purchase orders.
dateFromstring · date or date-timeInvoice date, from.
dateTostring · date or date-timeInvoice date, to. A date-only value covers that whole day.
dueFromstring · date or date-timePayment due date, from.
dueTostring · date or date-timePayment due date, to; date-only covers the day.
exportedFromstring · date or date-timeExported date, from.
exportedTostring · date or date-timeExported date, to; date-only covers the day.
createdSincestring · date or date-timecreatedBeforestring · date or date-timeupdatedSincestring · date or date-timeThe way to keep a mirror. Implies order=updatedAt:asc.
orderstringcreatedAt:desc, createdAt:asc, updatedAt:asccreatedAt:desclimitinteger · 1 to 10050cursorstringFrom a previous nextCursor.
# everything from one supplier that has not been exported yet
curl "https://api.evacrm.co.uk/v1/supplier-invoices?supplier=EMP&exported=false" \
-H "Authorization: Bearer sk_..."
# credit notes dated in september
curl "https://api.evacrm.co.uk/v1/supplier-invoices?credit=true&dateFrom=2026-09-01&dateTo=2026-09-30" \
-H "Authorization: Bearer sk_..."
# a supplier's number — numbers are not unique, so this is a list
curl "https://api.evacrm.co.uk/v1/supplier-invoices?supplier=EMP&number=INV-88812" \
-H "Authorization: Bearer sk_..."{
"object": "list",
"data": [
{
"id": "e94cc565-b021-46af-bcd7-ced0d70111c2",
"number": "INV-88812",
"reference": "INV-88812",
"detail": "Frames for plot 4",
"type": { "id": "b96b8164-873e-47c2-aa3e-2c4741d518bf", "name": "Invoice", "value": "invoice" },
"credit": false,
"supplier": { "id": "c5c5ea34-994b-4278-8f34-1fb9047cb6fe", "code": "EMP", "name": "Emplas Windows Systems Ltd" },
"date": "2026-09-02T00:00:00.000+01:00",
"dateReceived": "2026-09-03T00:00:00.000+01:00",
"dueDate": "2026-10-02T00:00:00.000+01:00",
"amounts": { "net": 5638, "vat": 1127.6, "total": 6765.6, "vatPercent": 20 },
"nominalCode": { "id": "2c4f4109-86c6-4d73-aa28-dc51aa455d9b", "code": "201", "name": "COS - Supply Only - Windows & Doors" },
"vatRate": { "id": "79785292-0368-40fd-a119-3ef06abb33e2", "code": "1", "name": "Standard Rates" },
"purchaseOrder": { "id": "ed0a9368-f8c7-45de-ae77-a7ff6129d09b", "code": "PO000116" },
"contract": { "id": "1553a10d-1150-47e1-86d9-d3323798227e", "code": "CON000561" },
"exported": false,
"exportedAt": null,
"createdBy": { "id": "cd9356b7-dd81-4f9a-a6fd-9cc9ae967a4e", "name": "Tuan Dinh" },
"createdAt": "2026-09-02T14:45:53.405+01:00",
"updatedAt": "2026-09-02T14:45:53.405+01:00"
}
],
"hasMore": false,
"nextCursor": null
}amounts.vatPercent is the rate that was applied; vatRate is the band it came from. contract
is the one the invoice sits on, directly or through its purchase order, which is how the CRM's
profit and loss tab reads it.
GET Get a supplier invoice
/v1/supplier-invoices/{id}One invoice, in the same shape.
idstring · uuidRequiredThe invoice's id.
curl https://api.evacrm.co.uk/v1/supplier-invoices/e94cc565-b021-46af-bcd7-ced0d70111c2 \
-H "Authorization: Bearer sk_..."{
"id": "e94cc565-b021-46af-bcd7-ced0d70111c2",
"number": "INV-88812",
"reference": "INV-88812",
"detail": "Frames for plot 4",
"type": {
"id": "b96b8164-873e-47c2-aa3e-2c4741d518bf",
"name": "Invoice",
"value": "invoice"
},
"credit": false,
"supplier": {
"id": "c5c5ea34-994b-4278-8f34-1fb9047cb6fe",
"code": "EMP",
"name": "Emplas Windows Systems Ltd"
},
"date": "2026-09-02T00:00:00.000+01:00",
"dateReceived": "2026-09-03T00:00:00.000+01:00",
"dueDate": "2026-10-02T00:00:00.000+01:00",
"amounts": {
"net": 5638,
"vat": 1127.6,
"total": 6765.6,
"vatPercent": 20
},
"nominalCode": {
"id": "2c4f4109-86c6-4d73-aa28-dc51aa455d9b",
"code": "201",
"name": "COS - Supply Only - Windows & Doors"
},
"vatRate": {
"id": "79785292-0368-40fd-a119-3ef06abb33e2",
"code": "1",
"name": "Standard Rates"
},
"purchaseOrder": {
"id": "ed0a9368-f8c7-45de-ae77-a7ff6129d09b",
"code": "PO000116"
},
"contract": {
"id": "1553a10d-1150-47e1-86d9-d3323798227e",
"code": "CON000561"
},
"exported": false,
"exportedAt": null,
"createdBy": {
"id": "cd9356b7-dd81-4f9a-a6fd-9cc9ae967a4e",
"name": "Tuan Dinh"
},
"createdAt": "2026-09-02T14:45:53.405+01:00",
"updatedAt": "2026-09-02T14:45:53.405+01:00"
}POST Add supplier invoices
/v1/supplier-invoicesAdds invoices in bulk, exactly as the CRM's Create Supplier Invoice grid does: send up to 200
rows, every row is checked, and either all of them are written or none. VAT is worked out the
way the grid does it: the rate on the VAT band in force on the invoice date, applied to the net
and rounded to pence, with the total as net plus VAT. Send vat when the supplier's figure
differs by a penny or two.
invoicesobject[] · 1 to 200RequiredThe rows, each with the fields below.
forcebooleanAdd rows whose supplier and number already exist.
falsenumberstring · max 20RequiredThe supplier's invoice number.
supplierstring · id or codeRequiredInactive suppliers are refused.
datestring · date or date-timeRequiredThe invoice date.
netnumber · 0 or moreRequiredCredit notes are positive amounts with a credit type.
typestring · name, value or idthe plain invoice typevatRatestring · id, code or nameA supplier with no default needs one.
the supplier'svatnumber · 0 or moreThe supplier's own VAT figure. Left out, it is worked out from the rate.
nominalCodestring · id or codeA supplier with no default needs one.
the supplier'sreferencestring · max 255The CRM requires one.
the invoice numberdetailstring · max 2000dueDatestring · date or date-timedateReceivedstring · date or date-timepurchaseOrderstring · code or idMust belong to the supplier; fills in the contract.
contractIdstring · uuidThe contract, when there is no purchase order to take it from.
curl https://api.evacrm.co.uk/v1/supplier-invoices \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{
"invoices": [
{ "number": "INV-88812", "supplier": "EMP", "date": "2026-09-02", "net": 5638, "purchaseOrder": "PO000116" },
{ "number": "CN-0091", "supplier": "EMP", "type": "Credit Note", "date": "2026-09-02", "net": 120, "vatRate": "Reduced Rate", "reference": "Damaged sash", "dueDate": "2026-10-02" }
]
}'{
"error": "Some invoices need attention",
"fields": { "invoices": "1 of 2 row(s) refused, nothing was written — see rows" },
"rows": [{ "index": 1, "fields": { "supplier": "no supplier with id or code ACME — GET /v1/suppliers lists them" } }]
}PATCH Update a supplier invoice
/v1/supplier-invoices/{id}Changes only the fields sent, with the same fields and lookups as a row above. No field is
required; send at least one. null clears detail, dueDate, dateReceived, purchaseOrder
and contractId. A change to net, vat, vatRate or date re-derives the VAT and total,
unless vat itself is sent.
idstring · uuidRequiredThe invoice's id.
If-Unmodified-Sincestring · date-timeThe updatedAt you last saw; a 409 if someone else changed the invoice first.
numberstring · max 20The supplier's invoice number.
supplierstring · id or codeInactive suppliers are refused.
typestring · name, value or idChanges whether it is a credit note.
datestring · date or date-timeThe invoice date. Re-derives the VAT from the rate in force on it.
netnumber · 0 or moreRe-derives the VAT and total.
vatnumber · 0 or moreThe supplier's own VAT figure; the total follows.
vatRatestring · id, code or nameRe-derives the VAT and total.
nominalCodestring · id or codereferencestring · max 255detailstring · max 2000, or nullnull clears.
dueDatestring · date or date-time, or nullnull clears.
dateReceivedstring · date or date-time, or nullnull clears.
purchaseOrderstring · code or id, or nullMust belong to the supplier; fills in the contract. null clears.
contractIdstring · uuid, or nullnull clears.
curl -X PATCH https://api.evacrm.co.uk/v1/supplier-invoices/e94cc565-b021-46af-bcd7-ced0d70111c2 \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "net": 5700, "dueDate": "2026-10-09" }'{
"id": "e94cc565-b021-46af-bcd7-ced0d70111c2",
"number": "INV-88812",
"reference": "INV-88812",
"detail": "Frames for plot 4",
"type": {
"id": "b96b8164-873e-47c2-aa3e-2c4741d518bf",
"name": "Invoice",
"value": "invoice"
},
"credit": false,
"supplier": {
"id": "c5c5ea34-994b-4278-8f34-1fb9047cb6fe",
"code": "EMP",
"name": "Emplas Windows Systems Ltd"
},
"date": "2026-09-02T00:00:00.000+01:00",
"dateReceived": "2026-09-03T00:00:00.000+01:00",
"dueDate": "2026-10-09T00:00:00.000+01:00",
"amounts": {
"net": 5700,
"vat": 1140,
"total": 6840,
"vatPercent": 20
},
"nominalCode": {
"id": "2c4f4109-86c6-4d73-aa28-dc51aa455d9b",
"code": "201",
"name": "COS - Supply Only - Windows & Doors"
},
"vatRate": {
"id": "79785292-0368-40fd-a119-3ef06abb33e2",
"code": "1",
"name": "Standard Rates"
},
"purchaseOrder": {
"id": "ed0a9368-f8c7-45de-ae77-a7ff6129d09b",
"code": "PO000116"
},
"contract": {
"id": "1553a10d-1150-47e1-86d9-d3323798227e",
"code": "CON000561"
},
"exported": false,
"exportedAt": null,
"createdBy": {
"id": "cd9356b7-dd81-4f9a-a6fd-9cc9ae967a4e",
"name": "Tuan Dinh"
},
"createdAt": "2026-09-02T14:45:53.405+01:00",
"updatedAt": "2026-09-03T09:30:12.774+01:00"
}POST Mark exported
/v1/supplier-invoices/{id}/exportMarks the invoice exported. From then on update and delete are refused until it is unmarked. Marking an invoice that is already exported changes nothing and is not an error.
idstring · uuidRequiredThe invoice's id.
exportedDatestring · date or date-timeWhen it was exported.
nowcurl -X POST https://api.evacrm.co.uk/v1/supplier-invoices/e94cc565-b021-46af-bcd7-ced0d70111c2/export \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{ "exportedDate": "2026-09-15" }'{ "changed": true, "invoice": { "id": "e94cc565-…", "exported": true, "exportedAt": "2026-09-15T00:00:00.000+01:00", "…": "…" } }POST Unmark exported
/v1/supplier-invoices/{id}/unexportClears the exported flag and date. This is the only way to reopen an exported invoice, so a correction after an export is always two calls: unexport, then update. The CRM's own accounts export will pick the invoice up again on its next run unless it is re-marked. No body.
idstring · uuidRequiredThe invoice's id.
curl -X POST https://api.evacrm.co.uk/v1/supplier-invoices/e94cc565-b021-46af-bcd7-ced0d70111c2/unexport \
-H "Authorization: Bearer sk_..."{
"changed": true,
"invoice": {
"id": "e94cc565-b021-46af-bcd7-ced0d70111c2",
"number": "INV-88812",
"reference": "INV-88812",
"detail": "Frames for plot 4",
"type": {
"id": "b96b8164-873e-47c2-aa3e-2c4741d518bf",
"name": "Invoice",
"value": "invoice"
},
"credit": false,
"supplier": {
"id": "c5c5ea34-994b-4278-8f34-1fb9047cb6fe",
"code": "EMP",
"name": "Emplas Windows Systems Ltd"
},
"date": "2026-09-02T00:00:00.000+01:00",
"dateReceived": "2026-09-03T00:00:00.000+01:00",
"dueDate": "2026-10-02T00:00:00.000+01:00",
"amounts": {
"net": 5638,
"vat": 1127.6,
"total": 6765.6,
"vatPercent": 20
},
"nominalCode": {
"id": "2c4f4109-86c6-4d73-aa28-dc51aa455d9b",
"code": "201",
"name": "COS - Supply Only - Windows & Doors"
},
"vatRate": {
"id": "79785292-0368-40fd-a119-3ef06abb33e2",
"code": "1",
"name": "Standard Rates"
},
"purchaseOrder": {
"id": "ed0a9368-f8c7-45de-ae77-a7ff6129d09b",
"code": "PO000116"
},
"contract": {
"id": "1553a10d-1150-47e1-86d9-d3323798227e",
"code": "CON000561"
},
"exported": false,
"exportedAt": null,
"createdBy": {
"id": "cd9356b7-dd81-4f9a-a6fd-9cc9ae967a4e",
"name": "Tuan Dinh"
},
"createdAt": "2026-09-02T14:45:53.405+01:00",
"updatedAt": "2026-09-03T09:31:05.209+01:00"
}
}DEL Delete a supplier invoice
/v1/supplier-invoices/{id}Removes the invoice.
idstring · uuidRequiredThe invoice's id.
curl -X DELETE https://api.evacrm.co.uk/v1/supplier-invoices/e94cc565-b021-46af-bcd7-ced0d70111c2 \
-H "Authorization: Bearer sk_..."HTTP/1.1 204 No Content