Inflection.io Emails API
The Emails API from Inflection.io — 2 operation(s) for creating and reading HTML emails.
The Emails API from Inflection.io — 2 operation(s) for creating and reading HTML emails.
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-emails-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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 Emails 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: Emails
description: Email listing and creation.
paths:
/v2/emails:
get:
tags:
- Emails
operationId: listEmails
summary: List emails
description: 'Paged list of email assets. `type` is repeatable. The heavy fields
(`content`, `contentJson`, `previews`) are not returned. Read one email
for those. `isEmpty` is derived. An unresolvable `folderId` yields an
empty page rather than an error.'
parameters:
- $ref: '#/components/parameters/EmailType'
- $ref: '#/components/parameters/FolderId'
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: Paged emails.
content:
application/json:
schema:
$ref: '#/components/schemas/EmailPageResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
post:
tags:
- Emails
operationId: createEmail
summary: Create an email
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/EmailInput'
responses:
'200':
description: The created email (includes an `editorUrl`).
content:
application/json:
schema:
$ref: '#/components/schemas/EmailResponse'
'400':
description: Request validation failed, or template content validation failed (`TEMPLATE_VALIDATION_ERROR`).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'409':
description: A template with that name already exists (`TEMPLATE_ALREADY_EXISTS`).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
/v2/emails/{id}:
get:
tags:
- Emails
operationId: getEmail
summary: Get an email
parameters:
- $ref: '#/components/parameters/EmailId'
responses:
'200':
description: The email.
content:
application/json:
schema:
$ref: '#/components/schemas/EmailResponse'
'404':
$ref: '#/components/responses/NotFound'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
components:
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.
NotFound:
description: 'The requested resource was not found (`errorCode: NOT_FOUND`).'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
parameters:
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
PageNumber:
name: pageNumber
in: query
required: false
description: 1-based page number.
schema:
type: integer
minimum: 1
maximum: 2147483647
default: 1
EmailType:
name: type
in: query
required: false
description: Repeatable; values OR together.
schema:
type: array
items:
type: string
enum:
- advanced
- visual
- llm_email
- per_user
EmailId:
name: id
in: path
required: true
description: Email id.
schema:
type: string
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
schemas:
ErrorItem:
type: object
properties:
errorCode:
type: string
examples:
- NOT_FOUND
message:
type: string
detail:
type: string
required:
- errorCode
- message
UrlParam:
type: object
required:
- key
- valueType
- value
- scope
properties:
key:
type: string
valueType:
type: string
value:
type: object
additionalProperties: true
scope:
type: string
enum:
- global
- asset
- flowstep
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
Email:
type: object
description: A created email. Some nested fields are free-form objects.
properties:
templateId:
type: string
name:
type: string
templateType:
type: string
examples:
- advanced
content:
type: string
contentJson:
type: string
subject:
type: string
preheader:
type: string
fromEmail:
$ref: '#/components/schemas/FromEmail'
replyTo:
type: string
senderMeta:
type: object
additionalProperties: true
ccEmailDataSet:
type: array
items:
$ref: '#/components/schemas/VariableInput'
bccEmailDataSet:
type: array
items:
$ref: '#/components/schemas/VariableInput'
urlParamsDict:
type: object
additionalProperties: true
previews:
type: object
additionalProperties: true
overrideEmailLimits:
type: boolean
createdAt:
type: string
createdBy:
type: object
additionalProperties: true
updatedAt:
type: string
updatedBy:
type: object
additionalProperties: true
isDeleted:
type: boolean
isTemplate:
type: boolean
directoryId:
type: string
emailAssetCategory:
type: string
isMmc:
type: boolean
editorUrl:
type: string
EmailInput:
type: object
required:
- name
- html
- subject
- fromEmail
- replyTo
properties:
name:
type: string
minLength: 3
html:
type: string
minLength: 1
description: Email HTML content.
subject:
type: string
minLength: 1
fromEmail:
$ref: '#/components/schemas/FromEmail'
replyTo:
type: string
minLength: 1
preheader:
type: string
folder:
type: string
description: Optional folder/directory id.
emailAssetCategory:
type: string
enum:
- marketing
- transactional
ccEmails:
type: array
items:
$ref: '#/components/schemas/VariableInput'
bccEmails:
type: array
items:
$ref: '#/components/schemas/VariableInput'
urlParams:
$ref: '#/components/schemas/UrlParams'
EmailSummary:
type: object
description: 'A row from the email collection. Deliberately *not* the `Email` schema:
the heavy fields (`content`, `contentJson`, `previews`) are projected out
of the listing. Read one email to get those. `directoryName` appears
only when the asset sits in a folder.
'
additionalProperties: true
properties:
templateId:
type: string
name:
type: string
subject:
type: string
description: For a `per_user` asset, taken from its fallback template.
templateType:
type: string
enum:
- advanced
- visual
- llm_email
- per_user
isEmpty:
type: boolean
description: Derived, true when the asset has no content yet.
tags:
type: array
items:
type: string
directoryId:
type: string
directoryName:
type: string
createdAt:
type: string
createdBy:
type: object
additionalProperties: true
updatedAt:
type: string
updatedBy:
type: object
additionalProperties: true
EmailPageResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/EmailSummary'
pagination:
$ref: '#/components/schemas/Pagination'
meta:
$ref: '#/components/schemas/Meta'
FromEmail:
type: object
properties:
email:
type: string
minLength: 1
name:
type: string
minLength: 1
VariableInput:
type: object
description: A value that may be literal text, a token, or a column reference.
required:
- value
- type
properties:
value:
type: string
type:
type: string
enum:
- text
- token
- column
Pagination:
type: object
description: Present only on paged list responses.
properties:
pageNumber:
type: integer
pageSize:
type: integer
totalElements:
type: integer
totalPages:
type: integer
EmailResponse:
type: object
properties:
data:
$ref: '#/components/schemas/Email'
meta:
$ref: '#/components/schemas/Meta'
UrlParams:
type: object
properties:
utmParams:
type: array
maxItems: 4
items:
$ref: '#/components/schemas/UrlParam'
customParams:
type: array
maxItems: 20
items:
$ref: '#/components/schemas/UrlParam'
ErrorEnvelope:
type: object
description: Standard failure envelope.
properties:
errors:
type: array
items:
$ref: '#/components/schemas/ErrorItem'
meta:
$ref: '#/components/schemas/Meta'
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)