---
title: "Add a payment to a Job"
method: POST
path: "/v2/jobs/{id}/payments"
tags: ["Jobs"]
---

# Add a payment to a Job

`POST /v2/jobs/{id}/payments`

## Request

- Base URL: `https://api.workiz.com/crm/api`
- URL: `https://api.workiz.com/crm/api/v2/jobs/{id}/payments`
- Auth: none declared. Required headers: `Authorization`
- TypeScript: <https://skmtc.dev/workiz/apis/developer-api/docs/v2/jobs/:id/payments/post.ts> (a function with typed inputs; its response is checked against the schema)

> **Beta:** Breaking changes may occur without notice.

Adds a payment to a Job and returns the created payment. Recalculates the job totals and amount due as a side effect.

## Path parameters

- `id` string, required

## Headers

- `Authorization` string, required

## Request body

- CreateGenericPaymentV2Dto
  - `type` 'cash' | 'credit' | 'check', required: The type of the payment.
  - `amount` number, required: The payment amount. Must be a positive number.
  - `confirmationCode` string: A free-text reference or confirmation note for the payment.
  - `date` string: The date and time of the payment. If not provided, defaults to the current timestamp.

## Response `201`

The created payment.

- ResponseLinkedPaymentV2Dto
  - `id` string: The ID of the payment (prefix `PAY-`).
  - `date` string, date-time: The date and time the payment was collected.
  - `amount` number: The amount the client was charged. Reported for a failed payment too, so check `status` before counting it as money collected.
  - `tipAmount` number: The tip amount included in the payment.
  - `type` 'charge' | 'cash' | 'credit' | 'check' | 'refund' | 'refund_offline' | 'bank_transfer' | 'bank_transfer_offline' | 'cash_app' | 'consumer_financing' | 'venmo' | 'zelle' | 'debit_offline' | 'installments' | 'interac' | 'check_deposit': The type of the payment.
  - `status` 'pending' | 'failed' | 'succeeded': The status of the payment.
  - `estimateId` string, nullable: The ID of the estimate the payment was collected against (prefix `ES-`), or null when the payment is not tied to an estimate.
  - `confirmationCode` string: The confirmation code of the payment.
  - `collectedById` string, nullable: The ID of the user who collected the payment (prefix `USR-`), or null when the payment was not collected by a user.
  - `invoiceId` string, nullable: The ID of the invoice the payment was collected against (prefix `IV-`), or null when the paid document is not invoiced.
  - `jobId` string, nullable: The ID of the job the payment was collected against (prefix `JOB-`, or `LD-` for a lead), or null when the payment belongs to a standalone invoice or estimate.

## Other responses

- `400`: Invalid input.
- `401`: Missing or invalid authentication token.
- `403`: The API key does not have permission to access this resource.
- `404`: Job not found.
- `429`: Rate limit exceeded.

## Changes

- **2026-09-29** `a2110eaa32f2`: 6 breaking, 18 warning, 10 info
  - the response property `estimateId` became nullable for the status `201`
  - the response property `invoiceId` became nullable for the status `201`
  - the response property `jobId` became nullable for the status `201`
  - the response property `amount` became optional for the status `201`
  - …30 more
- **2026-09-24** `e789622c50ef`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/workiz/apis/developer-api/changes/v2/jobs/:id/payments/post.md)

---

[API](https://skmtc.dev/workiz/apis/developer-api.md) - [All operations](https://skmtc.dev/workiz/apis/developer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/workiz/apis/developer-api/revisions/fb557783146c?raw)
