Kaiku

← All documentation

Search (JQL)

The part of the tracker’s query language Kaiku understands — and, as plainly, the part it does not.

A subset, on purpose

Kaiku reads the query language of the tracker it is compatible with, but not all of it. This page lists what is understood. Read the last section before relying on a query in a script: on the REST API a query is never refused, and a part it did not understand does not narrow the result.

Fields

FieldCompared against
projectthe project key
status, statusCategorythe status name; the category as "To Do", "In Progress" or Done
issuetype (or type), priority, resolutionthe name
assignee, reporter (or creator)the username — not the display name, not the email
key (or issuekey, id)the issue key, such as ABC-12
summary, description, textthe text; text searches the summary, the description and every comment
labelsany single label
sprintthe sprint name
parentthe parent key — direct children only
epicthe epic key — the epic itself, its issues and their sub-tasks
created, updated, duedatea date
archivedKaiku’s own: mentioning it is what brings archived issues into the result
a project’s own columnby its name (Segment = AI), or as cf[20003] / customfield_20003

Field names are not case-sensitive, and a name with a space in it goes in quotes.

Operators and combining

  • = and != — exact match, ignoring case.
  • ~ and !~contains: a plain substring, ignoring case. There is no word stemming, no wildcards and no relevance order.
  • IN (…) and NOT IN (…).
  • IS EMPTY and IS NOT EMPTY (also spelled IS NULL, IS NOT NULL). Write assignee IS EMPTY, not assignee = EMPTY — the second matches nothing.
  • >, >=, <, <= — on created, updated and duedate only.
  • AND, OR and parentheses. AND binds tighter than OR.
  • One function: currentUser(), for assignee, reporter and creator.
  • ORDER BY a field, ASC or DESC, several fields separated by commas. Sortable: created, updated, priority, status, key, summary, duedate. Without it, the newest issues come first.

Dates

A date is written in full: created >= 2026-09-01, or updated < "2026-09-01 10:00". To ask for «the last week», compute the date yourself.

Relative dates — -7d, startOfDay(), now() — are not understood, and a clause with one matches every issue. created = 2026-09-01 matches nothing: compare a date with >= and <.

What is not there

  • History operators: WAS, CHANGED.
  • A NOT in front of a clause. Use !=, !~ or NOT IN.
  • Functions other than currentUser(): membersOf(), openSprints(), startOfWeek() and the rest.
  • Fields not in the table above: component, fixVersion, watcher, worklogDate and the rest.
  • AND and OR must have a single space on each side: a query split over several lines is not read as intended.

A query is not refused

The REST search answers every query. A clause it cannot read, or one naming a field it does not know, is left out — it does not narrow the result. A misspelt field name therefore returns more issues, not an error.

  • != and NOT IN include the issues where the field is empty. The tracker you may know leaves them out.
  • A quoted value containing the words in , not in or an operator sign (summary ~ "sign in page") is misread and matches every issue. Search for a shorter piece of the phrase instead.

The search tool of Kaiku’s own MCP server is stricter: it refuses a query with an unknown field or an unreadable clause, names what it could not read, and runs nothing. See MCP servers.

Something missing, or not as described here? Write to hello@kaiku.tech