Create a credit memo
POST
/partners/invoicesCreates a credit memo for a customer.
Set invoiceType to memo. Optionally pass appliedToInvoiceUuid to link the memo to an open invoice at create time. Line item rules match invoice create. invoiceNumber is required.
HMAC signature + Bearer access token
Try this requestRequest body
customerUuiduuidrequiredUUID of the customer receiving the credit.
invoiceTypeenumrequiredMust be memo.
One of: memo
invoiceNumberstringrequiredCredit memo number shown to the customer.
datedaterequiredMemo date (ISO).
appliedToInvoiceUuiduuidUUID of an open invoice to credit at create time.
currencystringISO 4217 currency code.
productsarrayrequiredCredit line items.
productUuiduuidProduct UUID from list_products. `uuid` is accepted as an alias.
descriptionstringLine description.
quantitynumberrequiredQuantity.
unitPricenumberrequiredCredit amount per unit.
nonTaxablebooleanWhen true, clears tax on the line.
notesstringMemo notes visible to the customer.
tagUuidsarrayTag UUIDs to attach.
Responses
201Credit memo created.400Validation failed.404Customer, product, or applied invoice not found.401Missing or invalid HMAC signature, expired timestamp, or invalid Bearer token. Troubleshoot403The credential does not have access to this workspace or resource. Troubleshoot429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. TroubleshootPOST
https://api.getcount.com/partners/invoicesRequest
import crypto from 'node:crypto';
const BASE_URL = 'https://api.getcount.com';
const CLIENT_ID = process.env.COUNT_CLIENT_ID;
const CLIENT_SECRET = process.env.COUNT_CLIENT_SECRET;
const ACCESS_TOKEN = process.env.COUNT_ACCESS_TOKEN;
const method = 'POST';
const signingPath = '/invoices';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = {
"customerUuid": "dfa3219e-6af8-4c53-997a-037534f63a35",
"invoiceType": "memo",
"invoiceNumber": "CM-0042",
"date": "2026-03-01",
"appliedToInvoiceUuid": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"currency": "USD",
"products": [
{
"productUuid": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"description": "Credit for overbilling on prior invoice",
"quantity": 1,
"unitPrice": 500,
"nonTaxable": true
}
]
};
const bodyString = JSON.stringify(body);
const bodyHash = crypto.createHash('sha256').update(bodyString).digest('hex');
const baseString = `${method}:${signingPath}:${timestamp}:${bodyHash}`;
const signature = crypto.createHmac('sha256', CLIENT_SECRET).update(baseString).digest('hex');
const response = await fetch(`${BASE_URL}/partners/invoices`, {
method,
headers: {
'x-client-id': CLIENT_ID,
'x-timestamp': timestamp,
'x-signature': signature,
'Content-Type': 'application/json',
Authorization: `Bearer ${ACCESS_TOKEN}`,
},
body: bodyString,
});
console.log(await response.json());Response · 201
{
"status": "success",
"data": {
"invoice": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"invoiceNumber": "CM-0042",
"invoiceType": "memo",
"customerUuid": "dfa3219e-6af8-4c53-997a-037534f63a35",
"appliedToInvoiceUuid": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"date": "2026-03-01",
"dueDate": null,
"currency": "USD",
"status": "draft",
"isDraft": true,
"approved": false,
"isSent": false,
"paymentStatus": "unpaid",
"subtotal": 500,
"taxTotal": 0,
"total": 500,
"amountDue": 500,
"products": [
{
"productUuid": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"description": "Credit for overbilling on prior invoice",
"quantity": 1,
"unitPrice": 500,
"nonTaxable": true
}
],
"createdAt": "2026-03-01T09:00:00.000Z",
"updatedAt": "2026-03-02T11:15:00.000Z"
}
}
}