Skip to content
Try Kitsu Free

Coming from ShotGrid

ShotGrid (now Autodesk Flow Production Tracking) exposes a single generic query function: sg.find(entity_type, filters, fields). Kitsu takes a different approach. This page maps the sg.find() patterns you already know to their Kitsu equivalents.

If you are planning a full data migration, see Migrate to Kitsu.

Two different philosophies

In ShotGrid, the query logic lives in the filter triplets you pass to one generic function. Kitsu does not ship a query metalanguage. Instead it provides:

  • Named functions in gazu, the Python client: gazu.shot.all_shots_for_project(), gazu.task.all_tasks_for_person(), and so on.
  • Simple equality filters on every list route: /data/tasks?project_id=<id>.
  • Local processing: fetch the list you need, then filter it in Python.
  • Events and caching instead of repeated polling queries: see Event Listeners and Caching.
  • Dedicated routes via plugins when your studio needs a heavy custom query: see Make your Plugin.

The rationale: production lists are small (thousands of rows, not millions), so fetching a scoped list and filtering it locally is fast and keeps the API surface predictable, cacheable and permission-checked.

Translation cheat sheet

ShotGridKitsu (gazu)
sg.find("Project", [])gazu.project.all_open_projects()
sg.find("Shot", [["project", "is", p]])gazu.shot.all_shots_for_project(p)
sg.find_one("Shot", [["id", "is", id]])gazu.shot.get_shot(id)
sg.find("Task", [["task_assignees", "is", me]])gazu.task.all_tasks_for_person(me)
sg.find("Version", [["entity", "is", shot]])gazu.files.get_last_output_files_for_entity(shot)
fields=["code", "sg_status_list"]fields= query parameter (see below)
Complex filters (in, contains, date ranges)Fetch the scoped list, filter in Python
sg.create() / sg.update() / sg.delete()gazu.*.new_*() / update_*() / remove_*()
Event daemon pollinggazu.events WebSocket listeners

When no named function matches, the generic client covers every model exposed by the API:

python
tasks = gazu.client.fetch_all("tasks", {"project_id": project["id"]})

Requesting only some fields

Every /data/<model> list route accepts a fields parameter, the equivalent of ShotGrid's fields argument. It trims each returned entry to the requested attributes (id and type are always included):

python
persons = gazu.client.fetch_all(
    "persons", {"fields": "first_name,last_name"}
)

INFO

The fields parameter requires Zou 1.0.55 or later.

Complex queries

For anything beyond equality filters, fetch the scoped list and filter locally:

python
tasks = gazu.task.all_tasks_for_project(project)
wip = [t for t in tasks if t["task_status_id"] == wip_status["id"]]

On a studio network this is usually faster than it sounds: one request, then plain Python. If the same heavy query keeps coming back, add a dedicated route through a plugin: you get a proper SQL query server side, with the permission model still applied.

Staying in sync without polling

The idiomatic Kitsu replacement for the ShotGrid event daemon is the event stream. Instead of re-running find() on a timer, subscribe once:

python
gazu.events.add_listener(event_client, "task:update", my_callback)

See the Event Listeners guide for a full setup.