Inflection.io Journeys API
Read journeys (campaigns), their schedule and their derived status.
Read journeys (campaigns), their schedule and their derived status.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/inflectionio:inflectionio-journeys-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Inflection Developer Journeys API
version: 1.0.0
description: 'The Inflection Developer API (`/v2`). Authenticate with a Personal Access
Token (`Authorization: Bearer inf_pat_...`).
**`/v2` is `/v1` plus more.** Every `/v1` endpoint is served here unchanged,
so a client can pin to one version and reach the whole API. On top of those
sit reads `/v1` never had: journeys, journey and email stats with a journey
rollup, and the email and list collections. `/v1` remains published.
**Response envelope.** Every response is wrapped:
`{ "data": …, "pagination": …, "errors": [...], "meta": { "status": "SUCCESS|FAILURE", "timestamp": "…" } }`.
`data` carries the payload, `pagination` appears only on paged lists, and on
failures `errors` is populated with `meta.status: "FAILURE"`.
**Query parameters are camelCase**: `pageNumber`, `pageSize`, `startTime`,
`folderId`. The journeys, emails, lists and stats reads additionally accept
the snake_case spelling of every scalar parameter (`page_number`,
`folder_id`, …); the contact, activity and list-member endpoints do not.
Repeatable parameters also accept a `[]` suffix (`status[]`, `tag[]`).
**Asynchronous contact writes.** `POST/PATCH /v2/contacts*` are processed
asynchronously: they return **200** with a `PENDING` transaction
acknowledgement (not the created/updated contact). Poll
`GET /v2/contacts/transactions/{transactionId}` for the per-contact result.
**Status-code quirks** (documented per-operation): a missing **contact** is
reported as **400** (not 404), whereas a missing **list**, **email** or
**journey** is **404**. For journeys and emails that also covers a
soft-deleted record and a malformed id. Nothing returns 201 or 204.
**Empty results are not errors.** On the paged reads, a `tag`, `folderId` or
`search` that matches nothing returns an empty page, not a 404.
**Errors.** Failures use the envelope above
(`errors[].{errorCode,message,detail}`). Authentication and authorization
failures (401/403) are returned with an empty body. The journey stats rollup
adds `RESULT_SET_TOO_LARGE` (a **400**) when a filter matches more journeys
than one request may cover; narrow it rather than paging further.
**Rate limiting.** Requests are metered per tenant. Exceeding the budget
yields **429** (empty body) on any endpoint; the `Retry-After` header gives
the seconds to wait and `X-RateLimit-Limit` the sustained per-second budget.'
servers:
- url: https://api.inflection.io
description: Production
security:
- PatAuth: []
tags:
- name: Journeys
description: Read journeys (campaigns), their schedule and their derived status.
paths:
/v2/journeys:
get:
tags:
- Journeys
operationId: listJourneys
summary: List journeys
description: 'Paged list of journeys. `status`, `type` and `tag` are repeatable and OR
within themselves. `tag` matches the tag **name**, not its id, and a tag
or folder resolving to nothing yields an empty page rather than an error.
Repeating a single-valued parameter (`search`, `folderId`, `pageNumber`,
`pageSize`) is a 400.'
parameters:
- $ref: '#/components/parameters/JourneyStatus'
- $ref: '#/components/parameters/JourneyType'
- $ref: '#/components/parameters/TagName'
- $ref: '#/components/parameters/FolderId'
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: Paged journeys.
content:
application/json:
schema:
$ref: '#/components/schemas/JourneyPageResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
/v2/journeys/{id}:
get:
tags:
- Journeys
operationId: getJourney
summary: Get a journey
description: 'The same passthrough as the listing, but keeping `schedule` and always
omitting `dynamicList`. Takes no query parameters.'
parameters:
- $ref: '#/components/parameters/JourneyId'
responses:
'200':
description: The journey.
content:
application/json:
schema:
$ref: '#/components/schemas/JourneyResponse'
'404':
description: 'No such journey, the journey is soft-deleted, or the id is not a
well-formed object id.
'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
components:
schemas:
JourneyPageResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Journey'
pagination:
$ref: '#/components/schemas/Pagination'
meta:
$ref: '#/components/schemas/Meta'
Journey:
type: object
description: 'A journey (campaign). The stored record is passed through with the
internal `campaignType`, `active`, `draft` and `schedule` fields removed
and `type`, `status` and `nextRunTime` derived in their place.
The passthrough means the key set varies between records. The fields
below are the ones that are always meaningful, not an exhaustive list.
`directoryName` appears only when the journey sits in a folder.
'
additionalProperties: true
properties:
journeyId:
type: string
name:
type: string
type:
type: string
enum:
- batch
- trigger
description: Derived from the internal campaign type.
status:
type: string
enum:
- active
- draft
- inactive
description: Derived from the internal active/draft flags.
nextRunTime:
description: 'Next scheduled run, derived from the journey''s schedule. Null when
the journey is not scheduled.
'
tags:
type: array
items:
type: string
directoryId:
type: string
directoryName:
type: string
dynamicListId:
type: string
campaignContext:
type: string
enum:
- person
- person_org
createdAt:
type: string
createdBy:
type: object
additionalProperties: true
ErrorItem:
type: object
properties:
errorCode:
type: string
examples:
- NOT_FOUND
message:
type: string
detail:
type: string
required:
- errorCode
- message
Meta:
type: object
description: Envelope metadata present on every response.
properties:
status:
type: string
enum:
- SUCCESS
- FAILURE
timestamp:
type: string
format: date-time
required:
- status
JourneyDetail:
description: 'As `Journey`, but the single-journey read keeps `schedule` and always
omits `dynamicList`. That field carries the list''s compiled SQL, which
is not part of the public contract.
'
allOf:
- $ref: '#/components/schemas/Journey'
- type: object
properties:
schedule:
type: object
additionalProperties: true
JourneyResponse:
type: object
properties:
data:
$ref: '#/components/schemas/JourneyDetail'
meta:
$ref: '#/components/schemas/Meta'
Pagination:
type: object
description: Present only on paged list responses.
properties:
pageNumber:
type: integer
pageSize:
type: integer
totalElements:
type: integer
totalPages:
type: integer
ErrorEnvelope:
type: object
description: Standard failure envelope.
properties:
errors:
type: array
items:
$ref: '#/components/schemas/ErrorItem'
meta:
$ref: '#/components/schemas/Meta'
responses:
Unauthorized:
description: Missing or invalid Personal Access Token. Empty body.
BadRequest:
description: Malformed request or validation error.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
TooManyRequests:
description: 'Per-tenant rate limit exceeded. Empty body. Retry after the number of
seconds given in the `Retry-After` header.
'
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
X-RateLimit-Limit:
description: Sustained request budget, in requests per second, per tenant.
schema:
type: integer
Forbidden:
description: The PAT lacks the required scope (READ for reads, WRITE for writes). Empty body.
parameters:
JourneyId:
name: id
in: path
required: true
description: Journey (campaign) id.
schema:
type: string
PageSize:
name: pageSize
in: query
required: false
description: Items per page.
schema:
type: integer
minimum: 1
maximum: 200
default: 20
FolderId:
name: folderId
in: query
required: false
description: 'Restrict to one folder. An id matching no folder yields an empty page
rather than an error.
'
schema:
type: string
JourneyStatus:
name: status
in: query
required: false
description: Repeatable; values OR together.
schema:
type: array
items:
type: string
enum:
- active
- draft
- inactive
TagName:
name: tag
in: query
required: false
description: 'Repeatable. Matches the tag **name**, not its id. A name matching no tag
yields an empty page.
'
schema:
type: array
items:
type: string
JourneyType:
name: type
in: query
required: false
description: Repeatable; values OR together.
schema:
type: array
items:
type: string
enum:
- batch
- trigger
PageNumber:
name: pageNumber
in: query
required: false
description: 1-based page number.
schema:
type: integer
minimum: 1
maximum: 2147483647
default: 1
Search:
name: search
in: query
required: false
description: 'Case-insensitive substring match on the asset''s name. Regex
metacharacters are escaped, not interpreted.
'
schema:
type: string
securitySchemes:
PatAuth:
type: http
scheme: bearer
bearerFormat: inf_pat
description: 'Personal Access Token or OAuth 2.1 access token, sent as a bearer
credential (`Authorization: Bearer inf_pat_...`). Read operations
require a token with the `READ` scope; write operations
(POST/PATCH/DELETE) require `WRITE`.
'
x-provenance:
method: harvested
publisher: Inflection.io
source: https://docs.inflection.io/api-reference/openapi.yaml
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)