---
title: "Get campaigns (v3)"
method: GET
path: "/api/v1/experience/campaigns-v3/{id}"
tags: ["experience"]
---

# Get campaigns (v3)

`GET /api/v1/experience/campaigns-v3/{id}`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/experience/campaigns-v3/{id}`
- 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`)

Get one Experience campaign's scope and progress: its websites, date window, results window (the day its figures are as of and the interactions and customers the 30 days ending with it hold), and how many journeys are scheduled, running, and finished. Set journeys to also read one page of its journeys in that window, as experience_journeys_list_v5 lists them. Read its figures with experience_campaign_analytics_get_v9.

## Path parameters

- `id` string, uuid, required: The Experience campaign's id

## Query parameters

- `destination` string, nullable: A campaign website's id (destinations[].id) or name; absent reads the campaign's own measured website
- `journeys` boolean: Also read one page of the campaign's journeys (journeys), as experience_journeys_list_v5 lists them, in the same read: over the window this read resolves (dateScope.window) and its segments, filtered and sorted by the journeys* fields (ignored without it)
- `journeysWebsite` string: Only journeys to this campaign website (a destinations[].id); absent, or an id none of the campaign's websites has, is every website
- `journeysCursor` string: Opaque cursor returned as journeys.nextCursor or journeys.previousCursor by another page
- `journeysSearch` string: The page's search over customer, website and coverage; it matches on the first 200 characters
- `journeysOutcome` 'all' | 'achieved' | 'not-achieved' | 'unavailable' | 'unscored' | 'limited': achieved and not-achieved are a pass and a fail; unavailable is every settled visit with neither verdict (unscored, could not tell, or limited evidence), of which unscored and limited are the narrower parts
- `journeysFriction` boolean: Only journeys the evaluator found friction in
- `journeysDevice` 'desktop' | 'mobile' | 'ios_safari', nullable: Only journeys on this device; absent is every device
- `journeysSort` 'customer' | 'desktop' | 'mobile' | 'ios_safari' | 'completedAt': What the page sorts by: a device sorts by quality among its passed journeys
- `journeysSortDesc` boolean: Sort descending (the default)

## Headers

- `Point11-Organization` string, uuid

## Response `200`

Success.

