Journeys
This endpoint returns what a person actually did, in order — every pageview, on-site interaction, product event, Stripe payment and checkout, oldest first. It is the only surface in the API that returns a timeline.
Use it when a number surprises you and you need to read the sequence behind it: how one customer got from their first landing page to their first payment, or what a whole cohort of new signups did in their first month.
The question it answers: what happened, in what order?
journey_id is the person_id — there is no separate journey id. Follow the
journey_id pointer that People returns on every
row.
Two forms: one person, or a cohort
- Pass
journey_idorq(never both) and you get one person's timeline. No date window is required — you get their history. - Omit both and you get a cohort: people selected by the same filters as
People, each returned with their own timeline. Here the event window
(
from+to) is required, because it is the only thing that limits how much of the event history gets read.
FullVision rejects an identifier that matches several people rather than guessing.
The two date axes — this is the thing people get wrong
There are two independent windows on this endpoint, and they answer different questions. Mixing them up is the most common way to get an empty or misleading response.
| Parameter | What it does | When you'd use it |
|---|---|---|
from + to | Bounds which events come back — the window on when each event happened. Required in the cohort form; optional when you address one person. | You want July's activity for these people, whoever they are and whenever they signed up. |
created_from / created_to | Bounds which people are in the cohort — the window on when each person first appeared, not on their events. Cohort form only. | You want the people who first appeared in July, and then you want to see everything they have done since. |
Set both together for the usual cohort question: created_from=2026-07-01& created_to=2026-07-31&from=2026-07-01&to=2026-08-31 reads as "July's new
people, and what they did through August".
What comes back
| Block | What it is | When you'd read it |
|---|---|---|
person | The same person row People returns — email, your own user id for them (external_id), Stripe customer id, first-touch channel and source. | You need to know whose timeline you are reading. |
events | The timeline itself, oldest first. Each event carries event_type (pageview, event, payment or checkout), an event_subtype, event_at, and whatever that kind of event has: page URL, referrer and UTM tags for web events; amounts, currency and plan for payments. | You are reconstructing the path — what they read, what they submitted, when they paid. |
events_truncated | true when this person's timeline was cut at events_limit. | Before you conclude "that is all they did" — see the note below. |
cohort / cohort_truncated | The cohort's paging state (has_more, next_cursor) and a flag saying the whole-cohort event cap was reached. | You are walking a cohort and need to know whether you have all of it. |
Event rows carry personal data: each journey wraps the person row (email,
external_id, Stripe customer id) and every event carries the pages that
person visited plus the traits you have stored about them. /journeys,
People and
Form Report's submissions block are the
only surfaces that return personal data. This endpoint requires the
customer:read scope.
Check the truncation flags before concluding anything from a timeline.
events_truncated: true means this person had more events than events_limit
allowed, and cohort_truncated: true means the cohort hit the overall event
cap, so people late in the response may carry fewer events than
events_limit would otherwise permit. Either flag means you are looking at a
prefix of the history, not the whole of it. FullVision reports both rather than
hiding them — raise events_limit (max 500) or narrow the window.
Addressing one person
| Parameter | What it does | When you'd use it |
|---|---|---|
journey_id | The exact person_id, as returned in People's journey_id. Omit for the cohort form. | You already have the person from a People call and want their timeline next. |
q | Any identifier — email address, cus_… Stripe customer id, person or visitor UUID, or the user id from your own system. Pass this or journey_id, never both. | A customer emails support and you want their history without looking their id up first. |
Selecting a cohort
These filters are identical to People's, so a cohort you built there transfers here unchanged.
| Parameter | What it does | When you'd use it |
|---|---|---|
created_via | stripe, form or events — which kind of record first identified each person. | You want the journeys of people a form captured, not people who appeared straight in Stripe. |
origin_detail | The secondary value of that first record, read according to created_via: a form id, an event name, or a plan name. | You want the timelines of everyone acquired through one specific form. |
first_touch_channel | One of the nine channel buckets (Organic Search, AI, Organic Social, Paid Search, Paid Social, Email, Direct, Referral, Non-attributed). | AI-sourced people convert well and you want to read what their path actually looks like. |
first_touch_source | The concrete source behind that channel — Google, LinkedIn, ChatGPT, Direct, and so on. | You want to compare the paths of ChatGPT arrivals against Google arrivals. |
paid | true keeps only people with a payment-bearing Stripe event; false keeps only those without one. | You want to see what paying customers did differently from the ones who never converted. |
has_email | true keeps only people with a non-empty email address. | You are pulling journeys you intend to follow up on personally. |
current_plan | Plan name from each person's most recent payment-bearing Stripe record. | You are investigating why Starter customers never reach the feature that drives upgrades. |
limit | People per page (default 20, max 100 — deliberately lower than the reports' 1000, because every person here carries up to 500 events). | You are walking a cohort and want fewer round trips without a huge response. |
starting_after | Returns the people after this cursor — pass back cohort.next_cursor. | You are paging through the whole cohort: keep going until cohort.has_more is false. |
events_limit | Events kept per person (default 200, max 500). | A power user has thousands of pageviews and you only need the start of their path. |
This endpoint rejects fields: a journey is its timeline, so there is
nothing separable to subtract.
API key as Bearer token
In: header
Query Parameters
Exact person_id, as returned by People's journey_id. Omit for the cohort group form.
Any identifier — email, cus_* id, person/visitor UUID, external id. Pass this OR journey_id, never both.
Group form only: number of people to return (default 20, max 100). Ignored when the addressing key is supplied. Lower than the other reports' 1000 on purpose — every returned person carries up to 500 events.
1 <= value <= 100Per-person event cap (default 200, max 500).
1 <= value <= 500Return rows after this cursor (from next_cursor).
Group form: select people created on/after this date. Distinct from from, which is the EVENT window.
^\d{4}-\d{2}-\d{2}$Group form: select people created on/before this date.
^\d{4}-\d{2}-\d{2}$Creation-mode bucket of the person's earliest record.
Value in
- "stripe"
- "form"
- "events"
Secondary value of the first-touch record, scoped by created_via.
First-touch channel bucket.
Value in
- "Organic Search"
- "AI"
- "Organic Social"
- "Paid Search"
- "Paid Social"
- "Email"
- "Direct"
- "Referral"
- "Non-attributed"
Granular classified first-touch source.
true = has a payment-bearing Stripe event.
Value in
- "true"
- "false"
true = the person has a non-empty email.
Value in
- "true"
- "false"
Plan name of the latest payment-bearing Stripe record.
Preset date range. Canonical names (last_30_days, last_7_days, last_3_months, last_6_months, last_year, all_time, …) and dashboard short keys (30d, 7d, 3m, 6m, 1y, all) are both accepted. Mutually exclusive with from/to.
Value in
- "last_7_days"
- "last_14_days"
- "last_28_days"
- "last_30_days"
- "last_90_days"
- "current_month"
- "this_month"
- "last_3_months"
- "last_6_months"
- "last_year"
- "all_time"
- "7d"
- "14d"
- "28d"
- "30d"
- "90d"
- "3m"
- "6m"
- "1y"
- "all"
Custom start date (YYYY-MM-DD). Ignored if range is set.
^\d{4}-\d{2}-\d{2}$Custom end date (YYYY-MM-DD). Ignored if range is set.
^\d{4}-\d{2}-\d{2}$Responses
One person's timeline (addressed) or the criteria-filtered cohort of timelines
/journeyscurl -X GET "https://data.fullvision.io/journeys?created_via=form&from=2026-07-01&to=2026-07-31"{ "journey_id": "string", "person": {}, "events": [ {} ], "events_truncated": true, "is_cached": true, "age_s": 0, "last_refresh": "string"}