Skip to main content

Retrieving data

Listing records

Endpoint: POST /api/w/{workspace}/a/{app}/tickets/list

Omit the /w/{workspace}/a/{app} prefix to query across all workspaces and apps the user has access to.

Request body

{
"limitRecords": 10,
"skipRecords": 0,
"sortBy": "update_date desc",
"rlx": "state=\"open\"",
"listOfFields": "ALL",
"loadRichTexts": true,
"expandRecord": false,
"skipAncestors": true
}
ParameterTypeDescription
limitRecordsnumberMax records to return (default: 10)
skipRecordsnumberOffset for pagination (default: 0)
sortBystringSort field and direction, e.g. "creation_date desc"
rlxstringFilter expression (see Filter syntax below)
listOfFieldsstring"ALL" for all fields, "GRID" for list fields, or comma-separated field names
loadRichTextsbooleanInclude HTML description content
expandRecordbooleanExpand nested/linked record fields
skipAncestorsbooleanSkip loading parent records

Response

{
"data": [
{
"id": "record-guid",
"title": "Fix login timeout",
"description": "<p>Users report...</p>",
"creation_date": "2026-03-01T10:00:00.000Z",
"update_date": "2026-03-20T15:30:00.000Z",
"project_alias": "IT",
"publishing_alias": "TICKET",
"number": 123,
"state": "open",
"priority": "high",
"resolved_values": {
"state": "open",
"created_by_account_id": "user-guid"
},
"_renderobj": {
"keeper_id__resolved": "John Doe"
},
"transitions": ["edit", "close", "assign"],
"amount_of_comments": 3,
"__children_count": 2
}
],
"filteredRecordsCount": 125,
"unfilteredRecordsCount": 150
}

Add withTechnicalData=true as a query parameter to get the structured response with filteredRecordsCount and unfilteredRecordsCount. Without it, the response is a plain array.

Examples

List all users:

curl --request POST \
--url "https://acme.comind.work/api/w/METAMETA/a/USER/tickets/list" \
--header "Authorization: CMW_AUTH_CODE YOUR-TOKEN" \
--header "Content-Type: application/json" \
--data '{"limitRecords": 100}'

Filter tasks by priority and state:

curl --request POST \
--url "https://acme.comind.work/api/w/HELPDESK/a/TASK/tickets/list" \
--header "Authorization: CMW_AUTH_CODE YOUR-TOKEN" \
--header "Content-Type: application/json" \
--data '{"limitRecords": 10, "listOfFields": "priority,number,title", "rlx": "priority=\"normal\" AND state!=\"resolved\""}'

TypeScript SDK:

const tasks = await comind.records.retrieve(
"w/HELPDESK/a/TASK/tickets/list",
{
limitRecords: 10,
listOfFields: "priority,number,title",
rlx: 'priority="normal" AND state!="resolved"',
}
);

Filter syntax (RLX)

Filters use a relational expression language called RLX:

state="open"
priority>"normal" AND creation_date>="2026-01-01"
(state="open" OR state="in_progress") AND keeper_id="user-guid"

Operators

OperatorExample
=state="open"
!=state!="resolved"
>, >=creation_date>="2026-01-01"
<, <=c_amount<1000
ANDstate="open" AND priority="high"
ORstate="open" OR state="in_progress"
()Grouping: (state="open" OR state="new") AND priority="high"

Field names

Filters use internal (db) field names. Common system fields:

FieldDescription
project_aliasWorkspace alias (e.g., "IT")
publishing_aliasApp alias (e.g., "TICKET")
keeper_idAssignee (user GUID)
created_by_account_idRecord creator (user GUID)
update_account_idLast updater (user GUID)
stateCurrent state (db value, e.g., "open")
creation_dateRecord creation date
update_dateLast modification date

Person fields require the user's GUID, not their name. Use the schema endpoint to discover field names for a specific app.

tip

The MCP tools layer adds convenience features on top of the raw API - field name aliases (keeper instead of keeper_id), person name resolution ("John Doe" instead of GUIDs), link slug resolution ("IT/TASK123"), and {current-user} placeholders. If you're building an integration through MCP, these are available automatically.

In-list operators

For filtering against multiple values:

state in "open,in_progress,new":string[]
priority in "1,2,3":string[]

Searching records

Endpoint: POST /api/tickets/search

Full-text keyword search across records:

