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

# Get friction maps (v3)

`GET /api/v1/experience/friction-maps-v3/{id}`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/experience/friction-maps-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 an Experience campaign's Journeys map of one website over the results window experience_campaign_analytics_get_v9 reads, under optional customer segments: its judged journeys and their customers, entry pages, the pages walked in the order journeys reach them, the journeys between each pair, and the failed journeys ending on each, each count split into passed clean, passed with friction the scorer recorded, or failed. A page is a URL's host and path, id-like segments read as :id; the twelve most reached are listed, the rest as one, journeys naming no page as one; each has up to four screens (its latest journeys' first screenshots). With device, only that device's journeys (devices names the campaign's). Its journeys are those the website's pass rate divides by, so its failures are that rate's. Answers the campaign's scope and progress as experience_campaigns_get_v3 does.

## 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
- `device` 'desktop' | 'mobile' | 'ios_safari': Read only the journeys visited on this device (one of devices); absent reads every device

## Headers

- `Point11-Organization` string, uuid

## Response `200`

Success.

- ExperienceFrictionMapsGetV3Response
  - `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
  - `devices` string[], required: The devices the campaign's visits run on from now, in product order: each one the map can be read for (device)
  - `map` object, nullable, required: Null while the scope holds no interaction or no website to read
    - `datasetKey` string, required: Names what the map was read from: the campaign, website, the day its results window is as of with the interactions it holds, the device and the segment scope. experience.friction-map-pages.get answers the same key while it describes the same map
    - `device` 'desktop' | 'mobile' | 'ios_safari', nullable, required: The device the map's journeys visited on; null for every device
    - `ready` boolean, required: False while the page visits of an interaction in the window are still being written: judgedJourneys and failedJourneys are whole, and pages and bands are empty because they are not known yet. It turns true within minutes
    - `judgedJourneys` integer, required: Every journey the map holds: the pass rate's denominator for the same scope
    - `failedJourneys` integer, required: Failed journeys among them, not counting a failure blamed on the shopper. Each ended on one page, so the pages' failedEnded sum to it
    - `customers` integer, required: The distinct customers the judged journeys are of
    - `outcomes` object, required: How the journeys went: clean, friction, failed; they sum to the journeys counted
      - `clean` integer, required: Passed with no friction recorded
      - `friction` integer, required: Passed, with at least one friction the scoring engine recorded, of any severity
      - `failed` integer, required: Did not pass (a failure blamed on the shopper is no journey of the map)
    - `pages` object[], required: The 12 pages the most journeys reached in the order journeys reach them, then other, then unknown. A page is a recorded URL by its mechanics alone: host and path, credentials, query, fragment and ;parameters dropped, and numeric, UUID, long hexadecimal, token-like and @-bearing segments read as :id.
      - `id` string, required: A page's host and path with every segment that identifies one thing or one person read as :id (shop.example/products/:id), ":other" for every page past the 12 most reached as one, or ":unknown" for the journeys whose evidence names no page and the frictions seen where no page was recorded
      - `kind` 'page' | 'other' | 'unknown', required
      - `path` string, nullable, required: The page's path, with its host in front where that is not the website's own; null for other and unknown
      - `pages` integer, required: How many pages other stands for; 1 for any other
      - `journeys` integer, required: Judged journeys that reached the page
      - `position` number, nullable, required: The median, over those journeys, of how many pages into the journey the page first came (1 is where it began); null for unknown
      - `ended` integer, required: Journeys that ended on the page
      - `failedEnded` integer, required: Failed journeys that ended on the page
      - `outcomes` object, required: How the journeys went: clean, friction, failed; they sum to the journeys counted
        - `clean` integer, required: Passed with no friction recorded
        - `friction` integer, required: Passed, with at least one friction the scoring engine recorded, of any severity
        - `failed` integer, required: Did not pass (a failure blamed on the shopper is no journey of the map)
      - `screens` object[], required: The page as the latest journeys that reached it first saw it, latest first, at most 4: each journey's screenshot from the step it arrived on the page. Empty for other and unknown, and short where a journey's screenshot is missing
        - `runId` string, required: The journey's run: its replay (experience_journeys_get) and, with artifactId, its screenshot (experience_run_artifacts_download)
        - `artifactId` string, required: The screenshot's artifact id
        - `step` integer, required: The step of the journey the screenshot was taken at, as it arrived on the page
        - `day` string, date, required: The day the journey's visit is dated by
        - `outcome` 'clean' | 'friction' | 'failed', required: How the journey went
    - `bands` object[], required: Most journeys first
      - `from` string, required: A page's host and path with every segment that identifies one thing or one person read as :id (shop.example/products/:id), ":other" for every page past the 12 most reached as one, or ":unknown" for the journeys whose evidence names no page and the frictions seen where no page was recorded
      - `to` string, required: A page's host and path with every segment that identifies one thing or one person read as :id (shop.example/products/:id), ":other" for every page past the 12 most reached as one, or ":unknown" for the journeys whose evidence names no page and the frictions seen where no page was recorded
      - `journeys` integer, required: Distinct journeys that went from one page straight to the other, however many times each
      - `outcomes` object, required: How the journeys went: clean, friction, failed; they sum to the journeys counted
        - `clean` integer, required: Passed with no friction recorded
        - `friction` integer, required: Passed, with at least one friction the scoring engine recorded, of any severity
        - `failed` integer, required: Did not pass (a failure blamed on the shopper is no journey of the map)
    - `entries` object[], required: Where the journeys entered, most first: each page a journey first arrived on, and unknown for those that walked no known page. Empty while ready is false
      - `page` string, required: A page's host and path with every segment that identifies one thing or one person read as :id (shop.example/products/:id), ":other" for every page past the 12 most reached as one, or ":unknown" for the journeys whose evidence names no page and the frictions seen where no page was recorded
      - `journeys` integer, required: Judged journeys whose first page this was
      - `outcomes` object, required: How the journeys went: clean, friction, failed; they sum to the journeys counted
        - `clean` integer, required: Passed with no friction recorded
        - `friction` integer, required: Passed, with at least one friction the scoring engine recorded, of any severity
        - `failed` integer, required: Did not pass (a failure blamed on the shopper is no journey of the map)
    - `coverage` object, required: The website's visits in the as-of window on the device, under the segment scope, that no count of the map holds; whole while ready is false
      - `couldNotTell` integer, required: Visits the scorer could not tell for a reason other than blocked (policy, infrastructure, cut short, does not apply); in no count
      - `blocked` integer, required: Visits the scorer could not tell because a bot wall, CAPTCHA, access-denied page or login stopped them; in no count
    - `instrument` object, required: The instrument changes among the as-of window's interactions the map pools; each marks every count on it
      - `changes` object[], required: Each instrument change among the interactions the figures read, oldest first
        - `day` string, required: The UTC day from which the changed instrument measured
        - `kind` 'scorer' | 'shopper' | 'models' | 'browser', required: scorer: the scoring call's prompt, task or answer schema version moved; shopper: the shopper's Computer Use call's prompt or task version moved; models: the frozen model plan the visits ran under changed, between cycles or re-frozen mid-cycle; browser: the browser conditions one website's visits on one device were frozen under changed (emulation, frame, automation waits, certificate, ad and CAPTCHA settings, connection access). Each marks every figure of the read, whichever website it was measured on
        - `version` string, nullable, required: The call versions measured from day, joined by ' · ': a scorer's prompt, task and answer schema versions, a shopper's prompt and task versions; null for a models or browser change
        - `agents` string[], required: The agents whose visits it measured differently, in product order: each agent's visits are a series of their own (its models are its own shopper call's and the shared ones, never another agent's), so a repin of one agent's model names that agent alone, and a read of every agent names each agent's changes
      - `comparable` boolean, required: No change falls between the start of the window ending results.comparedTo and results.asOf, so every change compares like with like; false: the changes span an instrument change and no significance is claimed for them

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