COUNTCOUNT
Sign Up
InvoicesCreate an invoice

Create an invoice

POST/partners/invoices

Creates an invoice, estimate, or credit memo (invoiceType: "memo").

Required: exactly one of customerUuid OR inline customer object, date, invoiceNumber, and products[] with productUuid OR inline product on each line. Optional isDraft (false posts revenue journals for migrations). Response may include _partnerInlineCreated.

HMAC signature + Bearer access token
Try this request

Request body

customerUuiduuid

Existing customer UUID. Mutually exclusive with customer.

customerobject

Inline customer when customerUuid is omitted.

customerstringrequired

Customer display name.

invoiceTypeenum

Document type. Defaults to invoice.

One of: invoice, estimate, memo

datedaterequired

Invoice date (ISO).

dueDatedate

Due date (ISO).

currencystring

ISO 4217 currency code.

invoiceNumberstringrequired

Invoice number shown to the customer.

productsarrayrequired

The products or services billed on this invoice.

productUuiduuid

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

descriptionstring

Line description.

quantitynumberrequired

Quantity billed.

unitPricenumberrequired

Price per unit.

nonTaxableboolean

When true, clears tax on the line.

appliedToInvoiceUuiduuid

For credit memos: link to an open invoice at create time.

isDraftboolean

When false, approves and posts revenue journals immediately (migration use case). Defaults to draft.

Responses

201Invoice created successfully.
400Bad request — validation failed.
404Customer or product not found.
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": "invoice",
  "invoiceNumber": "INV-1042",
  "date": "2026-03-01",
  "dueDate": "2026-03-31",
  "currency": "USD",
  "products": [
    {
      "productUuid": "aa11bb22-cc33-dd44-ee55-ff6677889900",
      "description": "Consulting services",
      "quantity": 10,
      "unitPrice": 100,
      "nonTaxable": false
    }
  ]
};
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": "f6a7b8c9-d0e1-2345-fabc-456789012345",
      "invoiceNumber": "INV-1042",
      "invoiceType": "invoice",
      "customerUuid": "dfa3219e-6af8-4c53-997a-037534f63a35",
      "date": "2026-03-01",
      "dueDate": "2026-03-31",
      "currency": "USD",
      "status": "draft",
      "isDraft": true,
      "approved": false,
      "isSent": false,
      "paymentStatus": "unpaid",
      "subtotal": 1000,
      "taxTotal": 85,
      "total": 1085,
      "amountDue": 1085,
      "products": [
        {
          "productUuid": "aa11bb22-cc33-dd44-ee55-ff6677889900",
          "description": "Consulting services",
          "quantity": 10,
          "unitPrice": 100,
          "nonTaxable": false
        }
      ],
      "createdAt": "2026-03-01T09:00:00.000Z",
      "updatedAt": "2026-03-02T11:15:00.000Z"
    }
  }
}