COUNTCOUNT
Sign Up
Credit MemosCreate a credit memo

Create a credit memo

POST/partners/invoices

Creates 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 request

Request body

customerUuiduuidrequired

UUID of the customer receiving the credit.

invoiceTypeenumrequired

Must be memo.

One of: memo

invoiceNumberstringrequired

Credit memo number shown to the customer.

datedaterequired

Memo date (ISO).

appliedToInvoiceUuiduuid

UUID of an open invoice to credit at create time.

currencystring

ISO 4217 currency code.

productsarrayrequired

Credit line items.

productUuiduuid

Product UUID from list_products. `uuid` is accepted as an alias.

descriptionstring

Line description.

quantitynumberrequired

Quantity.

unitPricenumberrequired

Credit amount per unit.

nonTaxableboolean

When true, clears tax on the line.

notesstring

Memo notes visible to the customer.

tagUuidsarray

Tag 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. Troubleshoot
403The credential does not have access to this workspace or resource. Troubleshoot
429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. Troubleshoot
POSThttps://api.getcount.com/partners/invoices
Request
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"
    }
  }
}