---
title: "Approve, and write a Change Event to Procore"
method: POST
path: "/tickets/{id}/approve"
tags: ["Tickets"]
---

# Approve, and write a Change Event to Procore

`POST /tickets/{id}/approve`

## Request

- Base URL: `https://app.fieldstub.com/v1`
- URL: `https://app.fieldstub.com/v1/tickets/{id}/approve`
- Auth: HTTP bearer

Writes money into the customer's Procore. Check GET /projects/{project_id}/capability first on an unfamiliar project: without Project Financials there is no Change Events tool and this returns 409 until you pass destination daily_log. Idempotent: approving an already-written ticket returns it unchanged rather than creating a second Change Event. A previously rejected ticket can be approved, but only with allow_rejected. A line with no budget code at all is refused unless allow_unrouted is true. Set require_exact if no human is watching: it also refuses lines that merely matched a plausible code, which is the case a person would catch on screen and a program would not.

## Path parameters

- `id` string, required

## Request body

- object
  - `allow_unrouted` boolean: Accept the blank budget code for lines that could not be routed. Says out loud that somebody chose to.
  - `allow_rejected` boolean: Approve a ticket somebody already rejected. Without it, approving a rejected ticket returns 409: rejecting is not a write and is reversible, but overriding the person who did it should be deliberate. The MCP tool does not expose this.
  - `require_exact` boolean: Refuse any line that is not on a confirmed budget code, including one that only matched loosely. Use it whenever no person is reviewing the write; the MCP server always sets it.
  - `routes` object: Per-line budget code override, keyed by the line index from routing. Value is a WBS code id.
  - `destination` 'change_event' | 'daily_log': Where to file it. Omitted on a project with Project Financials, it writes a Change Event. On a project without it, approve returns 409 no_change_events until daily_log is passed explicitly. That is deliberate: a daily log bills nothing and cannot carry the photos, so it is never chosen for you.

## Response `200`

OK

- object

## Other responses

- `404`: Error
- `409`: Error
- `502`: Error

---

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