Skip to main content
GET
Reads conversations for the workspace tied to your API key. Use it to export conversations into your own systems for analytics, QA review, or downstream processing. This is the read path described on the API overview. It pulls data out of Fini and does not change agent behavior. Results are sorted by latest message time, newest first.
Use List agents to look up the botId values accepted by this endpoint’s optional agent filter. If you already know a conversation ID, use Get conversation. If you need to send a new turn into Fini, use Generate Answer. This page is export-only.

Headers

string
required
Bearer token containing your Fini workspace API key. Format: Bearer fini_...

Query parameters

integer
Inclusive start of the Fini ingestion window in Unix epoch milliseconds. Returns conversations whose createdAt is greater than or equal to this value. If omitted, Fini defaults to the last 7 days.
integer
Inclusive end of the Fini ingestion window in Unix epoch milliseconds. Returns conversations whose createdAt is less than or equal to this value. If omitted, Fini defaults to the current time.
integer
default:"50"
Maximum number of conversations to return. Minimum 1, maximum 100.
string
Conversation ID to paginate from. Pass the nextCursor or prevCursor value returned by the previous response.
string
default:"next"
Pagination direction when a cursor is supplied. Note the inverted mapping: next moves to older conversations; previous moves back toward newer ones. This is because results are sorted newest first, so “next page” goes further back in time.
string
Optional agent ID filter. When provided, only conversations for that agent are returned.
array
Optional comma-separated conversation sources. Supported values: api, widget, ui, standalone, testsuite, replay, zendesk, intercom, front, hubspot, salesforce, gorgias, livechat, slack, discord, freshdesk, freshchat, and deskpro.
array
Optional comma-separated channel filter.
integer
Filter by CSAT rating. Accepted values are integers from 0 through 5.
The since / until window cannot exceed 90 days, and since must be strictly earlier than until. A request where since == until is rejected for the same reason and returns 400 Bad Request.
Additional behavior worth knowing:
  • The endpoint only returns conversations where Fini has touched the conversation.
  • since and until filter the Fini ingestion timestamp in createdAt. They do not filter externalCreatedAt or event timestamps.
  • source and channel accept either comma-separated values or repeated query params if your HTTP client sends arrays.

Response

array
Array of PublicConversation objects returned for the requested window and filters. See PublicConversation.
boolean
Whether more results exist beyond the current page.
string | null
Cursor to use when paginating forward. null if there is no next page.
string | null
Cursor to use when paginating backward. null if there is no previous page.
The 400 Bad Request message varies by cause. It may quote the specific rule that failed (since/until range > 90 days, since >= until, invalid UUID, etc.). See Errors for the full list of causes.

Field semantics

Conversation timestamps

createdAt is the Fini ingestion timestamp: when Fini created the stored conversation record. The since and until query parameters filter this field. externalCreatedAt is the timestamp reported by the source provider for the conversation. It is null when the source does not provide one. Use it to place delayed or backfilled conversations on the provider’s original timeline after retrieving them by their Fini ingestion window. Events follow the same distinction. events[].createdAt is when Fini stored the event, while events[].externalCreatedAt is the provider-side timestamp for that specific event when available.

userAttributes

userAttributes is an open-ended object. Fini returns the attributes captured on the conversation as-is, so the schema is consumer-defined and can vary by workspace. If your bots populate CRM-specific or workflow-specific fields, they appear here unchanged.

csatRating

events[].csatRating is passed through from the stored event data:
  • null means no CSAT value is present on that event
  • numeric values are returned as stored
If your upstream data writes 0, the API returns 0. Do not automatically treat 0 as “unrated” unless that is how your own channel or integration encodes the value.

Event roles

events[].role can currently be:

Event types

events[].type can currently be:

Nested objects

Pagination

Cursor pagination is relative to the current cursor, not to time:
  • pass nextCursor with direction=next to move to older conversations
  • pass prevCursor with direction=previous to move back toward newer conversations
If you omit cursor, the API starts from the newest matching conversations in the requested time window.

Errors

The query parameters are invalid. Common causes: an invalid UUID, since later than or equal to until, or a time window larger than 90 days. The response message quotes the specific rule that failed.
The API key is missing, malformed, revoked, or invalid. Confirm you are sending Authorization: Bearer fini_... with the full key.
The API key does not include the read scope required for this route.
You exceeded the rate limit. Back off and retry with your own client-side policy. See Rate limits.
Fini failed to fulfill the request. Retry once, then contact support if the error persists.

Rate limits

The API applies a global throttle of 100 requests per 60 seconds. Two caveats:
  • this endpoint does not currently document X-RateLimit-* headers
  • this endpoint does not currently document a Retry-After header contract
If you receive 429, back off and retry with your own client-side policy.