{
"ss": "budget approval",
"limitRecords": 10,
"rlx": "project_alias=\"IT\""
}
ParameterTypeDescription
ssstringSearch keywords
limitRecordsnumberMax results
rlxstringAdditional filter to scope the search

Response includes totalFound with the total number of matches.

Search syntax

  • Keywords: budget approval - finds records containing either word
  • Exact phrase: "budget approval" - wrapped in double quotes, matches the exact phrase
  • Exclude words: -draft - prefix with - to exclude records containing that word
  • Combined: "budget approval" -draft - exact phrase, excluding drafts
  • Wildcards (*, %) are not supported - the system handles word variations automatically

Search results are sorted by relevance. Results include __highlights with matched snippets.

Search vs list

  • Search (/tickets/search) - keyword-based, full-text, searches across content and attachments, sorted by relevance
  • List (/tickets/list) - field-based filtering, exact matches, sorted by any field
  • Use search to discover records by content. Use list when you know which fields to filter on.

Getting a workspace

Endpoint: GET /api/projects/{workspace}!WORKSPACE

Returns workspace details including installed apps and members:

{
"alias": "IT",
"title": "IT Department",
"tabs": [
{ "process_alias": "TICKET", "resolved_caption": "Tickets", "position": 1 },
{ "process_alias": "TASK", "resolved_caption": "Tasks", "position": 2 }
],
"workspace_users": [
{ "name": "John Doe", "role": "admin" }
]
}

Getting an app schema

Endpoint: GET /api/schema/{workspace}!{app}

Returns the full app schema - field definitions, lookup values, available actions, and form layouts:

{
"id": "template-guid",
"fields": {
"state": {
"name": "state",
"ed_caption": "State",
"ed_custom_field_type": "lookup"
},
"keeper_id": {
"name": "keeper_id",
"ed_caption": "Assignee",
"ed_custom_field_type": "authorinfo"
}
},
"lookups": {
"state": [
{ "id": "open", "caption": "Open" },
{ "id": "done", "caption": "Done" }
]
},
"transitions": [
{ "alias": "edit", "caption": "Edit", "visible": true }
]
}

Use the schema to discover field names, lookup values, and available actions before building queries.

Schema field properties

PropertyDescription
nameField db name (e.g., "keeper_id")
ed_captionDisplay label (string or localized object)
ed_custom_field_typeType marker: "authorinfo", "lookup_custom", "lookup_link_to_entity", "richtext", etc.
field_type.NET type: "System.String", "System.Int32", "System.DateTime"
ed_formatting_preValue prefix (e.g., "$")
ed_formatting_postValue suffix (e.g., "h")
ed_default_value_expressionDefault value for new records
ed_help_textHelp text / tooltip

Aggregating data

Endpoint: POST /api/w/{workspace}/a/{app}/tickets/list

Use pivot parameters to get counts, sums, and breakdowns:

{
"aggs4Pivot": true,
"dimensions4Pivot": "state,keeper_id",
"rlx": "creation_date>=\"2026-01-01\""
}
ParameterTypeDescription
aggs4PivotbooleanEnable aggregation mode
dimensions4PivotstringComma-separated fields to group by
statsFieldsstringNumeric field for SUM/AVG/MIN/MAX (optional)

Response

{
"data": [
{
"state": "open",
"state__resolved": "Open",
"keeper_id__resolved": "John Doe",
"_count": 25,
"total_real": { "sum": 125.5, "avg": 5.02, "min": 0.5, "max": 20.0 }
}
],
"filteredRecordsCount": 125,
"totalRecordsCount": 150
}

Time-based pivoting

Group by time periods using dimension suffixes:

SuffixGroups by
__pivotbymonthMonth
__pivotbyweekWeek

Example: "dimensions4Pivot": "keeper_id,creation_date__pivotbymonth" groups by assignee and month.

Record history

Endpoint: POST /api/tickets/history

Retrieve the change history for records - who changed what, when:

{
"limitRecords": 20,
"sortby": "version_timestamp desc",
"rlx": "id=\"record-guid\""
}

Response includes history entries with:

  • version_timestamp - when the change was made
  • version_account_id__resolved - who made the change
  • transition - action performed (e.g., "edit", "add", "comment")
  • comment - HTML comment text
  • Changed field values with __resolved suffixes for display values

Permissions

All queries respect the authenticated user's permissions:

  • Workspaces the user cannot access return empty results
  • Fields the user cannot access are excluded from responses
  • Record-level ACLs apply - some records may be filtered out