Query Syntax

The Analytics API is a PostgREST interface. Almost the full PostgREST query syntax is supported - filtering, column selection, ordering, pagination and counting all behave as documented upstream. Consult the PostgREST API reference for the complete grammar.

Filters take the form ?column=operator.value and combine with & as AND.

Examples

1. Select only the columns you need

curl "https://taa.data.tidio.com/agent_details?select=agent_id,agent_name,agent_email&limit=10" \
  -H "X-Tidio-Openapi-Client-Id: $TIDIO_CLIENT_ID" \
  -H "X-Tidio-Openapi-Client-Secret: $TIDIO_CLIENT_SECRET"

2. Filter on a date range - repeat the column to build a bounded window

curl "https://taa.data.tidio.com/ticket_details?created_at=gte.2026-08-01T00:00:00Z&created_at=lt.2026-08-19T00:00:00Z&limit=1000" \
  -H "X-Tidio-Openapi-Client-Id: $TIDIO_CLIENT_ID" \
  -H "X-Tidio-Openapi-Client-Secret: $TIDIO_CLIENT_SECRET"

3. Compare values, match a set, or test for null

curl "https://taa.data.tidio.com/ticket_details?solved_at=is.null&priority=in.(high,urgent)&limit=100" \
  -H "X-Tidio-Openapi-Client-Id: $TIDIO_CLIENT_ID" \
  -H "X-Tidio-Openapi-Client-Secret: $TIDIO_CLIENT_SECRET"

4. Case-insensitive text search - * is the wildcard, not %

curl "https://taa.data.tidio.com/lyro_suggestion_details?question=ilike.*how*&limit=100" \
  -H "X-Tidio-Openapi-Client-Id: $TIDIO_CLIENT_ID" \
  -H "X-Tidio-Openapi-Client-Secret: $TIDIO_CLIENT_SECRET"

5. Combine filters, sorting and a limit

curl "https://taa.data.tidio.com/lyro_thread_details?select=thread_id,thread_started_at,thread_resolution&thread_started_at=gte.2026-08-01T00:00:00Z&ind_thread_transferred_to_agent=eq.1&order=thread_started_at.desc&limit=500" \
  -H "X-Tidio-Openapi-Client-Id: $TIDIO_CLIENT_ID" \
  -H "X-Tidio-Openapi-Client-Secret: $TIDIO_CLIENT_SECRET"

Columns can also be renamed in the response (select=id:agent_id), sorted on several keys with explicit null placement (order=period_date.desc,avg_satisfaction_rate.asc.nullslast) and combined with OR groups (or=(priority.eq.high,priority.eq.urgent)). See the PostgREST reference for the full grammar.

Operators

OperatorMeaningExample
eq / neqequals / not equalsstatus=eq.solved
gt / gtegreater than / or equalcreated_at=gte.2026-08-01
lt / lteless than / or equalavg_satisfaction_rate=lt.3
like / ilikepattern match, * wildcardsubject=ilike.*refund*
inone of a listpriority=in.(high,urgent)
isnull, true, falsesolved_at=is.null
not.negates the operatorsolved_at=not.is.null
or=(…)OR groupor=(a.eq.1,b.eq.2)

Not supported

Resource embedding. PostgREST's join syntax - select=ticket_id,ticket_message_details(message_content) - does not work. The endpoints are views without declared foreign keys, so there are no relationships to traverse:

{"detail": {"code": "PGRST200", "message": "Could not find a relationship between …"}}

Join the data yourself after extracting it, using the shared id columns (ticket_id, thread_id, visitor_id, agent_id).

Writes. The API is strictly read-only. POST, PATCH, PUT and DELETE all return 405 Method Not Allowed.

Two behaviours worth knowing

Indicator columns are numeric, not boolean. Columns named ind_*, and a few others such as used_by_lyro, hold 0 or 1 as numbers. Using is.true on them fails:

# Fails: argument of IS TRUE must be type boolean, not type numeric
curl "https://taa.data.tidio.com/agent_thread_details?ind_missed_thread=is.true&limit=10" ...

# Correct
curl "https://taa.data.tidio.com/agent_thread_details?ind_missed_thread=eq.1&limit=10" ...

An invalid limit is ignored, not rejected. ?limit=abc returns the full unbounded result set rather than an error - which then risks a 408. Always make sure your limit is a number.


Did this page help you?