---
title: "Adjust uploaded conversions"
method: POST
path: "/v1/ads/conversions/adjustments"
tags: ["Conversions"]
---

# Adjust uploaded conversions

`POST /v1/ads/conversions/adjustments`

Adjust conversions that were previously uploaded via `POST /v1/ads/conversions`:
retract them, restate their value, or enhance them with first-party data. Requires
the Ads add-on.

**Google Ads only.** Google handles adjustments through the classic Google Ads API
(`ConversionAdjustmentUploadService`); the Data Manager `ingestEvents` path used for
sending conversions is ingest-only. Meta and LinkedIn have no equivalent, so this
endpoint returns `405` for those platforms.

Adjustment types:

- `RETRACTION`: remove the conversion entirely (refund, chargeback, cancelled order, churn).
- `RESTATEMENT`: change the conversion's value (upgrade / downgrade / partial refund). Send the corrected **total** value in `restatementValue` (not a delta).
- `ENHANCEMENT`: attach first-party identifiers (hashed email / phone) to an existing conversion (enhanced conversions applied after the fact).

Identifying the original conversion (per adjustment):

- `orderId`: the transaction ID you sent as `eventId` on the original conversion. Recommended, and **required** for `ENHANCEMENT`.
- or `gclid` + `conversionTime`: the click ID and the original conversion's time (unix seconds). Not available for `ENHANCEMENT`.

`destinationId` is the conversion action resource name, e.g.
`customers/1234567890/conversionActions/987654321` (same value you send to
`POST /v1/ads/conversions`). PII in `user` is hashed with SHA-256 server-side
(Gmail-specific normalization included). Send plaintext.

Times are unix seconds; we convert to Google's required
`yyyy-MM-dd HH:mm:ss+00:00` format. Up to 2000 adjustments per request; partial
failure is supported (inspect `adjustmentsFailed` / `failures[]`).

## Request body

- object
  - `accountId` string, required — SocialAccount ID. Must be a `googleads` account.
  - `destinationId` string, required — Conversion action resource name, e.g. `customers/1234567890/conversionActions/987654321`.
  - `adjustments` object[], required
    - `adjustmentType` 'RETRACTION' | 'RESTATEMENT' | 'ENHANCEMENT', required
    - `adjustmentTime` number, required — When the adjustment occurred, unix seconds.
    - `orderId` string — Transaction ID of the original conversion (the `eventId` you sent). Recommended; required for ENHANCEMENT.
    - `gclid` string — Alternative key. The original click ID. Pair with `conversionTime`. Not valid for ENHANCEMENT.
    - `conversionTime` number — The original conversion's time, unix seconds. Required when identifying by `gclid`.
    - `restatementValue` number — RESTATEMENT only. The corrected TOTAL conversion value.
    - `currency` string — RESTATEMENT only. ISO 4217 currency for `restatementValue`.
    - `user` object — ENHANCEMENT only. First-party identifiers (hashed server-side). At least one of email/phone required.
      - `email` string
      - `phone` string
    - `userAgent` string — ENHANCEMENT only. The original conversion's user agent (improves match quality).

## Response `200`

Adjustments processed. Inspect `adjustmentsFailed` and `failures[]` for
partial failure (Google reports per-row errors via partial failure).

- object
  - `platform` 'googleads'
  - `adjustmentsReceived` integer — Adjustments accepted by Google.
  - `adjustmentsFailed` integer — Adjustments rejected (see failures).
  - `failures` object[]
    - `adjustmentIndex` integer — Index into the submitted adjustments array.
    - `message` string
    - `code` union
      - string
      - integer
  - `traceId` string

## Other responses

- `400` — Invalid body, or a malformed adjustment (missing key, missing restatementValue for RESTATEMENT, missing identifiers for ENHANCEMENT).
- `401` — Unauthorized
- `403` — Ads access required (Ads add-on on legacy plans, included on usage-based plans).
- `404` — The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `405` — Conversion adjustments are only available for Google Ads (the account's platform is not `googleads`).
- `409` — The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.

## Changes

- **2026-09-16** `3e6ddf2a99ea` — 2 info
  - added the optional property `details/budgetScope` to the response with the `404` status
  - added the optional property `details/budgetScope` to the response with the `409` status
- **2026-09-15** `0dba7d004d75` — 4 info
  - added the optional property `details/quotaExhausted` to the response with the `404` status
  - added the optional property `details/quotaExhausted` to the response with the `409` status
  - added the optional property `details/quotaScope` to the response with the `404` status
  - added the optional property `details/quotaScope` to the response with the `409` status
- **2026-09-10** `e70ed06e7150` — 2 info
  - added the media type `application/json` for the response with the status `404`
  - added the non-success response with the status `409`

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/conversions/adjustments/post.md)

---

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