COUNTCOUNT
Sign Up
Expense ReceiptsUpload expense receipt

Upload expense receipt

POST/partners/expense-receipts

Creates an expense receipt, optionally with a receipt image.

Send multipart/form-data with optional `receipt` file field plus text fields for metadata. UUID fields: accountUuid, categoryAccountUuid, expenseReportTypeUuid, vendorUuid, projectUuid, tagUuids (comma-separated), taxUuids (comma-separated).

HMAC signature + Bearer access token
Try this request

Request body

receiptstring

Receipt image file (multipart field, max 10 MB).

amountnumber

Receipt amount.

datedate

Receipt date (YYYY-MM-DD).

descriptionstring

Notes or memo.

accountUuiduuid

Reimbursement account UUID.

categoryAccountUuiduuid

Expense category account UUID.

expenseReportTypeUuiduuid

Expense report type UUID.

vendorUuiduuid

Vendor UUID.

projectUuiduuid

Project UUID.

tagUuidsstring

Comma-separated tag UUIDs.

taxUuidsstring

Comma-separated tax UUIDs.

receiptSplitedboolean

Whether to split across categories.

splitsarray

Split rows when receiptSplited is true.

Responses

201Expense receipt created.
400Validation failed or split amounts do not balance.
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/expense-receipts
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 = '/expense-receipts';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = {
  "amount": 45.99,
  "date": "2026-03-01",
  "description": "Team lunch",
  "accountUuid": "c8d9e0f1-a2b3-4567-cdef-789012345678",
  "categoryAccountUuid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "projectUuid": "11223344-5566-7788-99aa-bbccddeeff00"
};
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/expense-receipts`, {
  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",
  "message": "Success on creating pending receipt",
  "data": {
    "pendingReceipt": {
      "id": "44556677-8899-aabb-ccdd-eeff00112233",
      "amount": 45.99,
      "currency": "USD",
      "date": "2026-03-01",
      "description": "Team lunch",
      "matched": false,
      "receiptSplited": false,
      "account": {
        "uuid": "c8d9e0f1-a2b3-4567-cdef-789012345678",
        "name": "Business Checking"
      },
      "categoryAccount": {
        "uuid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
        "name": "Meals & Entertainment"
      },
      "vendor": null,
      "project": {
        "uuid": "11223344-5566-7788-99aa-bbccddeeff00",
        "name": "Website Redesign"
      },
      "customer": {
        "uuid": "dfa3219e-6af8-4c53-997a-037534f63a35",
        "customer": "Acme Corporation"
      },
      "tags": [],
      "taxes": [],
      "createdAt": "2026-01-15T10:30:00.000Z",
      "updatedAt": "2026-01-28T14:22:30.000Z"
    }
  }
}