TillyGen API
REST API for enterprise workspaces: read and write access to projects, tasks, crew, equipment, shooting schedules and more. All responses are JSON, all IDs are UUIDs, timestamps are ISO 8601.
The machine-readable spec lives at /api/v1/openapi.json (OpenAPI 3.1).
Die maschinenlesbare Spec liegt unter /api/v1/openapi.json (OpenAPI 3.1).
BASE https://app.tillygen.com/api/v1
Authentication
Every request needs an API key as a bearer token. Keys are created in TillyGen under Settings → API (Enterprise plan, Owner or Admin) and start with tg_live_. The plain text is shown exactly once at creation — TillyGen stores only a hash.
Jede Anfrage braucht einen API-Key als Bearer-Token. Keys werden in TillyGen unter Einstellungen → API erstellt (Enterprise-Plan, Owner oder Admin) und beginnen mit tg_live_. Der Klartext wird genau einmal beim Erstellen angezeigt — TillyGen speichert nur einen Hash.
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/me"
A key belongs to exactly one workspace and has one of two permissions: read-only (GET only) or read-write (also POST, PATCH, DELETE). Writes run under the account of the key's creator — activities and notifications behave like changes made in the app.
Ein Key gehört zu genau einem Workspace und hat eine von zwei Berechtigungen: read-only (nur GET) oder read-write (auch POST, PATCH, DELETE). Schreibzugriffe laufen unter dem Konto des Key-Erstellers — Aktivitäten und Benachrichtigungen verhalten sich wie bei Änderungen in der App.
Key context (/me)
Bootstrap endpoint for integrations: returns the key prefix, permission and the key's workspace.
Example response
Copy {
"data": {
"key_prefix": "tg_live_a1b2",
"permission": "read_write",
"workspace": { "id": "…", "name": "…" }
}
}
Errors
Errors respond with a uniform JSON body. error is a machine-readable code, request_id identifies the request for support cases (also sent as the x-request-id header on every response). Validation errors carry the affected fields in details.
Fehler antworten mit einem einheitlichen JSON-Body. error ist ein maschinenlesbarer Code, request_id identifiziert die Anfrage für Support-Fälle (auch als Header x-request-id auf jeder Antwort). Validierungsfehler tragen die betroffenen Felder in details.
Copy {
"error": "validation_failed",
"message": "…",
"details": [{ "path": "name", "code": "too_small", "message": "…" }],
"request_id": "9f0e…"
}
Error codes
Status Code Meaning 400 invalid_bodyRequest body is not valid JSON or violates the schema.
400 invalid_cursorThe cursor parameter is unreadable or invalid.
400 invalid_filterA query filter has an invalid value (e.g. not a UUID).
401 missing_authorizationAuthorization header is missing or is not a bearer token.
401 invalid_keyThe API key is unknown.
401 key_revokedThe API key has been revoked.
403 not_enabledThe API is not enabled for this workspace (Enterprise plan required).
403 read_only_keyWrite operation with a read-only key.
403 key_creator_inactiveThe key's creator is no longer an active member of the workspace.
403 forbiddenThe operation is not allowed for this resource or role.
404 not_foundResource does not exist or lies outside the key's workspace.
404 unknown_resourceUnknown resource path.
405 method_not_allowedHTTP method not supported for this route.
409 conflictUniqueness or reference rule violated (e.g. a timer is already running).
409 duplicate_numberProject number already taken.
422 validation_failedValidation failed (see the details array).
429 rate_limitedRate limit reached — check the Retry-After header.
500 server_errorUnexpected server error — include the request_id when contacting support.
503 unavailableService temporarily unavailable.
Rate limits
Each API key is allowed 120 requests per minute, each IP address 480. Beyond that the API responds with 429 rate_limited and a Retry-After header in seconds.
Pro API-Key sind 120 Anfragen pro Minute erlaubt, pro IP-Adresse 480. Darüber antwortet die API mit 429 rate_limited und einem Retry-After-Header in Sekunden.
Browse the API
Workspace 4 endpoints Clients, talents, locations and brands — the shared pools.
Projects 1 endpoint Projects — the containers everything hangs off.
Tasks 6 endpoints Task boards: sections, tags, comments, dependencies.
Creative & shots 7 endpoints Creatives, shot lists and concepts.
Equipment 8 endpoints Gear, kits, packing lists and rentals.
Crew & time 14 endpoints People, bookings, time and availability.
Shooting days & call sheets 6 endpoints Shooting days and their call sheets.
Media 1 endpoint Uploaded media and signed downloads.
Review 6 endpoints Review assets, versions, comments and approvals.
Examples & use cases
The API exists so TillyGen doesn't become another island. Everything your crew plans, shoots and logs is readable and writable — which means your existing stack stays your stack.
Die API existiert, damit TillyGen keine weitere Insel wird. Alles, was eure Crew plant, dreht und erfasst, ist les- und schreibbar — euer bestehender Stack bleibt also euer Stack.
TillyGen in your stack
Real scenarios on rotation — tap the dots or just watch.
Automations in practice
The TillyGen API is deliberately plain: REST, JSON and an API key — that's all it takes to connect your film production planning to the rest of your stack. Tools like Zapier, Make or n8n dock on without any infrastructure of your own; if you'd rather build it yourself, a few lines of curl or JavaScript get you there.
Die TillyGen API ist bewusst schlicht gehalten: REST, JSON und ein API-Key — mehr braucht es nicht, um eure Film-Produktionsplanung mit dem Rest eures Stacks zu verbinden. Tools wie Zapier, Make oder n8n docken ohne eigene Infrastruktur an; wer lieber selbst baut, kommt mit ein paar Zeilen curl oder JavaScript ans Ziel.
The automations crews set up first usually look like this: a sync keeps tasks aligned between TillyGen and the project management tool — production works in the shooting schedule, post lives in Asana, and status changes travel both ways on their own. An evening job reads tomorrow's shooting days and posts the call times to the crew channel in Slack, so nobody digs through call sheet PDFs at 6 am. And at the end of the month, approved time entries flow straight into payroll as a clean CSV instead of screenshots.
Die Automationen, die Crews zuerst bauen, sehen meist so aus: Ein Sync hält Aufgaben zwischen TillyGen und dem Projektmanagement-Tool aktuell — die Produktion arbeitet im Drehplan, die Post lebt in Asana, und Status-Änderungen wandern von selbst in beide Richtungen. Ein Abend-Job liest die Drehtage von morgen und postet die Call-Times in den Slack-Channel der Crew, damit niemand um 6 Uhr morgens Call-Sheet-PDFs durchsucht. Und am Monatsende fließen genehmigte Zeiteinträge als sauberes CSV direkt in die Lohnabrechnung — statt Screenshots.
The reverse direction works just as well: a new deal in your CRM creates the client in TillyGen, and a task ticked off in Asana checks itself off in the shooting schedule too. Every resource in this reference — call sheets, shotlists, schedules, time tracking — can be read and written. Your production workflow sets the direction; the API follows it, not the other way around.
Der umgekehrte Weg funktioniert genauso: Ein neuer Deal im CRM legt den Kunden in TillyGen an, und ein in Asana abgehakter Task hakt sich auch im Drehplan ab. Jede Ressource dieser Referenz — Call Sheets, Shotlists, Drehpläne, Zeiterfassung — lässt sich lesen und schreiben. Euer Produktions-Workflow gibt die Richtung vor; die API folgt ihm, nicht umgekehrt.
Workspace
Shared pools that live at workspace level: clients, talents, shooting locations and brands. Projects and shooting days reference these records instead of duplicating them — update a phone number once and every call sheet picks it up.
Geteilte Pools auf Workspace-Ebene: Kunden, Talents, Drehorte und Brands. Projekte und Drehtage referenzieren diese Einträge, statt sie zu duplizieren — eine Telefonnummer einmal ändern, und jedes Callsheet zieht nach.
/clients
The workspace's client pool. Creating is allowed for all roles; updating and deleting are Enterprise features (RLS).
GET /api/v1/clients
POST /api/v1/clients
GET /api/v1/clients/{id}
PATCH /api/v1/clients/{id}
DELETE /api/v1/clients/{id}
List parameters
Parameter Values updated_sinceISO 8601 optional
Create body (POST)
Field Type namestring required
emailstring | null optional
phonestring | null optional
role_labelstring | null optional
notestring | null optional
Update body (PATCH)
Field Type namestring optional
emailstring | null optional
phonestring | null optional
role_labelstring | null optional
notestring | null optional
Response fields
idworkspace_idnameemailphonerole_labelnotelast_used_atcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/clients?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…"}' \
"https://app.tillygen.com/api/v1/clients"
/talents
Talents (people and objects). Scope anchor: optional project_id OR brand_id on create — otherwise workspace (precedence project > brand > workspace, exactly one anchor).
GET /api/v1/talents
POST /api/v1/talents
GET /api/v1/talents/{id}
PATCH /api/v1/talents/{id}
DELETE /api/v1/talents/{id}
List parameters
Parameter Values typeperson | object optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type namestring required
type"person" | "object" optional
descriptionstring | null optional
ageinteger | null optional
genderstring | null optional
heightnumber | null optional
body_typestring | null optional
languagesstring | null optional
locationstring | null optional
contactstring | null optional
daily_ratenumber | null optional
tagsarray<string> | null optional
project_iduuid | null optional
brand_iduuid | null optional
Update body (PATCH)
Field Type namestring optional
type"person" | "object" optional
descriptionstring | null optional
ageinteger | null optional
genderstring | null optional
heightnumber | null optional
body_typestring | null optional
languagesstring | null optional
locationstring | null optional
contactstring | null optional
daily_ratenumber | null optional
tagsarray<string> | null optional
Response fields
idworkspace_idbrand_idproject_idnametypedescriptionagegenderheightbody_typelanguageslocationcontactdaily_ratetagscreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/talents?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…"}' \
"https://app.tillygen.com/api/v1/talents"
/locations
Shooting locations — workspace master data (always anchored to the workspace, never to a project or brand). daily_rate and max_crew_size are free text. nearby is computed by TillyGen and read-only.
GET /api/v1/locations
POST /api/v1/locations
GET /api/v1/locations/{id}
PATCH /api/v1/locations/{id}
DELETE /api/v1/locations/{id}
List parameters
Parameter Values updated_sinceISO 8601 optional
Create body (POST)
Field Type namestring required
descriptionstring | null optional
categorystring | null optional
typestring | null optional
contact_namestring | null optional
contact_detailsstring | null optional
parkingstring | null optional
power_supplystring | null optional
daily_ratestring | null optional
max_crew_sizestring | null optional
addressobject | null optional
Update body (PATCH)
Field Type namestring optional
descriptionstring | null optional
categorystring | null optional
typestring | null optional
contact_namestring | null optional
contact_detailsstring | null optional
parkingstring | null optional
power_supplystring | null optional
daily_ratestring | null optional
max_crew_sizestring | null optional
addressobject | null optional
Response fields
idworkspace_idbrand_idproject_idnamedescriptioncategorytypecontact_namecontact_detailsparkingpower_supplydaily_ratemax_crew_sizeaddressnearbycreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/locations?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…"}' \
"https://app.tillygen.com/api/v1/locations"
/brands
The workspace's brands — read-only. Used to resolve IDs for brand-anchored resources (talents, projects).
GET /api/v1/brands
GET /api/v1/brands/{id}
Response fields
idworkspace_idnamedescriptionindustrybrand_typetarget_audienceage_rangelocationwebsitecreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/brands?limit=50"
Projects
Projects are the container everything else hangs off — schedules, shot lists, equipment lists and task boards all anchor to one. Anchored directly on the workspace or via a brand.
Projekte sind der Container, an dem alles andere hängt — Drehpläne, Shotlists, Packlisten und Aufgaben-Boards ankern alle an einem Projekt. Verankert direkt am Workspace oder über eine Brand.
/projects
The workspace's projects (anchored directly or via a brand). Deleting removes all project content irreversibly (FK cascades); storage is reconciled immediately.
GET /api/v1/projects
POST /api/v1/projects
GET /api/v1/projects/{id}
PATCH /api/v1/projects/{id}
DELETE /api/v1/projects/{id}
List parameters
Parameter Values brand_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type namestring required
brand_iduuid | null optional
aspect_ratiostring optional
project_numberstring | null optional
seed_default_filesboolean optional
task_template_iduuid | null optional
locale"de" | "en" | "fr" | "es" optional
Update body (PATCH)
Field Type namestring optional
descriptionstring | null optional
timezonestring | null optional
budget_centsinteger | null optional
Response fields
idworkspace_idbrand_idnamedescriptionproject_numberaspect_ratiotimezonebudget_centssort_ordercreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/projects?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…"}' \
"https://app.tillygen.com/api/v1/projects"
Tasks
Tasks live on a project board: sections structure the board, tags label tasks, watchers control notifications, and comments and dependencies attach to a single task via task_id.
Aufgaben leben auf dem Projekt-Board: Sektionen strukturieren das Board, Tags beschriften Aufgaben, Beobachter steuern Benachrichtigungen, Kommentare und Abhängigkeiten hängen über task_id an einer einzelnen Aufgabe.
/tasks
A project's tasks. completed_at mirrors the status and is maintained server-side; assignment and due-date notifications run automatically.
GET /api/v1/tasks
POST /api/v1/tasks
GET /api/v1/tasks/{id}
PATCH /api/v1/tasks/{id}
DELETE /api/v1/tasks/{id}
List parameters
Parameter Values project_idProject (UUID) optional
statusopen | in_progress | blocked | done optional
prioritylow | normal | high | urgent optional
assignee_crew_member_idUUID optional
section_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type titlestring required
descriptionstring | null optional
status"open" | "in_progress" | "blocked" | "done" optional
priority"low" | "normal" | "high" | "urgent" optional
labelsarray<string> optional
assignee_crew_member_iduuid | null optional
parent_task_iduuid | null optional
section_iduuid | null optional
schedule_iduuid | null optional
start_atdatetime | null optional
due_atdatetime | null optional
project_iduuid required
Update body (PATCH)
Field Type titlestring optional
descriptionstring | null optional
status"open" | "in_progress" | "blocked" | "done" optional
priority"low" | "normal" | "high" | "urgent" optional
labelsarray<string> optional
assignee_crew_member_iduuid | null optional
parent_task_iduuid | null optional
section_iduuid | null optional
schedule_iduuid | null optional
start_atdatetime | null optional
due_atdatetime | null optional
Response fields
idproject_idtitledescriptionstatusprioritylabelsassignee_crew_member_idassignee_user_idparent_task_idsection_idschedule_idpositionstart_atdue_atcompleted_attag_idscreated_bycreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/tasks?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"title":"…","project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/tasks"
/task-sections
A project's board sections. Seed sections carry name=null (the label comes from the app language); the API assigns the position at the end.
GET /api/v1/task-sections
POST /api/v1/task-sections
GET /api/v1/task-sections/{id}
PATCH /api/v1/task-sections/{id}
DELETE /api/v1/task-sections/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Create body (POST)
Field Type namestring required
colorstring optional
project_iduuid required
Update body (PATCH)
Field Type namestring optional
colorstring optional
Response fields
idproject_idnamecolorpositionis_donestatus_equivcreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/task-sections?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…","project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/task-sections"
/task-watchers
A task's watchers (they control notifications). Listing requires ?task_id=; deleting goes through the collection with ?task_id=&user_id= (no id PK).
GET /api/v1/task-watchers
POST /api/v1/task-watchers
DELETE /api/v1/task-watchers?task_id=…&user_id=…
List parameters
Parameter Values task_idParent (UUID) required
Create body (POST)
Field Type task_iduuid required
user_iduuid required
Response fields
task_iduser_idcreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/task-watchers?task_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"task_id":"00000000-0000-0000-0000-000000000000","user_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/task-watchers"
/task-dependencies
Dependencies between tasks (task_id waits for depends_on_task_id). Listing requires ?task_id=; deleting goes through the collection with ?task_id=&depends_on_task_id= (no id PK).
GET /api/v1/task-dependencies
POST /api/v1/task-dependencies
DELETE /api/v1/task-dependencies?task_id=…&depends_on_task_id=…
List parameters
Parameter Values task_idParent (UUID) required
Create body (POST)
Field Type task_iduuid required
depends_on_task_iduuid required
Response fields
task_iddepends_on_task_idcreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/task-dependencies?task_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"task_id":"00000000-0000-0000-0000-000000000000","depends_on_task_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/task-dependencies"
Creative & shots
The pre-production layer. A creative is one concept unit inside a project; segments split it into story sections and shots form its shot list (camera angles reference a master shot). Concepts, canvases and briefings live in nestable folders; comments and set markers attach to individual shots.
Die Pre-Production-Ebene. Ein Creative ist eine Konzept-Einheit im Projekt; Segmente teilen es in Story-Abschnitte, Shots bilden die Shotlist (Kamera-Angles referenzieren einen Master-Shot). Konzepte, Canvas und Briefings liegen in verschachtelbaren Ordnern; Kommentare und Set-Marker hängen an einzelnen Shots.
/creatives
A project's creatives (concept units). The API assigns the position at the end of the project list.
GET /api/v1/creatives
POST /api/v1/creatives
GET /api/v1/creatives/{id}
PATCH /api/v1/creatives/{id}
DELETE /api/v1/creatives/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Create body (POST)
Field Type titlestring | null optional
statusstring | null optional
goalstring | null optional
key_messagestring | null optional
audiencestring | null optional
aspect_ratiostring | null optional
project_iduuid required
Update body (PATCH)
Field Type titlestring | null optional
statusstring | null optional
goalstring | null optional
key_messagestring | null optional
audiencestring | null optional
aspect_ratiostring | null optional
Response fields
idproject_idtitlestatusgoalkey_messageaudienceaspect_ratiopositionmust_havesno_gosreferencescreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/creatives?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/creatives"
/segments
A creative's segments (story sections). Listing requires ?creative_id=; the API assigns the position at the end.
GET /api/v1/segments
POST /api/v1/segments
GET /api/v1/segments/{id}
PATCH /api/v1/segments/{id}
DELETE /api/v1/segments/{id}
List parameters
Parameter Values creative_idParent (UUID) required
Create body (POST)
Field Type titlestring | null optional
descriptionstring | null optional
durationinteger | null optional
creatives_iduuid required
Update body (PATCH)
Field Type titlestring | null optional
descriptionstring | null optional
durationinteger | null optional
Response fields
idcreatives_idtitledescriptiondurationpositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/segments?creative_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"creatives_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/segments"
/shots
The shot list's shots. New shots are appended to the end of the creative; an angle is created via shot_id (a reference to the master shot). c_talents/c_locations are read-only (app-managed reference lists).
GET /api/v1/shots
POST /api/v1/shots
GET /api/v1/shots/{id}
PATCH /api/v1/shots/{id}
DELETE /api/v1/shots/{id}
List parameters
Parameter Values project_idProject (UUID) optional
creative_idUUID optional
segment_idUUID optional
Create body (POST)
Field Type c_actionstring | null optional
c_audiostring | null optional
c_on_screen_textstring | null optional
c_segment_iduuid | null optional
shot_sizestring | null optional
shot_statusstring | null optional
camera_movementstring | null optional
camera_perspectivestring | null optional
camera_equipmentstring | null optional
lensstring | null optional
frame_ratestring | null optional
durationinteger | null optional
day_nightstring | null optional
int_extstring | null optional
scene_numberstring | null optional
script_pagesstring | null optional
project_iduuid required
creatives_iduuid required
shot_iduuid | null optional
Update body (PATCH)
Field Type c_actionstring | null optional
c_audiostring | null optional
c_on_screen_textstring | null optional
c_segment_iduuid | null optional
shot_sizestring | null optional
shot_statusstring | null optional
camera_movementstring | null optional
camera_perspectivestring | null optional
camera_equipmentstring | null optional
lensstring | null optional
frame_ratestring | null optional
durationinteger | null optional
day_nightstring | null optional
int_extstring | null optional
scene_numberstring | null optional
script_pagesstring | null optional
Response fields
idproject_idcreatives_idc_segment_idc_actionc_audioc_on_screen_textc_talentsc_locationsshot_sizeshot_statuscamera_movementcamera_perspectivecamera_equipmentlensframe_ratedurationday_nightint_extscene_numberscript_pagespositionangleshot_idactive_anglecreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/shots?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000","creatives_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/shots"
/concepts
A project's concepts, canvases and briefings. content (TipTap JSON) can only be set on create — updates change metadata (title, folder, favorite); the content lives in the collaborative app session.
GET /api/v1/concepts
POST /api/v1/concepts
GET /api/v1/concepts/{id}
PATCH /api/v1/concepts/{id}
DELETE /api/v1/concepts/{id}
List parameters
Parameter Values project_idProject (UUID) optional
typeconcept | canvas | briefing optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type project_iduuid required
titlestring optional
type"concept" | "canvas" | "briefing" optional
folder_iduuid | null optional
contentobject optional
Update body (PATCH)
Field Type titlestring | null optional
favoriteboolean optional
folder_iduuid | null optional
Response fields
idproject_idtitletypestatusfavoritefolder_idcontentcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/concepts?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/concepts"
/concept-folders
Folders of a project's concept library (nestable via parent_folder_id). Concepts reference their folder via concepts.folder_id.
GET /api/v1/concept-folders
POST /api/v1/concept-folders
GET /api/v1/concept-folders/{id}
PATCH /api/v1/concept-folders/{id}
DELETE /api/v1/concept-folders/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Create body (POST)
Field Type project_iduuid required
namestring required
parent_folder_iduuid | null optional
Update body (PATCH)
Field Type namestring optional
parent_folder_iduuid | null optional
Response fields
idproject_idnameparent_folder_idsort_ordercreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/concept-folders?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000","name":"…"}' \
"https://app.tillygen.com/api/v1/concept-folders"
/shot-markers
On-set markers on shots (good/great/safety/ng/note) with an optional timecode. marked_at is set by the database on create. Listing requires ?shot_id=.
GET /api/v1/shot-markers
POST /api/v1/shot-markers
GET /api/v1/shot-markers/{id}
PATCH /api/v1/shot-markers/{id}
DELETE /api/v1/shot-markers/{id}
List parameters
Parameter Values shot_idParent (UUID) required
Create body (POST)
Field Type label"good" | "great" | "safety" | "ng" | "note" optional
notestring | null optional
timecodestring | null optional
shot_iduuid required
Update body (PATCH)
Field Type label"good" | "great" | "safety" | "ng" | "note" optional
notestring | null optional
timecodestring | null optional
Response fields
idshot_idproject_idlabelnotetimecodemarked_atcreated_bycreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/shot-markers?shot_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"shot_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/shot-markers"
Equipment
The gear layer. The equipment pool holds devices and their accessories, kits bundle gear into reusable sets, elements are project props. Packing lists reference equipment, kits or elements per project; rentals track gear leaving and entering the house — including inventory blocking.
Die Equipment-Ebene. Der Pool hält Geräte und ihr Zubehör, Kits bündeln Equipment zu wiederverwendbaren Sets, Elemente sind Projekt-Requisiten. Packlisten referenzieren Equipment, Kits oder Elemente pro Projekt; Leih-Vorgänge verfolgen Material, das das Haus verlässt oder hereinkommt — inklusive Bestandssperre.
/equipment
The workspace's equipment pool. Accessories are created via equipment_id (a reference to the parent device); ?equipment_id= lists a device's accessories.
GET /api/v1/equipment
POST /api/v1/equipment
GET /api/v1/equipment/{id}
PATCH /api/v1/equipment/{id}
DELETE /api/v1/equipment/{id}
List parameters
Parameter Values equipment_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type namestring required
manufacturerstring | null optional
modelstring | null optional
descriptionstring | null optional
categoryarray<string> optional
subcategorystring | null optional
tagsarray<string> optional
conditionstring | null optional
quantityinteger | null optional
serial_numberstring | null optional
internal_idstring | null optional
storage_locationstring | null optional
shelfstring | null optional
containerstring | null optional
vendorstring | null optional
invoice_numberstring | null optional
purchase_datestring | null optional
purchase_pricenumber | null optional
warranty_untilstring | null optional
weightnumber | null optional
country_of_originstring | null optional
customs_valuenumber | null optional
customs_tariff_numberstring | null optional
equipment_iduuid | null optional
Update body (PATCH)
Field Type namestring optional
manufacturerstring | null optional
modelstring | null optional
descriptionstring | null optional
categoryarray<string> optional
subcategorystring | null optional
tagsarray<string> optional
conditionstring | null optional
quantityinteger | null optional
serial_numberstring | null optional
internal_idstring | null optional
storage_locationstring | null optional
shelfstring | null optional
containerstring | null optional
vendorstring | null optional
invoice_numberstring | null optional
purchase_datestring | null optional
purchase_pricenumber | null optional
warranty_untilstring | null optional
weightnumber | null optional
country_of_originstring | null optional
customs_valuenumber | null optional
customs_tariff_numberstring | null optional
Response fields
idworkspace_idproject_idequipment_idnamemanufacturermodeldescriptioncategorysubcategorytagsconditionquantityserial_numberinternal_idstorage_locationshelfcontainervendorinvoice_numberpurchase_datepurchase_pricewarranty_untilweightcountry_of_origincustoms_valuecustoms_tariff_numberaccessories_positioncreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/equipment?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…"}' \
"https://app.tillygen.com/api/v1/equipment"
/kits
The workspace's kits (equipment sets). Contents live in kit-items.
GET /api/v1/kits
POST /api/v1/kits
GET /api/v1/kits/{id}
PATCH /api/v1/kits/{id}
DELETE /api/v1/kits/{id}
List parameters
Parameter Values updated_sinceISO 8601 optional
Create body (POST)
Field Type titlestring required
descriptionstring | null optional
notesstring | null optional
categoryarray<string> optional
favoriteboolean | null optional
Update body (PATCH)
Field Type titlestring optional
descriptionstring | null optional
notesstring | null optional
categoryarray<string> optional
favoriteboolean | null optional
Response fields
idworkspace_idtitledescriptionnotescategoryfavoritepositioncreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/kits?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"title":"…"}' \
"https://app.tillygen.com/api/v1/kits"
/kit-items
A kit's items (references to equipment). Listing requires ?kit_id=.
GET /api/v1/kit-items
POST /api/v1/kit-items
GET /api/v1/kit-items/{id}
PATCH /api/v1/kit-items/{id}
DELETE /api/v1/kit-items/{id}
List parameters
Parameter Values kit_idParent (UUID) required
Create body (POST)
Field Type kit_iduuid required
equipment_iduuid required
quantityinteger optional
Update body (PATCH)
Field Type quantityinteger optional
Response fields
idkit_idequipment_idquantitypositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/kit-items?kit_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"kit_id":"00000000-0000-0000-0000-000000000000","equipment_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/kit-items"
/elements
A project's elements/props, optionally assigned to a creative.
GET /api/v1/elements
POST /api/v1/elements
GET /api/v1/elements/{id}
PATCH /api/v1/elements/{id}
DELETE /api/v1/elements/{id}
List parameters
Parameter Values project_idProject (UUID) optional
creative_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type titlestring | null optional
descriptionstring | null optional
statusboolean optional
project_iduuid required
creatives_iduuid | null optional
Update body (PATCH)
Field Type titlestring | null optional
descriptionstring | null optional
statusboolean optional
Response fields
idproject_idcreatives_idtitledescriptionstatuspositioncreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/elements?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/elements"
/equipment-lists
A project's packing lists. Contents live in equipment-list-references.
GET /api/v1/equipment-lists
POST /api/v1/equipment-lists
GET /api/v1/equipment-lists/{id}
PATCH /api/v1/equipment-lists/{id}
DELETE /api/v1/equipment-lists/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Create body (POST)
Field Type titlestring | null optional
notesstring | null optional
starts_atdatetime | null optional
favoriteboolean | null optional
project_iduuid required
Update body (PATCH)
Field Type titlestring | null optional
notesstring | null optional
starts_atdatetime | null optional
favoriteboolean | null optional
Response fields
idproject_idtitlenotesstarts_atfavoritepositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/equipment-lists?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/equipment-lists"
/equipment-list-references
A packing list's items. reference_type determines the reference: equipment -> equipment_id, kit -> kit_id, element -> element_id (exactly one set). Listing requires ?equipment_list_id=.
GET /api/v1/equipment-list-references
POST /api/v1/equipment-list-references
GET /api/v1/equipment-list-references/{id}
PATCH /api/v1/equipment-list-references/{id}
DELETE /api/v1/equipment-list-references/{id}
List parameters
Parameter Values equipment_list_idParent (UUID) required
reference_typeequipment | kit | element optional
Create body (POST)
Variante equipment
Field Type reference_type"equipment" required
equipment_iduuid required
equipment_list_iduuid required
quantityinteger optional
notesstring | null optional
checkedboolean optional
Variante kit
Field Type reference_type"kit" required
kit_iduuid required
equipment_list_iduuid required
quantityinteger optional
notesstring | null optional
checkedboolean optional
Variante element
Field Type reference_type"element" required
element_iduuid required
equipment_list_iduuid required
quantityinteger optional
notesstring | null optional
checkedboolean optional
Update body (PATCH)
Field Type quantityinteger optional
notesstring | null optional
checkedboolean optional
Response fields
idequipment_list_idreference_typeequipment_idkit_idelement_idquantitynotescheckedpositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/equipment-list-references?equipment_list_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"reference_type":"equipment","equipment_id":"00000000-0000-0000-0000-000000000000","equipment_list_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/equipment-list-references"
/equipment-rentals
Rental transactions for equipment. direction 'out' = your own equipment is rented out, 'in' = third-party equipment is rented in. Items live in equipment-rental-items; for 'out', 'reserved'/'out' occupy inventory.
GET /api/v1/equipment-rentals
POST /api/v1/equipment-rentals
GET /api/v1/equipment-rentals/{id}
PATCH /api/v1/equipment-rentals/{id}
DELETE /api/v1/equipment-rentals/{id}
List parameters
Parameter Values directionout | in optional
statusreserved | out | returned | cancelled optional
client_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type titlestring | null optional
client_iduuid | null optional
counterparty_namestring | null optional
contact_emailstring | null optional
contact_phonestring | null optional
status"reserved" | "out" | "returned" | "cancelled" optional
currencystring optional
notesstring | null optional
direction"out" | "in" required
starts_onstring required
ends_onstring required
Update body (PATCH)
Field Type titlestring | null optional
client_iduuid | null optional
counterparty_namestring | null optional
contact_emailstring | null optional
contact_phonestring | null optional
status"reserved" | "out" | "returned" | "cancelled" optional
currencystring optional
notesstring | null optional
starts_onstring optional
ends_onstring optional
Response fields
idworkspace_iddirectiontitleclient_idcounterparty_namecontact_emailcontact_phonestarts_onends_onstatuscurrencynotescreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/equipment-rentals?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"direction":"out","starts_on":"…","ends_on":"…"}' \
"https://app.tillygen.com/api/v1/equipment-rentals"
/equipment-rental-items
A rental transaction's items. For direction 'out', equipment_id references an inventory row; for 'in', the name variant creates the rented equipment row (it disappears with the transaction). Listing requires ?rental_id=.
GET /api/v1/equipment-rental-items
POST /api/v1/equipment-rental-items
GET /api/v1/equipment-rental-items/{id}
PATCH /api/v1/equipment-rental-items/{id}
DELETE /api/v1/equipment-rental-items/{id}
List parameters
Parameter Values rental_idParent (UUID) required
Create body (POST)
Field Type rental_iduuid required
quantityinteger optional
daily_ratenumber | null optional
flat_pricenumber | null optional
notesstring | null optional
equipment_iduuid required
Field Type rental_iduuid required
quantityinteger optional
daily_ratenumber | null optional
flat_pricenumber | null optional
notesstring | null optional
namestring required
manufacturerstring | null optional
modelstring | null optional
serial_numberstring | null optional
weightnumber | null optional
Update body (PATCH)
Field Type quantityinteger optional
daily_ratenumber | null optional
flat_pricenumber | null optional
notesstring | null optional
Response fields
idrental_idequipment_idquantitydaily_rateflat_pricenotespositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/equipment-rental-items?rental_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"rental_id":"00000000-0000-0000-0000-000000000000","equipment_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/equipment-rental-items"
Crew & time
Everything about people. crew-members is the pool; assignments book people onto shooting days and time entries feed the overtime accounts. Contracts, documents and qualifications hang off a member; pre-planning runs through shoot windows, holds and absences, while vacation entitlements, work schedules and holiday overrides drive the availability math.
Alles rund um Menschen. crew-members ist der Pool; Buchungen setzen Leute auf Drehtage, Zeiteinträge speisen die Überstunden-Konten. Verträge, Dokumente und Qualifikationen hängen am Mitglied; die Vorplanung läuft über Drehfenster, Vormerkungen und Abwesenheiten, während Urlaubskonten, Wochenmodelle und Feiertags-Overrides die Verfügbarkeits-Rechnung treiben.
/crew-membersGET POST PATCH DELETE The workspace's crew pool.
/crew-assignmentsGET POST PATCH DELETE Crew bookings on shooting days.
/time-entriesGET POST PATCH DELETE The crew's time entries.
/crew-contractsGET Crew contracts (read-only) — creation, sending and signing happen in the app.
/crew-documentsGET Crew documents (read-only) — filming permits, insurance, risk assessments.
/shoot-windowsGET POST PATCH DELETE A project's shoot windows (pre-planning without concrete shooting days).
/crew-holdsGET POST PATCH DELETE Crew holds for pre-planning (option/confirmed/declined).
/crew-absencesGET POST PATCH DELETE Crew absences/blocks (table crew_availability).
/crew-vacation-entitlementsGET POST PATCH DELETE The crew's vacation accounts (entitlement + carryover per year).
/crew-work-schedulesGET POST PATCH DELETE The crew's weekly work schedules (target minutes per weekday, valid from valid_from).
/crew-holiday-overridesGET POST PATCH DELETE The workspace's holiday overrides: is_workday=true turns a public holiday into a workday, is_workday=false makes a workday free.
/crew-qualificationsGET POST PATCH DELETE The crew's qualifications/certificates (driver's license, drone license, …).
/overtime-accountsGET POST PATCH DELETE The crew's overtime accounts (calculation thresholds, not legal interpretation).
/overtime-ledger-entriesGET Overtime movements (read-only) — maintained by time tracking; kind: overtime, compensation, manual_adjust.
/crew-members
The workspace's crew pool. kind/status/membership are managed by TillyGen; the portal token is never visible via the API.
GET /api/v1/crew-members
POST /api/v1/crew-members
GET /api/v1/crew-members/{id}
PATCH /api/v1/crew-members/{id}
DELETE /api/v1/crew-members/{id}
List parameters
Parameter Values statusactive | archived optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type display_namestring required
emailstring | null optional
phonestring | null optional
departmentstring | null optional
job_titlestring | null optional
daily_ratenumber | null optional
weekly_contract_hoursnumber | null optional
notestring | null optional
Update body (PATCH)
Field Type display_namestring optional
emailstring | null optional
phonestring | null optional
departmentstring | null optional
job_titlestring | null optional
daily_ratenumber | null optional
weekly_contract_hoursnumber | null optional
notestring | null optional
Response fields
idworkspace_iddisplay_nameemailphonedepartmentjob_titledaily_rateweekly_contract_hoursnotekindmembershipstatususer_idcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-members?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"display_name":"…"}' \
"https://app.tillygen.com/api/v1/crew-members"
/crew-assignments
Crew bookings on shooting days. project_id is derived server-side from the shooting day; daily_rate requires the key creator to have admin rights (otherwise the rate guard sets it to null).
GET /api/v1/crew-assignments
POST /api/v1/crew-assignments
GET /api/v1/crew-assignments/{id}
PATCH /api/v1/crew-assignments/{id}
DELETE /api/v1/crew-assignments/{id}
List parameters
Parameter Values schedule_idUUID optional
project_idUUID optional
crew_member_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type role_labelstring | null optional
departmentstring | null optional
daily_ratenumber | null optional
call_timestring | null optional
wrap_timestring | null optional
notestring | null optional
crew_member_iduuid required
schedule_iduuid required
Update body (PATCH)
Field Type role_labelstring | null optional
departmentstring | null optional
daily_ratenumber | null optional
call_timestring | null optional
wrap_timestring | null optional
notestring | null optional
Response fields
idworkspace_idproject_idschedule_idcrew_member_idrole_labeldepartmentdaily_ratecall_timewrap_timenotestatuspositioncreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-assignments?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"crew_member_id":"00000000-0000-0000-0000-000000000000","schedule_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-assignments"
/time-entries
The crew's time entries. ended_at=null means a running clock (at most one per crew member — conflicts respond with 409). work_date is the calendar day of the shift, not derived from UTC.
GET /api/v1/time-entries
POST /api/v1/time-entries
GET /api/v1/time-entries/{id}
PATCH /api/v1/time-entries/{id}
DELETE /api/v1/time-entries/{id}
List parameters
Parameter Values crew_member_idUUID optional
project_idUUID optional
schedule_idUUID optional
approval_statuspending | approved | rejected optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type work_datestring required
started_atdatetime required
ended_atdatetime | null optional
break_minutesinteger optional
notestring | null optional
external_labelstring | null optional
crew_member_iduuid required
project_iduuid | null optional
schedule_iduuid | null optional
source"manual" | "schedule" | "timer" optional
approval_status"pending" | "approved" optional
Update body (PATCH)
Field Type work_datestring optional
started_atdatetime optional
ended_atdatetime | null optional
break_minutesinteger optional
notestring | null optional
external_labelstring | null optional
Response fields
idcrew_member_idworkspace_idproject_idschedule_idwork_datestarted_atended_atbreak_minutesnoteexternal_labelsourceapproval_statusapproved_atcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/time-entries?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"work_date":"…","started_at":"2026-08-05T09:00:00+02:00","crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/time-entries"
/crew-contracts
Crew contracts (read-only) — creation, sending and signing happen in the app. content/variables are internal template structures and not part of the API; documents are attached as assets (document_asset_id/signed_document_asset_id).
GET /api/v1/crew-contracts
GET /api/v1/crew-contracts/{id}
List parameters
Parameter Values crew_member_idUUID optional
project_idUUID optional
kindfreelance | employment | buyout | nda optional
statusdraft | sent | signed | expired | void optional
updated_sinceISO 8601 optional
Response fields
idworkspace_idcrew_member_idproject_idkindtitlestatusfeebuyout_scopevalid_fromvalid_untilsent_atsigned_atdocument_asset_idsigned_document_asset_idnotecreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-contracts?limit=50"
/crew-documents
Crew documents (read-only) — filming permits, insurance, risk assessments. Uploads happen in the app; the file is attached as an asset (asset_id).
GET /api/v1/crew-documents
GET /api/v1/crew-documents/{id}
List parameters
Parameter Values crew_member_idUUID optional
project_idUUID optional
kindpermit | insurance | risk_assessment | misc optional
updated_sinceISO 8601 optional
Response fields
idworkspace_idcrew_member_idproject_idkindtitlenotevalid_untilasset_idcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-documents?limit=50"
/shoot-windows
A project's shoot windows (pre-planning without concrete shooting days). planned_days is a rough estimate; crew holds attach to the window via crew-holds.
GET /api/v1/shoot-windows
POST /api/v1/shoot-windows
GET /api/v1/shoot-windows/{id}
PATCH /api/v1/shoot-windows/{id}
DELETE /api/v1/shoot-windows/{id}
List parameters
Parameter Values project_idUUID optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type starts_onstring required
ends_onstring required
labelstring | null optional
notestring | null optional
planned_daysinteger | null optional
project_iduuid required
Update body (PATCH)
Field Type starts_onstring optional
ends_onstring optional
labelstring | null optional
notestring | null optional
planned_daysinteger | null optional
Response fields
idworkspace_idproject_idstarts_onends_onlabelnoteplanned_dayscreated_bycreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/shoot-windows?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"starts_on":"…","ends_on":"…","project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/shoot-windows"
/crew-holds
Crew holds for pre-planning (option/confirmed/declined). window_id optionally links a shoot window of the same project.
GET /api/v1/crew-holds
POST /api/v1/crew-holds
GET /api/v1/crew-holds/{id}
PATCH /api/v1/crew-holds/{id}
DELETE /api/v1/crew-holds/{id}
List parameters
Parameter Values project_idUUID optional
crew_member_idUUID optional
window_idUUID optional
statusoption | confirmed | declined optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type starts_onstring required
ends_onstring required
status"option" | "confirmed" | "declined" optional
role_labelstring | null optional
notestring | null optional
window_iduuid | null optional
project_iduuid required
crew_member_iduuid required
Update body (PATCH)
Field Type starts_onstring optional
ends_onstring optional
status"option" | "confirmed" | "declined" optional
role_labelstring | null optional
notestring | null optional
window_iduuid | null optional
Response fields
idworkspace_idproject_idwindow_idcrew_member_idstarts_onends_onstatusrole_labelnotecreated_bycreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-holds?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"starts_on":"…","ends_on":"…","project_id":"00000000-0000-0000-0000-000000000000","crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-holds"
/crew-absences
Crew absences/blocks (table crew_availability). API creates count as internal and approved (source=internal, approval_status=approved); the portal's request workflow runs exclusively in the app.
GET /api/v1/crew-absences
POST /api/v1/crew-absences
GET /api/v1/crew-absences/{id}
PATCH /api/v1/crew-absences/{id}
DELETE /api/v1/crew-absences/{id}
List parameters
Parameter Values crew_member_idUUID optional
kindblocked | tentative optional
categoryvacation | sick | unavailable | tentative | other | overtime_comp optional
approval_statuspending | approved | rejected optional
updated_sinceISO 8601 optional
Create body (POST)
Field Type starts_onstring required
ends_onstring required
starts_halfboolean optional
ends_halfboolean optional
kind"blocked" | "tentative" optional
category"vacation" | "sick" | "unavailable" | "tentative" | "other" | "overtime_comp" optional
reasonstring | null optional
crew_member_iduuid required
Update body (PATCH)
Field Type starts_onstring optional
ends_onstring optional
starts_halfboolean optional
ends_halfboolean optional
kind"blocked" | "tentative" optional
category"vacation" | "sick" | "unavailable" | "tentative" | "other" | "overtime_comp" optional
reasonstring | null optional
Response fields
idworkspace_idcrew_member_idstarts_onends_onstarts_halfends_halfkindcategoryreasonsourceapproval_statusrequested_bydecided_bydecided_atcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-absences?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"starts_on":"…","ends_on":"…","crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-absences"
/crew-vacation-entitlements
The crew's vacation accounts (entitlement + carryover per year). Exactly one account per crew member and year (conflicts respond with 409).
GET /api/v1/crew-vacation-entitlements
POST /api/v1/crew-vacation-entitlements
GET /api/v1/crew-vacation-entitlements/{id}
PATCH /api/v1/crew-vacation-entitlements/{id}
DELETE /api/v1/crew-vacation-entitlements/{id}
List parameters
Parameter Values crew_member_idUUID optional
Create body (POST)
Field Type yearinteger required
annual_daysnumber optional
carryover_daysnumber optional
notestring | null optional
crew_member_iduuid required
Update body (PATCH)
Field Type annual_daysnumber optional
carryover_daysnumber optional
notestring | null optional
Response fields
idworkspace_idcrew_member_idyearannual_dayscarryover_daysnotecreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-vacation-entitlements?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"year":0,"crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-vacation-entitlements"
/crew-work-schedules
The crew's weekly work schedules (target minutes per weekday, valid from valid_from). Exactly one schedule per crew member and date (conflicts respond with 409).
GET /api/v1/crew-work-schedules
POST /api/v1/crew-work-schedules
GET /api/v1/crew-work-schedules/{id}
PATCH /api/v1/crew-work-schedules/{id}
DELETE /api/v1/crew-work-schedules/{id}
List parameters
Parameter Values crew_member_idUUID optional
Create body (POST)
Field Type valid_fromstring required
mon_minutesinteger optional
tue_minutesinteger optional
wed_minutesinteger optional
thu_minutesinteger optional
fri_minutesinteger optional
sat_minutesinteger optional
sun_minutesinteger optional
notestring | null optional
crew_member_iduuid required
Update body (PATCH)
Field Type valid_fromstring optional
mon_minutesinteger optional
tue_minutesinteger optional
wed_minutesinteger optional
thu_minutesinteger optional
fri_minutesinteger optional
sat_minutesinteger optional
sun_minutesinteger optional
notestring | null optional
Response fields
idworkspace_idcrew_member_idvalid_frommon_minutestue_minuteswed_minutesthu_minutesfri_minutessat_minutessun_minutesnotecreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-work-schedules?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"valid_from":"…","crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-work-schedules"
/crew-holiday-overrides
The workspace's holiday overrides: is_workday=true turns a public holiday into a workday, is_workday=false makes a workday free. Exactly one override per date (conflicts respond with 409).
GET /api/v1/crew-holiday-overrides
POST /api/v1/crew-holiday-overrides
GET /api/v1/crew-holiday-overrides/{id}
PATCH /api/v1/crew-holiday-overrides/{id}
DELETE /api/v1/crew-holiday-overrides/{id}
Create body (POST)
Field Type holiday_datestring required
is_workdayboolean optional
labelstring | null optional
Update body (PATCH)
Field Type is_workdayboolean optional
labelstring | null optional
Response fields
idworkspace_idholiday_dateis_workdaylabelcreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-holiday-overrides?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"holiday_date":"…"}' \
"https://app.tillygen.com/api/v1/crew-holiday-overrides"
/crew-qualifications
The crew's qualifications/certificates (driver's license, drone license, …). document_asset_id is read-only — documents are uploaded in the app.
GET /api/v1/crew-qualifications
POST /api/v1/crew-qualifications
GET /api/v1/crew-qualifications/{id}
PATCH /api/v1/crew-qualifications/{id}
DELETE /api/v1/crew-qualifications/{id}
List parameters
Parameter Values crew_member_idUUID optional
Create body (POST)
Field Type labelstring required
issuerstring | null optional
valid_untilstring | null optional
notestring | null optional
crew_member_iduuid required
Update body (PATCH)
Field Type labelstring optional
issuerstring | null optional
valid_untilstring | null optional
notestring | null optional
Response fields
idworkspace_idcrew_member_idlabelissuervalid_untilnotedocument_asset_idcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/crew-qualifications?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"label":"…","crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/crew-qualifications"
/overtime-accounts
The crew's overtime accounts (calculation thresholds, not legal interpretation). Exactly one account per crew member (conflicts respond with 409); movements live read-only in overtime-ledger-entries.
GET /api/v1/overtime-accounts
POST /api/v1/overtime-accounts
GET /api/v1/overtime-accounts/{id}
PATCH /api/v1/overtime-accounts/{id}
DELETE /api/v1/overtime-accounts/{id}
List parameters
Parameter Values crew_member_idUUID optional
Create body (POST)
Field Type max_daily_minutesinteger optional
min_rest_minutesinteger optional
max_weekly_minutesinteger | null optional
max_monthly_minutesinteger | null optional
crew_member_iduuid required
Update body (PATCH)
Field Type max_daily_minutesinteger optional
min_rest_minutesinteger optional
max_weekly_minutesinteger | null optional
max_monthly_minutesinteger | null optional
Response fields
idworkspace_idcrew_member_idmax_daily_minutesmin_rest_minutesmax_weekly_minutesmax_monthly_minutescreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/overtime-accounts?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"crew_member_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/overtime-accounts"
/overtime-ledger-entries
Overtime movements (read-only) — maintained by time tracking; kind: overtime, compensation, manual_adjust. Listing requires ?account_id=.
GET /api/v1/overtime-ledger-entries
GET /api/v1/overtime-ledger-entries/{id}
List parameters
Parameter Values account_idParent (UUID) required
kindovertime | compensation | manual_adjust optional
Response fields
idaccount_idtime_entry_iddelta_minuteskindeffective_datecreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/overtime-ledger-entries?account_id=<uuid>"
Shooting days & call sheets
One schedule is one shooting day. Talents, locations and clients attach to the day via schedule_id, crew is booked through crew-assignments. Call sheets are generated from the day and track their recipients including RSVP status.
Ein Schedule ist ein Drehtag. Talents, Drehorte und Kunden hängen über schedule_id am Tag, Crew wird über crew-assignments gebucht. Callsheets werden aus dem Drehtag erzeugt und verfolgen ihre Empfänger inklusive RSVP-Status.
/schedules
A project's shooting days/schedules. The timezone is frozen from the project on create and read-only afterwards; call times are wall-clock times (HH:MM) in that zone.
GET /api/v1/schedules
POST /api/v1/schedules
GET /api/v1/schedules/{id}
PATCH /api/v1/schedules/{id}
DELETE /api/v1/schedules/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Create body (POST)
Field Type titlestring required
starts_atstring | null optional
notesstring | null optional
general_callstring | null optional
shooting_callstring | null optional
lunchstring | null optional
wrapstring | null optional
favoriteboolean | null optional
project_iduuid required
Update body (PATCH)
Field Type titlestring optional
starts_atstring | null optional
notesstring | null optional
general_callstring | null optional
shooting_callstring | null optional
lunchstring | null optional
wrapstring | null optional
favoriteboolean | null optional
Response fields
idproject_idtitlestarts_attimezonegeneral_callshooting_calllunchwrapnotesfavoritepositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/schedules?limit=50"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"title":"…","project_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/schedules"
/schedule-assignments
A shooting day's talent assignments (crew goes through crew-assignments). Exactly one assignment per shooting day and talent (conflicts respond with 409). Listing requires ?schedule_id=.
GET /api/v1/schedule-assignments
POST /api/v1/schedule-assignments
GET /api/v1/schedule-assignments/{id}
PATCH /api/v1/schedule-assignments/{id}
DELETE /api/v1/schedule-assignments/{id}
List parameters
Parameter Values schedule_idParent (UUID) required
Create body (POST)
Field Type role_labelstring | null optional
call_timestring | null optional
notestring | null optional
schedule_iduuid required
talent_iduuid required
Update body (PATCH)
Field Type role_labelstring | null optional
call_timestring | null optional
notestring | null optional
Response fields
idschedule_idassignee_typetalent_idrole_labelcall_timenotepositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/schedule-assignments?schedule_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"schedule_id":"00000000-0000-0000-0000-000000000000","talent_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/schedule-assignments"
/schedule-locations
A shooting day's locations (references to the locations pool). Listing requires ?schedule_id=.
GET /api/v1/schedule-locations
POST /api/v1/schedule-locations
GET /api/v1/schedule-locations/{id}
PATCH /api/v1/schedule-locations/{id}
DELETE /api/v1/schedule-locations/{id}
List parameters
Parameter Values schedule_idParent (UUID) required
Create body (POST)
Field Type schedule_iduuid required
location_iduuid required
notestring | null optional
Update body (PATCH)
Field Type notestring | null optional
Response fields
idschedule_idlocation_idnotepositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/schedule-locations?schedule_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"schedule_id":"00000000-0000-0000-0000-000000000000","location_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/schedule-locations"
/schedule-clients
A shooting day's clients/guests. client_id optionally references the clients pool; name is the display name on the call sheet. Listing requires ?schedule_id=.
GET /api/v1/schedule-clients
POST /api/v1/schedule-clients
GET /api/v1/schedule-clients/{id}
PATCH /api/v1/schedule-clients/{id}
DELETE /api/v1/schedule-clients/{id}
List parameters
Parameter Values schedule_idParent (UUID) required
Create body (POST)
Field Type namestring required
client_iduuid | null optional
role_labelstring | null optional
call_timestring | null optional
emailstring | null optional
phonestring | null optional
notestring | null optional
schedule_iduuid required
Update body (PATCH)
Field Type namestring optional
client_iduuid | null optional
role_labelstring | null optional
call_timestring | null optional
emailstring | null optional
phonestring | null optional
notestring | null optional
Response fields
idschedule_idclient_idnamerole_labelcall_timeemailphonenotepositioncreated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/schedule-clients?schedule_id=<uuid>"
Example: create
Copy curl -X POST -H "Authorization: Bearer tg_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"…","schedule_id":"00000000-0000-0000-0000-000000000000"}' \
"https://app.tillygen.com/api/v1/schedule-clients"
/callsheets
Call sheets (read-only). sections and published_snapshot are internal app structures with no stability guarantee; writing happens exclusively in the app. Listing requires ?schedule_id=.
GET /api/v1/callsheets
GET /api/v1/callsheets/{id}
List parameters
Parameter Values schedule_idParent (UUID) required
Response fields
idschedule_idstatussectionspublished_snapshotpublished_atcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/callsheets?schedule_id=<uuid>"
/callsheet-recipients
A call sheet's send and RSVP status (read-only). Sending and RSVP links run exclusively through the app; the rsvp_token is never visible via the API. Listing requires ?callsheet_id=.
GET /api/v1/callsheet-recipients
GET /api/v1/callsheet-recipients/{id}
List parameters
Parameter Values callsheet_idParent (UUID) required
rsvp_statuspending | accepted | declined optional
Response fields
idcallsheet_idemailnamersvp_statussent_atopened_atresponded_atcrew_assignment_idschedule_assignment_idcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/callsheet-recipients?callsheet_id=<uuid>"
Review
Everything the review player produces. Review assets live in nestable folders and carry versions; comments (with timecodes and drawing annotations), image selections and approval decisions attach to an asset or a specific version — all read-only, built for polling with created_since.
Alles, was der Review-Player produziert. Review-Assets liegen in verschachtelbaren Ordnern und tragen Versionen; Kommentare (mit Timecodes und Zeichnungs-Annotationen), Bild-Markierungen und Freigabe-Entscheidungen hängen am Asset oder an einer konkreten Version — alles read-only, gemacht fürs Polling mit created_since.
/review-assets
A project's review media (read-only). Uploads and versions run through the app (storage quota, transcoding).
GET /api/v1/review-assets
GET /api/v1/review-assets/{id}
List parameters
Parameter Values project_idProject (UUID) optional
folder_idUUID optional
updated_sinceISO 8601 optional
Response fields
idproject_idfolder_idnametypestatusoriginal_filenamefile_size_bytescurrent_version_idsort_ordercreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/review-assets?limit=50"
/review-image-selections
The reviewers' image selections (read-only) — selection flags, ratings and labels per review asset (Picdrop pattern). Workspace-wide without filters; ?updated_since= for polling.
GET /api/v1/review-image-selections
GET /api/v1/review-image-selections/{id}
List parameters
Parameter Values asset_idUUID optional
selectedtrue | false optional
created_sinceISO 8601 optional
updated_sinceISO 8601 optional
Response fields
idasset_idreviewer_idreviewer_emaillabelratingselectedcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/review-image-selections?limit=50"
/review-approvals
The reviewers' approval decisions (read-only): approved, changes_requested or rejected per asset/version. ?created_since= for polling for new decisions.
GET /api/v1/review-approvals
GET /api/v1/review-approvals/{id}
List parameters
Parameter Values project_idProject (UUID) optional
asset_idUUID optional
version_idUUID optional
decisionapproved | changes_requested | rejected optional
created_sinceISO 8601 optional
updated_sinceISO 8601 optional
Response fields
idproject_idasset_idversion_iddecisionnotereviewer_idreviewer_namereviewer_emailcreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/review-approvals?limit=50"
/review-folders
Folders of a project's review area (read-only, nestable). review-assets reference their folder via folder_id.
GET /api/v1/review-folders
GET /api/v1/review-folders/{id}
List parameters
Parameter Values project_idProject (UUID) optional
Response fields
idproject_idnameparent_folder_idsort_ordercreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/review-folders?limit=50"
/review-asset-versions
A review asset's versions (read-only) — resolution, duration, codecs, transcode status. Comments reference the version via version_id. Listing requires ?asset_id=.
GET /api/v1/review-asset-versions
GET /api/v1/review-asset-versions/{id}
List parameters
Parameter Values asset_idParent (UUID) required
Response fields
idasset_idversion_numbertypestatusformatwidthheightduration_secondsframe_rateaspect_ratiovideo_codecaudio_codeccolor_profileuploaded_bycreated_atupdated_at
Example: list
Copy curl -H "Authorization: Bearer tg_live_…" \
"https://app.tillygen.com/api/v1/review-asset-versions?asset_id=<uuid>"