- ExperienceCampaignsGetV3Response
  - `latestEntry` ExperienceLatestEntry, required
    - `id` string, required
    - `sequence` integer, required: The entry's ordinal among its campaign's entries, from 1.
    - `failureReason` string, nullable, required: The code the entry settled with when it failed or was cancelled (for example no_unit_delivered or no_eligible_customers); null otherwise, or when it recorded no code.
    - `progress` ResearchProgress, required: The entry's units, counted from its product's delivered evidence.
      - `unitLabel` 'visit' | 'interview' | 'conversation', required: What one unit of this entry's work is: an Experience visit, a Research interview, a Discovery conversation.
      - `admission` 'entry' | 'unit', required: `entry`: the entry's work is admitted and billed once; `unit`: each unit is.
      - `counts` object, required
        - `admitted` integer, required: Units admitted to run.
        - `delivered` integer, required: Settled units the product counts as delivered.
        - `failed` integer, required: Units that ended without delivering: counted as each one ends where the entry's work is admitted once, and when a unit's own admission settles where each unit is.
        - `open` integer, required: Units that have not ended yet.
      - `outcome` 'running' | 'succeeded' | 'failed' | 'cancelled' | 'partial', required: Running until the entry settles; failed or cancelled when its product settled it so (a failed final result still counts the units it delivered); otherwise counted from the units: succeeded when every admitted unit delivered, partial when some did, failed when none did. An entry its product settled succeeded whose units no longer exist (all counts 0) stays succeeded.
      - `failureReasons` object[], required: Why the failed units failed, one row per reason with how many units it ended. A unit that failed while its admission still runs has no reason until that settles.
        - `reason` string, required
        - `count` integer, required
  - `campaign` ExperienceCampaign, required
    - `id` string, required
    - `key` string, required
    - `name` string, required
    - `mode` 'pulse' | 'burst', required
    - `status` 'active' | 'paused' | 'archived' | 'deleted', required
    - `objective` string, nullable, required
    - `profileUrl` string, required
    - `sourceDiscoveryCampaignName` string, nullable, required
    - `locationCount` integer, required
    - `pulseSampleEvery` integer, nullable, required
    - `createdAt` string, date-time, required
    - `agents` string[], required: The agents the campaign's cycles shop with from now, in product order: the segment scope's agent options (experience_campaign_segments_get's agents). point11 is Point11's own shopper; every other is simulated: the model its vendor's consumer agent runs, in Point11's browser
  - `destinations` object[], required
    - `id` string, required
    - `name` string, required
    - `url` string, nullable, required
    - `hostname` string, nullable, required
    - `isOriginalTarget` boolean, required
  - `selectedDestination` object, nullable, required
    - `id` string, required
    - `name` string, required
    - `url` string, nullable, required
    - `hostname` string, nullable, required
    - `isOriginalTarget` boolean, required
  - `dateScope` ExperienceDateScope, required
    - `window` object, nullable, required: The window the figures actually cover; null is all time
      - `from` string, date-time, required
      - `to` string, date-time, required
    - `widenedToAllTime` boolean, required
    - `availableDateRange` object, nullable, required: The days of the campaign's first and last interaction under the segment scope; null before its first
      - `from` string, date, required
      - `to` string, date, required
    - `outOfRange` object, nullable, required: Set when the requested window holds none of the campaign's interactions: the days of its first and last
      - `firstDay` string, date, required
      - `lastDay` string, date, required
  - `results` ExperienceResults, nullable, required: Every figure is over the campaign's interactions dated in the 30 UTC days ending with its day: a single figure as of asOf, a line one point per day from `from` to `to`. Null when the campaign has no interaction on or before the range's end under the scope
    - `from` string, date, required: The first UTC day a trend plots: the range's, never before the first interaction.
    - `to` string, date, required: The last UTC day a trend plots: the range's end, never past today.
    - `asOf` string, date, required: The UTC day every single value is as of: its value is the average over the campaign's interactions dated in the 30 days ending with it. The range's end, or, when those 30 days hold none, the last day with an interaction.
    - `comparedTo` string, date, required: The day a change compares with: 30 days before asOf.
    - `interactionCount` integer, required: The interactions dated in the 30 days ending asOf, under the scope.
    - `customerCount` integer, required: The distinct customers of those interactions.
    - `campaignCustomerCount` integer: Under a segment scope: the whole campaign's distinct customers in the same 30 days on the same website, unscoped (customers a precision order added for a group count only in that group's readings). Absent when the read is unscoped, whose customerCount is the campaign's.
    - `bucketCustomerCount` integer: Under a scope that names a customer bucket (an attribute or a store): the distinct customers inside it in the same 30 days. Absent without one.
  - `scopeEntries` object[], required: The read's customer and store segment entries the campaign holds, each with its label, in the order asked. An entry the campaign does not hold is not listed, and narrows the read to nothing. The agent entry is scopeAgent.
    - `axis` 'customer' | 'store', required
    - `id` string, required
    - `label` string, required: The entry's name, as experience_campaign_segments_get names it
  - `scopeAgent` object, nullable, required: The agent entry the read applied: every figure is of that agent's visits alone. Null when the segment scope names no agent: the figures pool every agent's visits, and instrument names each agent's changes
    - `id` 'point11' | 'dots' | 'spark' | 'muse' | 'grok_bot', required
    - `label` string, required: The agent's brand, as experience_campaign_segments_get names it
  - `competition` ExperienceCompetition, required: What every read against competitors stands on, so a reader can say why revenueValue is null, or why a campaign has no Brands map or Matrix to draw
    - `ownWebsite` boolean, required: The campaign has one website of its own to set against competitors: its measured site, else its one page. False for a campaign of several pages and no measured site, which states no gap and no dollars
    - `shopsCompetitors` boolean, required: Discovery named a competitor for the campaign, ready to shop or not. False for a campaign that shops its own website alone, which has nothing to be valued against and no Brands map to draw
    - `readsDiscovery` boolean, required: The campaign names a Discovery campaign the organization still holds, the one its competitors and how often AI picks each brand are read from. False when it names none or the one it named is gone, so the Matrix map has nothing to plot
  - `metrics` object, required
    - `plannedCount` integer, required
    - `finishedCount` integer, required
    - `queuedCount` integer, required
    - `runningCount` integer, required
  - `destinationIcons` object, required: Each website's stored favicon by destinations[].id; one without (no URL, or none stored) is absent and draws its name's initial
  - `journeys` object: One page of the campaign's journeys, as experience_journeys_list_v5 answers it, read with the scope; absent unless journeys is set
    - `data` object[], required
      - `runId` string, required
      - `inProgress` boolean, required
      - `executionStatus` 'scheduled' | 'waiting' | 'running' | 'completed' | 'failed' | 'cancelled', nullable, required
      - `visitIdentity` object, nullable, required
        - `key` string, required
        - `scenarioId` string, nullable, required
        - `cycleId` string, nullable, required
        - `cycleCreatedAt` string, date-time, nullable, required
        - `repetition` integer, nullable, required
      - `evidenceDisposition` 'sufficient' | 'insufficient' | 'policy_limited' | 'infrastructure_limited' | 'scenario_mismatch', nullable, required
      - `customerId` string, required
      - `customerName` string, required
      - `customerJobTitle` string, nullable, required: The customer's job title as the visit's scenario froze it; null when it named none
      - `destinationName` string, required
      - `destinationFingerprint` string, nullable, required: The website's id (experience_campaigns_get_v3's destinations[].id, which destinationFingerprint filters by); null for a visit no campaign website holds
      - `browserDevice` 'desktop' | 'mobile' | 'ios_safari', required
      - `agent` 'point11' | 'dots' | 'spark' | 'muse' | 'grok_bot', required: The agent that shopped the visit; point11 (Point11's own shopper) for a visit no campaign planned. Another agent's visit of the same customer, website and device is another row (visitIdentity.key ends in :<agent>)
      - `nativeApp` object, nullable, required
        - `platform` 'ios' | 'android', required
        - `buildId` string, uuid, required
        - `sha256` string, required
        - `appId` string, required
        - `versionLabel` string, required
        - `deviceName` string, required
        - `osVersion` string, required
      - `unavailableReason` string, nullable, required
      - `achieved` boolean, nullable, required
      - `qualityStars` number, nullable, required
      - `completedAt` string, date-time, nullable, required
      - `actionCount` integer, required
      - `durationMs` number, nullable, required
      - `frictionSteps` integer[], nullable, required
      - `recording` object, required
        - `thumbnailArtifactId` string, nullable, required: The journey's stored small thumbnail: its first captured screen as a WebP sized for a list row (kind small_thumbnail), downloaded with experience_run_artifacts_download_v3; a journey recorded before small thumbnails existed names its thumbnail (kind thumbnail) until its small one is stored; null until either is stored
        - `durationMs` number, nullable, required
        - `stages` object[], required
          - `stepNumber` integer, required
          - `tone` 'progress' | 'friction' | 'uncertain' | 'failed', nullable, required
          - `label` string, required
    - `nextCursor` string, nullable, required
    - `previousCursor` string, nullable, required
    - `totalCount` integer, required
    - `pageSize` integer, required

## Other responses

- `400`: The input, query, or Idempotency-Key is invalid.
- `401`: The bearer is missing, expired, or not accepted.
- `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)
