---
title: "Apply customer edit reviews (v4)"
method: POST
path: "/api/v1/business/customer-edit-reviews/apply-v4"
tags: ["business"]
---

# Apply customer edit reviews (v4)

`POST /api/v1/business/customer-edit-reviews/apply-v4`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/business/customer-edit-reviews/apply-v4`
- Auth: OAuth 2 (authorization code, authorization URL `https://auth.point11.ai/oauth2/authorize`, token URL `https://auth.point11.ai/oauth2/token`)

Save a bulk edit review as approved, up to 20 customers per call (apply more in parts, each standing alone), in one transaction: each named customer gets one version holding exactly the reviewed changes and the member's overrides (keyed as business_customers_update_v4 takes them, name excepted; the household as counts) and joins its labels, missing ones created. The review is a business_customer_edit_reviews_create_v5 run or one its version 4 started. Edits follow business_customers_update_v4's rules, each customer's outcome naming the fields they set; a value its buyer type lacks is INVALID_INPUT (CUSTOMER_VERSION_ATTRIBUTE_NOT_APPLICABLE, naming the customer): remove it, apply again. STALE_WRITE saves nothing when a customer or option changed since (review again) or the review predates the customer model (review_before_customer_model: propose again). Each new version reruns its customer as business_customers_update_v4 describes; labels alone make no version.

## Headers

- `Point11-Organization` string, uuid
- `Idempotency-Key` string, uuid, required

## Request body

- BusinessCustomerEditReviewsApplyV4Request
  - `reviewRunId` string, uuid, required: The review run whose proposal to apply
  - `customerIds` string[], required: The reviewed customers to apply, each with changes: up to 20 in one call, saved in one transaction; apply a larger review in parts
  - `overrides` object[]: What the member changed on the review before applying, per customer; Apply writes the review's proposal with these in place of the fields they name
    - `customerId` string, uuid, required
    - `values` object: Fields set on the review, by the customer model's keys, each replacing what it proposed or set beside it: a fact as text, a category as one of its option ids, the place; the name, which the review never proposes, as text
      - `name` string, nullable
      - `gender` string, nullable
      - `age` object
        - `value` string, nullable
        - `band` string, nullable
      - `language` string, nullable
      - `location` object, nullable
        - `countryCode` string, nullable, required
        - `subdivisionCode` string, nullable, required
        - `locality` string, nullable, required
        - `postalCode` string, nullable, required
        - `country` string, nullable, required
        - `subdivision` string, nullable, required
      - `market` string, nullable
      - `areaType` string, nullable
      - `education` string, nullable
      - `lifeStage` string, nullable
      - `household` object, nullable
        - `adults` integer, nullable, required
        - `children` integer, nullable, required
        - `pets` integer, nullable, required
      - `householdIncome` object
        - `value` string, nullable
        - `band` string, nullable
      - `jobTitle` string, nullable
      - `occupation` string, nullable
      - `seniority` string, nullable
      - `employer` string, nullable
      - `yearsInRole` string, nullable
      - `companySize` object
        - `value` string, nullable
        - `band` string, nullable
      - `annualRevenue` string, nullable
      - `audience` string, nullable
      - `product` string, nullable
      - `channel` string, nullable
      - `buyerRole` string, nullable
      - `stakeholders` string, nullable
      - `intentStage` string, nullable
      - `budget` string, nullable
      - `constraints` string, nullable
      - `job` string, nullable
      - `situation` string, nullable
      - `triggerType` string, nullable
      - `trigger` string, nullable
      - `functionalNeed` string, nullable
      - `emotionalNeed` string, nullable
      - `socialNeed` string, nullable
      - `desiredOutcome` string, nullable
    - `newValues` object: Open categories stated in words, each replacing what the review proposed: the option with that label, else a new value for the customer's business profile
      - `market` string
      - `occupation` string
      - `audience` string
      - `product` string
      - `channel` string
      - `buyerRole` string
      - `job` string
      - `triggerType` string
    - `labels` string[]: The labels to add the customer to, replacing the review's; [] adds none
    - `product` string, nullable: The customer's Product, replacing the review's: the revenue line id of one of its business profile's products (create a product the review proposed as new with business_revenue_lines_create_v2 first, then name it here); null keeps the product it has

## Response `200`

Success.

- BusinessCustomerEditReviewsApplyV4Response
  - `customers` object[], required
    - `customerId` string, uuid, required
    - `customerVersionId` string, uuid, nullable, required
    - `version` integer, nullable, required
    - `derivedFields` string[], required
    - `newValues` object[], required
      - `field` 'market' | 'occupation' | 'audience' | 'product' | 'channel' | 'buyerRole' | 'job' | 'triggerType', required
      - `id` string, uuid, required
      - `label` string, required
      - `created` boolean, required
    - `place` union, required
      - object
        - `outcome` 'placed', required
        - `subdivisionCode` string, nullable, required
      - object
        - `outcome` 'unresolved', required
        - `reason` string, required
      - object
        - `outcome` 'unchecked', required
  - `labels` object[], required
    - `id` string, uuid, required
    - `name` string, required
    - `created` boolean, required
    - `customerIds` string[], required
  - `rerun` object, required: The apply's rerun: the customers that got a new version rerun in their live campaigns; none when the apply only added labels
    - `requestId` string, uuid, required: The edit's rerun request; list its reruns with campaigns_member_reruns_list_v1
    - `joinedRequestIds` string[], required: Earlier edits' rerun requests this edit joined: a customer whose rerun an earlier edit asked for has not started yet reruns once, on its newest version, and that rerun is listed under the earlier request, not requestId
    - `customers` integer, required: Customers that rerun
    - `campaigns` integer, required: Campaigns they rerun in
    - `skipped` object[], required: Campaigns an edited customer is in that take no rerun
      - `campaignId` string, uuid, required
      - `product` 'discovery' | 'research' | 'experience', required
      - `reason` string, required: Why it takes no rerun: campaign_paused, campaign_held, one_time, pulse, point11_campaign or not_started; or Billing's refusal reason (such as no_subscription, billing_suspended or interaction_unavailable) when Billing would not admit the product's reruns
      - `message` string, nullable, required: Billing's own sentence for the member when Billing refused the product's reruns; null for every other reason
      - `paymentDisputeHold` true: Present when Billing refused because the account is on hold while a payment dispute is reviewed: offer support, not a payment method update

## Other responses

- `400`: The input, query, or Idempotency-Key is invalid.
- `401`: The bearer is missing, expired, or not accepted.
- `402`: Billing refused the write: the code names the reason and `details.reason` carries it.
- `403`: The credential lacks the operation's scope or role, or the operation needs a different door.
- `404`: The resource or organization does not exist for this caller.
- `405`: This path takes another HTTP method, named in `Allow`.
- `409`: The request conflicts with current state or with prior use of its Idempotency-Key.
- `413`: The request, or the answer it asks for, is too large; narrow it.
- `429`: The credential's rate budget is spent; retry after `Retry-After` seconds.
- `500`: An unexpected server failure; retry later. Only `request_id` identifies it.
- `503`: A dependency is temporarily unavailable; retry after `Retry-After` seconds.
- `default`: Another status a product answers for its own refusal (for example `415` for an unsupported attachment); branch on `code`.

---

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