---
title: "Prescreen campaigns (v2)"
method: POST
path: "/api/v1/experience/campaigns/prescreen-v2"
tags: ["experience"]
---

# Prescreen campaigns (v2)

`POST /api/v1/experience/campaigns/prescreen-v2`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/experience/campaigns/prescreen-v2`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://auth.point11.ai/oauth2/authorize`, token URL `https://auth.point11.ai/oauth2/token`)

Screen a complete Burst while the customer is still reviewing it, with the input experience_campaigns_start_v4 takes and mode burst. Commits, funds, and dispatches nothing. The same idempotency key reaches the same screening attempt, so a later start with that key and an unchanged grid answers from it instead of screening again. A launch that follows a Discovery campaign also learns how many of its customers it would shop (followedCustomerCount) and at how many of its stores (followedStoreCount); it refuses as the start would when that campaign cannot be followed. A launch that names stores likewise learns how many customers at them it would shop (locationCustomerCount) and at how many of them (locationStoreCount), and refuses as the start would when a store is not the profile's, none of their customers can visit, or its new stores would generate more customers than one Discovery settings Save may; when stores it picked on Google Maps have no customers yet, it also learns the one-time generation their setup needs and what it costs (customerGeneration).

## Headers

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

## Request body

- ExperienceCampaignsPrescreenV2Request
  - `mode` 'burst', required
  - `campaignName` string, required
  - `browserDevices` string[]: The devices every customer shops each page on, each once; each device's visit is one experience run. Absent, desktop and mobile. A nativeApp names mobile alone.
  - `agents` string[]: The agents that shop every customer on every page and device, each once (1 to 5). point11 is Point11's own shopper; dots (OpenAI Dots), spark (Gemini Spark), muse (Meta Muse) and grok_bot (Grok Bot) each run the model that vendor's agent most likely uses, in Point11's browser, never as the real agent. Each agent's visit is one experience run at the same price. Absent, point11 alone. A settings Save changes them from the next cycle.
  - `businessProfileId` string, uuid, required
  - `customerIds` string[]: The customers who visit: at least one, and as many as the launch's 1,000 visits hold (each customer visits every page on every device with every agent). Not with follows or stores (locationKeys, locationContexts), which choose them.
  - `follows` ExperienceFollows: Instead of customerIds, follow a Discovery campaign for a share of its customers, as Bootup's Experience takes them: at the launch, of the customers on its roster the launch admits, in the order Discovery sampled them, the first 1 in sampleEvery (rounded up) at each of its stores, at most 100 dealt one per store. The campaign records the follow, and each later scheduled cycle re-reads that roster: a customer who left it leaves, each store the campaign's customers no longer cover lends its share up to 100, a customer still on it stays, and a Save changes no customers; while the followed campaign is archived the customers stay as they are and a restore resumes the follow at the next scheduled cycle, and once it is deleted they stay for good. A Forecast campaign lends its Forecast's customers. To shop each customer's direct competitors too, competitorSourceCampaignId names this same campaign.
    - `campaignId` string, uuid, required: A Discovery campaign on the same business profile (discovery_campaigns_list_v1's businessProfileId), active or paused, with a finished round.
    - `sampleEvery` integer, required: 1 in how many of its customers shop: 1 is every customer, at most 1 in 20.
  - `locationKeys` string[]: Instead of customerIds or follows, the business profile's stores whose customers visit (1 to 100): each a location key business_store_profile_summaries_get_v1 lists under businessProfileId; a key that is not one of its stores now is refused. At the launch, every customer at them the launch admits, dealt one per store in the profile's store order until 100, as a followed local Discovery campaign's share is at 1 in 1. They are chosen once and become the campaign's customers; nothing of the stores is recorded.
  - `destinationUrls` string[], required
  - `connectionAccess` object
    - `connection` object, required
      - `connectionId` string, uuid, required
      - `revision` integer, required
    - `account` object
      - `accountId` string, uuid, required
      - `revision` integer, required
  - `nativeApp` object
    - `platform` 'ios' | 'android', required
    - `buildId` string, uuid, required
    - `sha256` string, required
    - `appId` string, required
    - `versionLabel` string, required
    - `deviceName` string, required
    - `osVersion` string, required
  - `objective` string, required
  - `competitorSourceCampaignId` string, uuid: A Discovery campaign on the same business profile (discovery_campaigns_list_v1's businessProfileId). Each run, every customer also shops every brand its latest settled conversation there labelled a direct competitor; a customer with none shops the pages alone. Set at launch, never changed. Public websites only: not with connectionAccess or nativeApp.
  - `locationContexts` DiscoveryLocationContextsItem[]: Instead of customerIds or follows, and beside locationKeys, stores picked on Google Maps whose customers visit: each one store, one address (the finder's pick carries its googlePlace). A pick the business profile already has as a store with customers is that store; any other is set up first as a Discovery campaign sets up a store: verified on Google Maps, researched as a store and given 97 customers, a one-time customer-generation charge the prescreen quotes; the launch then shops its share of every store's customers. 100 stores at most with locationKeys. New stores that together would generate more than 5000 customers, the most one Discovery settings Save generates, refuse the launch (INVALID_INPUT), and so does a store Google Maps cannot place (LOCATION_UNMAPPABLE).
    - `addresses` DiscoveryAddressesItem[], required
      - `googlePlace` object, nullable
        - `placeId` string, required
        - `requestToken` string, uuid, required
        - `callId` string, uuid, required
        - `requestFingerprint` string, required
      - `label` string, nullable
      - `storeId` string, nullable
      - `street` string, nullable
      - `city` string, nullable
      - `region` string, nullable
      - `postalCode` string, nullable
      - `country` string, nullable
      - `latitude` number, nullable
      - `longitude` number, nullable
      - `url` string, nullable
      - `notes` string, nullable
      - `serviceArea` object
        - `campaignBoundary` object
          - `areas` object[], required
            - `query` string, required
            - `countryCode` string, nullable
            - `weightPct` number, nullable
          - `evidenceNote` string, nullable
        - `configuredRule` object
          - `strategy` 'premises_deepest_reliable', required
          - `version` 'physical-service-area:v1', required
    - `market` string, nullable
    - `country` string, nullable
    - `storeIds` string[]
    - `sourceNotes` string[]

## Response `200`

Success.

- ExperienceCampaignsPrescreenV2Response
  - `outcome` 'allowed', required
  - `followedCustomerCount` integer, nullable, required: How many of the followed Discovery campaign's customers the launch would shop now, its share; Start chooses them again. Null unless the launch follows a Discovery campaign.
  - `followedStoreCount` integer, nullable, required: How many of the followed Discovery campaign's stores the share's customers are at; 0 for a campaign that measures no stores. Null unless the launch follows a Discovery campaign.
  - `locationCustomerCount` integer, nullable, required: How many customers at the stores locationKeys and locationContexts name the launch would shop, its share of at most 100, the customers its new stores' setup generates included; Start chooses them again. Null unless the launch names stores.
  - `locationStoreCount` integer, nullable, required: How many of the stores locationKeys and locationContexts name the share's customers are at, its new stores included. Null unless the launch names stores.
  - `customerGeneration` object, nullable, required: The one-time customer generation the launch's new stores need, which the organization pays as it is delivered. Null unless a store locationContexts names has no customers yet.
    - `storeCount` integer, required: How many of the stores have no customers yet and are set up.
    - `customerCount` integer, required: How many customers their setup generates: 97 at each store, as a Discovery campaign sets up a store.
    - `amountCents` integer, nullable, required: What those customers accrue once, at today's customer-generation price, against the organization's plan; null while the price cannot be read.

## 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)
