PostHog Conversations API
The conversations API from PostHog — 14 operation(s) for conversations.
The conversations API from PostHog — 14 operation(s) for conversations.
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/posthog-conversations-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: PostHog Conversations API
version: 1.0.0
description: ''
tags:
- name: Conversations
paths:
/api/environments/{project_id}/conversations/views/:
get:
operationId: conversations_views_list
parameters:
- name: limit
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- name: offset
required: false
in: query
description: The initial index from which to return the results.
schema:
type: integer
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- conversation:read
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedTicketViewList'
description: ''
x-explicit-tags:
- conversations
summary: Conversations views list
x-summary-source: derived
post:
operationId: conversations_views_create
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/TicketView'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/TicketView'
multipart/form-data:
schema:
$ref: '#/components/schemas/TicketView'
required: true
security:
- PersonalAPIKeyAuth:
- conversation:write
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/TicketView'
description: ''
x-explicit-tags:
- conversations
summary: Conversations views create
x-summary-source: derived
/api/environments/{project_id}/conversations/views/{short_id}/:
get:
operationId: conversations_views_retrieve
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
- in: path
name: short_id
schema:
type: string
required: true
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- conversation:read
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TicketView'
description: ''
x-explicit-tags:
- conversations
summary: Conversations views retrieve
x-summary-source: derived
delete:
operationId: conversations_views_destroy
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
- in: path
name: short_id
schema:
type: string
required: true
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- conversation:write
responses:
'204':
description: No response body
x-explicit-tags:
- conversations
summary: Conversations views destroy
x-summary-source: derived
/api/projects/{project_id}/conversations/tickets/:
get:
operationId: conversations_tickets_list
description: List tickets with person data attached.
parameters:
- in: query
name: assignee
schema:
type: string
description: Filter by assignee. Use `unassigned` for tickets with no assignee, `user:<user_id>` for a specific user, or `role:<role_uuid>` for a role.
- in: query
name: channel_detail
schema:
type: string
enum:
- slack_bot_mention
- slack_channel_message
- slack_emoji_reaction
- teams_bot_mention
- teams_channel_message
- widget_api
- widget_embedded
description: Filter by the channel sub-type (e.g. `widget_embedded`, `slack_bot_mention`).
- in: query
name: channel_source
schema:
type: string
enum:
- email
- slack
- teams
- widget
description: Filter by the channel the ticket originated from.
- in: query
name: date_from
schema:
type: string
description: Only include tickets updated on or after this date. Accepts absolute dates (`2026-01-01`) or relative ones (`-7d`, `-1mStart`). Pass `all` to disable the filter.
- in: query
name: date_to
schema:
type: string
description: Only include tickets updated on or before this date. Same format as `date_from`.
- in: query
name: distinct_ids
schema:
type: string
description: Comma-separated list of person `distinct_id`s to filter by (max 100).
- name: limit
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- name: offset
required: false
in: query
description: The initial index from which to return the results.
schema:
type: integer
- in: query
name: order_by
schema:
type: string
enum:
- -created_at
- -sla_due_at
- -ticket_number
- -updated_at
- created_at
- sla_due_at
- ticket_number
- updated_at
description: Sort order. Prefix with `-` for descending. Defaults to `-updated_at`.
- in: query
name: priority
schema:
type: string
description: 'Filter by priority. Accepts a single value or a comma-separated list (e.g. `medium,high`). Valid values: `low`, `medium`, `high`.'
- $ref: '#/components/parameters/ProjectIdPath'
- in: query
name: search
schema:
type: string
description: Free-text search. A numeric value matches a ticket number exactly; otherwise matches against the customer's name or email (case-insensitive, partial match).
- in: query
name: sla
schema:
type: string
enum:
- at-risk
- breached
- on-track
description: Filter by SLA state. `breached` = past `sla_due_at`, `at-risk` = due within the next hour, `on-track` = more than an hour remaining.
- in: query
name: status
schema:
type: string
description: 'Filter by status. Accepts a single value or a comma-separated list (e.g. `new,open,pending`). Valid values: `new`, `open`, `pending`, `on_hold`, `resolved`.'
- in: query
name: tags
schema:
type: string
description: JSON-encoded array of tag names to filter by, e.g. `["billing","urgent"]`.
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- ticket:read
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedTicketList'
description: ''
x-explicit-tags:
- conversations
summary: Conversations tickets list
x-summary-source: derived
post:
operationId: conversations_tickets_create
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/Ticket'
multipart/form-data:
schema:
$ref: '#/components/schemas/Ticket'
security:
- PersonalAPIKeyAuth:
- ticket:write
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
description: ''
x-explicit-tags:
- conversations
summary: Conversations tickets create
x-summary-source: derived
/api/projects/{project_id}/conversations/tickets/{id}/:
get:
operationId: conversations_tickets_retrieve
description: Get single ticket and mark as read by team.
parameters:
- in: path
name: id
schema:
type: string
format: uuid
description: A UUID string identifying this ticket.
required: true
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- ticket:read
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
description: ''
x-explicit-tags: []
summary: Conversations tickets retrieve
x-summary-source: derived
put:
operationId: conversations_tickets_update
description: Handle ticket updates including assignee changes.
parameters:
- in: path
name: id
schema:
type: string
format: uuid
description: A UUID string identifying this ticket.
required: true
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/Ticket'
multipart/form-data:
schema:
$ref: '#/components/schemas/Ticket'
security:
- PersonalAPIKeyAuth:
- ticket:write
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
description: ''
x-explicit-tags: []
summary: Conversations tickets update
x-summary-source: derived
patch:
operationId: conversations_tickets_partial_update
parameters:
- in: path
name: id
schema:
type: string
format: uuid
description: A UUID string identifying this ticket.
required: true
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchedTicket'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/PatchedTicket'
multipart/form-data:
schema:
$ref: '#/components/schemas/PatchedTicket'
security:
- PersonalAPIKeyAuth:
- ticket:write
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
description: ''
x-explicit-tags: []
summary: Conversations tickets partial update
x-summary-source: derived
delete:
operationId: conversations_tickets_destroy
parameters:
- in: path
name: id
schema:
type: string
format: uuid
description: A UUID string identifying this ticket.
required: true
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
security:
- PersonalAPIKeyAuth:
- ticket:write
responses:
'204':
description: No response body
x-explicit-tags: []
summary: Conversations tickets destroy
x-summary-source: derived
/api/projects/{project_id}/conversations/tickets/{id}/suggest_reply/:
post:
operationId: conversations_tickets_suggest_reply_create
parameters:
- in: path
name: id
schema:
type: string
format: uuid
description: A UUID string identifying this ticket.
required: true
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SuggestReplyResponse'
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/SuggestReplyError'
description: ''
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/SuggestReplyError'
description: ''
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/SuggestReplyError'
description: ''
x-explicit-tags: []
summary: Conversations tickets suggest reply create
x-summary-source: derived
/api/projects/{project_id}/conversations/tickets/bulk_update_tags/:
post:
operationId: conversations_tickets_bulk_update_tags_create
description: 'Bulk update tags on multiple objects.
Accepts:
- {"ids": [...], "action": "add"|"remove"|"set", "tags": ["tag1", "tag2"]}
Actions:
- "add": Add tags to existing tags on each object
- "remove": Remove specific tags from each object
- "set": Replace all tags on each object with the provided list'
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BulkUpdateTagsRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/BulkUpdateTagsRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/BulkUpdateTagsRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/BulkUpdateTagsResponse'
description: ''
x-explicit-tags:
- conversations
summary: Conversations tickets bulk update tags create
x-summary-source: derived
/api/projects/{project_id}/conversations/tickets/unread_count/:
get:
operationId: conversations_tickets_unread_count_retrieve
description: 'Get total unread ticket count for the team.
Returns the sum of unread_team_count for all non-resolved tickets.
Cached in Redis for 30 seconds, invalidated on changes.'
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
tags:
- Conversations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
description: ''
x-explicit-tags:
- conversations
summary: Conversations tickets unread count retrieve
x-summary-source: derived
components:
schemas:
ActionEnum:
enum:
- add
- remove
- set
type: string
description: '* `add` - add
* `remove` - remove
* `set` - set'
BulkUpdateTagsError:
type: object
properties:
id:
type: integer
reason:
type: string
required:
- id
- reason
Ticket:
type: object
description: Serializer mixin that handles tags for objects.
properties:
id:
type: string
format: uuid
readOnly: true
ticket_number:
type: integer
readOnly: true
channel_source:
allOf:
- $ref: '#/components/schemas/ChannelSourceEnum'
readOnly: true
channel_detail:
readOnly: true
oneOf:
- $ref: '#/components/schemas/ChannelDetailEnum'
- $ref: '#/components/schemas/NullEnum'
distinct_id:
type: string
readOnly: true
status:
allOf:
- $ref: '#/components/schemas/TicketStatusEnum'
description: 'Ticket status: new, open, pending, on_hold, or resolved
* `new` - New
* `open` - Open
* `pending` - Pending
* `on_hold` - On hold
* `resolved` - Resolved'
priority:
description: 'Ticket priority: low, medium, or high. Null if unset.
* `low` - Low
* `medium` - Medium
* `high` - High'
oneOf:
- $ref: '#/components/schemas/PriorityEnum'
- $ref: '#/components/schemas/BlankEnum'
- $ref: '#/components/schemas/NullEnum'
assignee:
allOf:
- $ref: '#/components/schemas/TicketAssignment'
readOnly: true
anonymous_traits:
description: Customer-provided traits such as name and email
ai_resolved:
type: boolean
escalation_reason:
type:
- string
- 'null'
created_at:
type: string
format: date-time
readOnly: true
updated_at:
type: string
format: date-time
readOnly: true
message_count:
type: integer
readOnly: true
last_message_at:
type:
- string
- 'null'
format: date-time
readOnly: true
last_message_text:
type:
- string
- 'null'
readOnly: true
unread_team_count:
type: integer
readOnly: true
unread_customer_count:
type: integer
readOnly: true
session_id:
type:
- string
- 'null'
readOnly: true
session_context:
readOnly: true
sla_due_at:
type:
- string
- 'null'
format: date-time
description: SLA deadline set via workflows. Null means no SLA.
snoozed_until:
type:
- string
- 'null'
format: date-time
slack_channel_id:
type:
- string
- 'null'
readOnly: true
slack_thread_ts:
type:
- string
- 'null'
readOnly: true
slack_team_id:
type:
- string
- 'null'
readOnly: true
email_subject:
type:
- string
- 'null'
readOnly: true
email_from:
type:
- string
- 'null'
format: email
readOnly: true
email_to:
type:
- string
- 'null'
readOnly: true
cc_participants:
readOnly: true
person:
allOf:
- $ref: '#/components/schemas/TicketPerson'
readOnly: true
tags:
type: array
items: {}
required:
- assignee
- cc_participants
- channel_detail
- channel_source
- created_at
- distinct_id
- email_from
- email_subject
- email_to
- id
- last_message_at
- last_message_text
- message_count
- person
- session_context
- session_id
- slack_channel_id
- slack_team_id
- slack_thread_ts
- ticket_number
- unread_customer_count
- unread_team_count
- updated_at
PaginatedTicketViewList:
type: object
required:
- count
- results
properties:
count:
type: integer
example: 123
next:
type:
- string
- 'null'
format: uri
example: http://api.example.org/accounts/?offset=400&limit=100
previous:
type:
- string
- 'null'
format: uri
example: http://api.example.org/accounts/?offset=200&limit=100
results:
type: array
items:
$ref: '#/components/schemas/TicketView'
UserBasic:
type: object
properties:
id:
type: integer
readOnly: true
uuid:
type: string
format: uuid
readOnly: true
distinct_id:
type:
- string
- 'null'
maxLength: 200
first_name:
type: string
maxLength: 150
last_name:
type: string
maxLength: 150
email:
type: string
format: email
title: Email address
maxLength: 254
is_email_verified:
type:
- boolean
- 'null'
hedgehog_config:
type:
- object
- 'null'
additionalProperties: true
readOnly: true
role_at_organization:
oneOf:
- $ref: '#/components/schemas/RoleAtOrganizationEnum'
- $ref: '#/components/schemas/BlankEnum'
- $ref: '#/components/schemas/NullEnum'
required:
- email
- hedgehog_config
- id
- uuid
TicketStatusEnum:
enum:
- new
- open
- pending
- on_hold
- resolved
type: string
description: '* `new` - New
* `open` - Open
* `pending` - Pending
* `on_hold` - On hold
* `resolved` - Resolved'
TicketPerson:
type: object
description: Minimal person serializer for embedding in ticket responses.
properties:
id:
type: string
format: uuid
readOnly: true
name:
type: string
readOnly: true
distinct_ids:
type: array
items:
type: string
readOnly: true
properties:
type: object
additionalProperties: true
readOnly: true
created_at:
type: string
format: date-time
readOnly: true
is_identified:
type: boolean
readOnly: true
required:
- created_at
- distinct_ids
- id
- is_identified
- name
- properties
ChannelDetailEnum:
enum:
- slack_channel_message
- slack_bot_mention
- slack_emoji_reaction
- teams_channel_message
- teams_bot_mention
- widget_embedded
- widget_api
type: string
description: '* `slack_channel_message` - Channel message
* `slack_bot_mention` - Bot mention
* `slack_emoji_reaction` - Emoji reaction
* `teams_channel_message` - Teams channel message
* `teams_bot_mention` - Teams bot mention
* `widget_embedded` - Widget
* `widget_api` - API'
TicketAssignment:
type: object
description: Serializer for ticket assignment (user or role).
properties:
id:
type:
- string
- 'null'
readOnly: true
type:
type: string
readOnly: true
user:
type:
- object
- 'null'
additionalProperties:
type: string
readOnly: true
role:
type:
- object
- 'null'
additionalProperties:
type: string
readOnly: true
required:
- id
- role
- type
- user
SuggestReplyResponse:
type: object
properties:
suggestion:
type: string
required:
- suggestion
PaginatedTicketList:
type: object
required:
- count
- results
properties:
count:
type: integer
example: 123
next:
type:
- string
- 'null'
format: uri
example: http://api.example.org/accounts/?offset=400&limit=100
previous:
type:
- string
- 'null'
format: uri
example: http://api.example.org/accounts/?offset=200&limit=100
results:
type: array
items:
$ref: '#/components/schemas/Ticket'
NullEnum:
enum:
- null
BulkUpdateTagsItem:
type: object
properties:
id:
type: integer
tags:
type: array
items:
type: string
required:
- id
- tags
SuggestReplyError:
type: object
properties:
detail:
type: string
error_type:
type: string
required:
- detail
BulkUpdateTagsRequest:
type: object
properties:
ids:
type: array
items:
type: integer
description: List of object IDs to update tags on.
maxItems: 500
action:
allOf:
- $ref: '#/components/schemas/ActionEnum'
description: '''add'' merges with existing tags, ''remove'' deletes specific tags, ''set'' replaces all tags.
* `add` - add
* `remove` - remove
* `set` - set'
tags:
type: array
items:
type: string
description: Tag names to add, remove, or set.
required:
- action
- ids
- tags
BlankEnum:
enum:
- ''
BulkUpdateTagsResponse:
type: object
properties:
updated:
type: array
items:
$ref: '#/components/schemas/BulkUpdateTagsItem'
skipped:
type: array
items:
$ref: '#/components/schemas/BulkUpdateTagsError'
required:
- skipped
- updated
ChannelSourceEnum:
enum:
- widget
- email
- slack
- teams
type: string
description: '* `widget` - Widget
* `email` - Email
* `slack` - Slack
* `teams` - Microsoft Teams'
PriorityEnum:
enum:
- low
- medium
- high
type: string
description: '* `low` - Low
* `medium` - Medium
* `high` - High'
PatchedTicket:
type: object
description: Serializer mixin that handles tags for objects.
properties:
id:
type: string
format: uuid
readOnly: true
ticket_number:
type: integer
readOnly: true
channel_source:
allOf:
- $ref: '#/components/schemas/ChannelSourceEnum'
readOnly: true
channel_detail:
readOnly: true
oneOf:
- $ref: '#/components/schemas/ChannelDetailEnum'
- $ref: '#/components/schemas/NullEnum'
distinct_id:
type: string
readOnly: true
status:
allOf:
- $ref: '#/components/schemas/TicketStatusEnum'
description: 'Ticket status: new, open, pending, on_hold, or resolved
* `new` - New
* `open` - Open
* `pending` - Pending
* `on_hold` - On hold
* `resolved` - Resolved'
priority:
description: 'Ticket priority: low, medium, or high. Null if unset.
* `low` - Low
* `medium` - Medium
* `high` - High'
oneOf:
- $ref: '#/components/schemas/PriorityEnum'
- $ref: '#/components/schemas/BlankEnum'
- $ref: '#/components/schemas/NullEnum'
assignee:
allOf:
- $ref: '#/components/schemas/TicketAssignment'
readOnly: true
anonymous_traits:
description: Customer-provided traits such as name and email
ai_resolved:
type: boolean
escalation_reason:
type:
- string
- 'null'
created_at:
type: string
format: date-time
readOnly: true
updated_at:
type: string
format: date-time
readOnly: true
message_count:
type: integer
readOnly: true
last_message_at:
type:
- string
- 'null'
format: date-time
readOnly: true
last_message_text:
type:
- string
- 'null'
readOnly: true
unread_team_count:
type: integer
readOnly: true
unread_customer_count:
type: integer
readOnly: true
session_id:
type:
- string
- 'null'
readOnly: true
session_context:
readOnly: true
sla_due_at:
type:
- string
- 'null'
format: date-time
description: SLA deadline set via workflows. Null means no SLA.
snoozed_until:
type:
- string
- 'null'
format: date-time
slack_channel_id:
type:
- string
- 'null'
readOnly: true
slack_thread_ts:
type:
- string
- 'null'
readOnly: true
slack_team_id:
type:
- string
- 'null'
readOnly: true
email_subject:
type:
- string
- 'null'
readOnly: true
email_from:
type:
- string
- 'null'
format: email
readOnly: true
email_to:
type:
- string
- 'null'
readOnly: true
cc_participants:
readOnly: true
person:
allOf:
- $ref: '#/components/schemas/TicketPerson'
readOnly: true
tags:
type: array
items: {}
TicketView:
type: object
properties:
id:
type: string
format: uuid
readOnly: true
short_id:
type: string
readOnly: true
name:
type: string
maxLength: 400
filters:
type: object
additionalProperties: true
description: Saved ticket filter criteria. May contain status, priority, channel, sla, assignee, tags, dateFrom, dateTo, and sorting keys.
created_at:
type: string
format: date-time
readOnly: true
created_by:
allOf:
- $ref: '#/components/schemas/UserBasic'
readOnly: true
required:
- created_at
- created_by
- id
- name
- short_id
RoleAtOrganizationEnum:
enum:
- engineering
- data
- product
- founder
- leadership
- marketing
- sales
- other
type: string
description: '* `engineering` - Engineering
* `data` - Data
* `product` - Product Management
* `founder` - Founder
* `leadership` - Leadership
* `marketing` - Marketing
* `sales` - Sales / Success
* `other` - Other'
parameters:
ProjectIdPath:
in: path
name: project_id
required: true
schema:
type: string
description: Project ID of the project you're trying to access. To find the ID of the project, make a call to /api/projects/.
securitySchemes:
PersonalAPIKeyAuth:
type: http
scheme: bearer
x-tagGroups:
- name: All endpoints
tags:
- LLM Analytics
- actions
- activity_log
- activity_logs
- advanced_activity_logs
- alerts
- annotations
- approval_policies
- batch_exports
- cdp
- change_requests
- code
- code-invites
- cohorts
- comments
- conversations
- core
- customer_analytics
- customer_journeys
- customer_profile_configs
- dashboard_templates
- dashboards
- data_color_themes
- data_modeling_jobs
- data_warehouse
- dataset_items
- datasets
- desktop_recordings
- domains
- early_access_feature
- early_access_features
- elements
- endpoints
- environments
- error_tracking
- evaluation_runs
- evaluations
- event_definitions
- event_filter
- event_schemas
- events
- experiment_holdouts
- experiment_saved_metrics
- experiments
- exports
- external_data_schemas
- external_data_sources
- feature_flags
- file_system
- file_system_shortcut
- flag_value
- groups
- groups_types
- health_issues
- heatmap_screenshots
- heatmaps
- hog_flows
- hog_function_templates
- hog_functions
- insight_variables
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/posthog/refs/heads/main/openapi/posthog-conversations-api-openapi.yml