COUNTCOUNT
Sign Up
BillsAssign transactions as payment

Assign transactions as payment

POST/partners/bills/{uuid}/assign-transaction

Settles one or more whole transactions against an approved bill or vendor memo.

Each transaction settles its full amount, and together they cannot exceed the open balance. A bill takes Expense transactions; a vendor memo takes Income transactions, which records a refund received from the vendor. Each transaction is re-categorized to Accounts Payable. The bill must be approved and in the workspace currency — pay a foreign-currency bill with POST /partners/transactions/{transactionId}/assign-to-bills-invoices instead. Transactions must be in the bill currency and must not be pending, excluded, reviewed, or already linked to another bill or invoice. Undo with POST /{uuid}/unassign-transaction. MCP equivalent for vendor memo refunds: COUNT_record_vendor_memo_refund.

HMAC signature + Bearer access token
Try this request

Path parameters

uuiduuidrequired

The bill or vendor memo UUID.

Request body

transactionsarrayrequired

Transaction UUIDs from the Transactions API.

Responses

200Transactions assigned. The response is the updated bill, not wrapped in the standard envelope.
400No transactions sent; bill is draft, submitted, or rejected; bill is in a foreign currency; wrong transaction type; transaction is pending, excluded, reviewed, or already linked; or the total exceeds the unpaid amount.
404Bill not found, or one or more transactions not found in the bill currency.
409The bill changed while the payment was being applied. Refresh and retry.
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/bills/{uuid}/assign-transaction
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 = '/bills/3fa85f64-5717-4562-b3fc-2c963f66afa6/assign-transaction';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = {
  "transactions": [
    "b7c8d9e0-f1a2-3456-bcde-678901234567"
  ]
};
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/bills/3fa85f64-5717-4562-b3fc-2c963f66afa6/assign-transaction`, {
  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 · 200
{
  "id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
  "billNumber": "BILL-1042",
  "billType": "bill",
  "date": "2026-01-15",
  "dueDate": "2026-02-15",
  "currency": "USD",
  "approvalStatus": "approved",
  "status": "paid",
  "total": 250,
  "paidAmount": 250,
  "amountDue": 0,
  "notes": "Office supplies for Q1",
  "purchaseOrderNumber": null,
  "isDeleted": false,
  "vendor": {
    "id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
    "name": "Office Depot",
    "email": "ap@officedepot.example"
  },
  "lineItems": [
    {
      "id": "a4b5c6d7-e8f9-0123-abcd-456789012345",
      "description": "Office supplies",
      "quantity": 1,
      "price": 250,
      "total": 250,
      "categoryAccountUuid": "c3d4e5f6-a7b8-9012-cdef-123456789012"
    }
  ],
  "transactions": [],
  "appliedVendorMemos": [],
  "tagUuids": [],
  "createdAt": "2026-01-15T10:30:00.000Z",
  "updatedAt": "2026-01-28T14:22:30.000Z"
}