> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/developers/api-reference/reference/objects/visit-completion.md).

# The visit completion object

The visit completion object in the Shortcut API - every field, an example, and the endpoints that return it.

The result of completing a visit.

## Fields

| Field                      | Type                                                                                                                                                                                     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `object`                   | `"visit_completion"`                                                                                                                                                                     | Always `visit_completion`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `visit`                    | [visit](/developers/api-reference/reference/objects/visit.md) object                                                                                                                     | The visit, now completed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `completedVisitIds`        | array of id                                                                                                                                                                              | The visits this request completed: the visit itself, plus its stop's other open services with `completeStop`. Empty when nothing was left to complete.                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `alreadyCompletedVisitIds` | array of id                                                                                                                                                                              | Visits this request found already completed (in the app, by a crew, or by an earlier attempt): the visit itself, and with `completeStop` the stop's other completed services. Nothing was written for them.                                                                                                                                                                                                                                                                                                                                                                                         |
| `holdId`                   | id or null                                                                                                                                                                               | The visit's completion record, which billing runs from. Null for a visit completed before completion records existed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `finalizeAt`               | timestamp or null                                                                                                                                                                        | When billing runs (ISO 8601 in UTC): the end of the same undo window completing in the app has. Null once billed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `billing`                  | `pending`, `invoiced`, `covered_by_prepay`, `invoice_manual`, `invoice_scheduled`, `invoice_review`, `not_billed`                                                                        | `pending` until billing runs. Then `invoiced` (the visit is on an invoice), `covered_by_prepay` (a prepayment covers it), or `invoice_manual` / `invoice_scheduled` / `invoice_review` (the visit's work waits to be invoiced by hand, on a schedule, or after review). `not_billed`: completed without a completion record and on no invoice.                                                                                                                                                                                                                                                      |
| `invoiceId`                | id or null                                                                                                                                                                               | The invoice the visit is on, once billed. Until billing runs it is null; read it later from the visit's `invoiceId`, from `GET /v1/invoices`, or from the `invoice.created` webhook event.                                                                                                                                                                                                                                                                                                                                                                                                          |
| `addOnInvoiceId`           | id or null                                                                                                                                                                               | When the visit's work waits to be invoiced by hand or on a schedule, its field add-ons are billed at once on their own invoice; that invoice. The visit's `invoiceId` stays null. Otherwise null.                                                                                                                                                                                                                                                                                                                                                                                                   |
| `effects`                  | array of `invoice_on_finalize`, `autopay_on_finalize`, `invoice_created`, `add_on_invoice_created`, `notification_queued`, `notification_sent`, `autopay_attempted`, `covered_by_prepay` | Before billing runs: `invoice_on_finalize` (billing will invoice the visit, unless a prepayment covers it) and `autopay_on_finalize` when the customer has autopay on with a usable saved card; neither when billing will hold the visit (an hourly visit waits for the office's review; a workspace or customer that invoices by hand or on a schedule). After: `invoice_created` or `add_on_invoice_created`, `notification_queued` or `notification_sent` (that invoice's delivery to the customer), `autopay_attempted` (a charge to the saved card was made or tried), or `covered_by_prepay`. |

## Example

```json
{
  "object": "visit_completion",
  "visit": {
    "id": "68ac53da-64f6-4f21-8140-ca685d8b05af",
    "object": "visit",
    "date": "2026-10-16",
    "status": "completed",
    "closeReason": null,
    "jobId": "b4d33749-b11d-4290-8d67-add7a9b1e91e",
    "jobName": "Weekly mowing",
    "customerId": "bc88d55e-b8d3-40a5-851d-4becb1678733",
    "propertyId": "88bdec39-8508-4780-8152-62c77d9c9e0e",
    "address": "412 Elm St, Bozeman, MT 59715",
    "assignedTeamId": "d6b0bdb1-d2fa-48f8-8f45-343fcb8f6f86",
    "effectiveTeamId": "d6b0bdb1-d2fa-48f8-8f45-343fcb8f6f86",
    "routePosition": 1,
    "plannedStartAt": null,
    "plannedEndAt": null,
    "estimatedDurationMinutes": 30,
    "arrivedAt": "2026-10-16T16:34:51.000Z",
    "completedAt": "2026-10-16T17:02:18.000Z",
    "invoiceId": null,
    "createdAt": "2026-10-01T15:02:20.114Z",
    "updatedAt": "2026-10-16T17:04:12.381Z"
  },
  "completedVisitIds": [
    "68ac53da-64f6-4f21-8140-ca685d8b05af"
  ],
  "alreadyCompletedVisitIds": [],
  "holdId": "272eeef4-2379-4a3b-8fc3-65821c0da0c9",
  "finalizeAt": "2026-10-16T17:07:18.000Z",
  "billing": "pending",
  "invoiceId": null,
  "addOnInvoiceId": null,
  "effects": [
    "invoice_on_finalize"
  ]
}
```

## Endpoints

| Endpoint                        | What it does     |
| ------------------------------- | ---------------- |
| `POST /v1/visits/{id}/complete` | Complete a visit |
