account_info
ChatGPTGet information about the currently connected MotionHub account and authenticated user. Use this to verify which account the AI assistant is operating on.
account_list_users
ChatGPTList all users in the account with their roles and status. Requires owner or admin permission.
add_clip_to_script
ChatGPTOpens an interactive panel for attaching a MotionHub media clip to a scene in one of the user's scripts. The panel shows the clip header, its transcript, a script picker, and the scene list with "Add to scene" buttons, so the target script and scene are chosen by clicking rather than by typing identifiers. Use it once a specific clip has been identified and it is to be placed in a script. To attach only part of a clip, pass in and out (start and end in seconds); the panel pre-fills those values for the user to confirm or adjust. media_get_transcript returns the timed segments those values come from.
board_card_attach_file
ChatGPTAttach an existing project file to a card
board_card_attach_task
ChatGPTAttach a task to a card
board_card_create
ChatGPTCreate a new card in a board column
board_card_create_link
ChatGPTAdd a link to a card
board_card_delete
ChatGPTDelete a card and all its attachments
board_card_delete_link
ChatGPTRemove a link from a card
board_card_detach_file
ChatGPTRemove a file from a card
board_card_detach_task
ChatGPTRemove a task from a card
board_card_get
ChatGPTGet details of a specific card
board_card_list
ChatGPTList cards in a board, optionally filtered by column. Returns paginated results (default 100, max 500).
board_card_list_files
ChatGPTList files attached to a card
board_card_list_links
ChatGPTList links attached to a card
board_card_list_tasks
ChatGPTList tasks attached to a card
board_card_remove_image
ChatGPTRemove the image from a card
board_card_set_image
ChatGPTSet a card image from a URL. The image is downloaded, resized to 512px, and stored as base64.
board_card_set_image_from_article
ChatGPTFetch an article URL, extract the og:image or best available thumbnail, and set it as the card image. Prefer this over board_card_set_image whenever a source article URL is available — no image URL required, the server handles all extraction automatically.
board_card_update
ChatGPTUpdate a card. Set column_id to move the card to a different column.
board_column_create
ChatGPTAdd a new column to a board
board_column_delete
ChatGPTDelete a column. Must have no cards assigned and board must have at least 2 columns.
board_column_list
ChatGPTList columns in a board
board_column_update
ChatGPTUpdate a column name or colour
board_create
ChatGPTCreate a new kanban board in a project
board_delete
ChatGPTDelete a board and all its columns, cards, and attachments
board_get
ChatGPTGet a specific board with its details
board_list
ChatGPTList all kanban boards in a project
board_update
ChatGPTUpdate a board name or description
budget_account_create
ChatGPTCreate a new schedule/category in the budget. Optionally nests under an existing account via parent_id.
budget_account_list
ChatGPTList the schedule/category hierarchy for a budget (no line items). Use parent_id to reconstruct nested groupings; depth indicates nesting level. Returns paginated results (default 100, max 500).
budget_account_set_allocation
ChatGPTSet or clear a schedule's top-down allocation (cap) for one budget version. With allocation_amount, the version total uses this figure instead of the line rollup and lines cannot exceed it; pass null to clear (revert to bottom-up). Rejected if it would push the schedule above an allocated parent schedule's cap.
budget_account_update
ChatGPTUpdate a schedule/category code, name, or parent.
budget_actual_create
ChatGPTRecord a new actual (spend) against a budget line. Use this for spend that does NOT correspond to an existing PO (cards, payroll, ad-hoc invoices). For spend fulfilling an existing PO, budget_po_convert_to_actual is the corresponding tool: it tags the actual with source_po_id so the cost report offsets it against the PO's committed amount rather than double-counting. Defaults to posted status; pass status=draft to create as a draft for review. budget_line_id is required for posted actuals. VAT is computed server-side from vat_code_id: amount is the GROSS you pay the supplier, and net_amount / vat_amount are derived from it. Omit vat_code_id and the record defaults to NO_VAT (net = gross), which is what the cost report will then show — set a code when the invoice carried VAT. Side effect: when the account has a Xero organisation connected, a posted actual is queued for sync to that Xero organisation, and the project's Budget Admins get an in-app alert and an email asking them to review the push.
budget_actual_get
ChatGPTGet a single actual including attachments and tags.
budget_actual_list
ChatGPTList recorded actuals (spend) for a project budget. Pagination is server-side (page/per_page). Returns rows with totals. budget_actual_get returns a single actual with its attachments and tags.
budget_actual_post
ChatGPTPromote a draft actual to posted status. Idempotent — re-posting an already-posted actual is a no-op. Requires the draft to have description, gross_amount, occurred_at, and budget_line_id all set. Side effect: when the account has a Xero organisation connected, a posted actual is queued for sync to that Xero organisation, and the project's Budget Admins get an in-app alert and an email asking them to review the push.
budget_actual_update
ChatGPTUpdate an actual, including linking it to the PO it pays down via source_po_id. Posted actuals lock cost-shifting fields (gross_amount, currency, fx_rate, vat_code_id, budget_line_id, occurred_at) — only metadata (description, notes, invoice_ref, contact, location, shoot_day, department, source_po_id) can change after posting. Side effect: when the account has a Xero organisation connected, editing a posted actual re-queues it for Xero — a Budget Admin's edit to an actual already synced is pushed to Xero automatically; otherwise the project's Budget Admins get an in-app alert and an email asking them to review the push.
budget_cost_report
ChatGPTGet the cost-report summary for a budget version: budget vs committed (POs) vs actual vs EFC (Earned Final Cost) vs variance, broken down by schedule/account. Defaults to the budget's default version when version_id is omitted. All money figures are fringe-loaded on the same basis: budget_amount includes fringe on-costs, and committed_amount / actual_to_date / efc include fringe computed on realised spend, so a fully delivered line closes at zero variance. All figures are also NET of VAT: an actual stores a gross amount plus a derived net_amount, and the report sums the net so it is comparable with the budget, which has no tax component. Use committed_amount_excl_fringe / actual_to_date_excl_fringe to reconcile against a PO total or the NET of an invoice — not its gross face value — and realised_fringe_amount for the on-cost portion. A scoped Budget Contributor/Reader sees their granted schedules only. Returns paginated results (default 100, max 500).
budget_cost_report_pivot
ChatGPTGet an actuals-only pivot of recorded spend by shoot day, location, or department. Useful for "how much did we spend on day 4" / "total catering by location" questions. Figures are actuals at face value and EXCLUDE fringe on-costs — this pivot aggregates by dimension rather than by budget line, so per-line fringe rules do not apply. budget_cost_report carries the fringe-loaded figures. Returns paginated results (default 100, max 500).
budget_fringe_attach_account
ChatGPTAttach a fringe rule to a schedule/account so newly-created lines under it inherit the rule. Set apply_to_existing=true to also retro-apply to existing lines.
budget_fringe_attach_line
ChatGPTAttach a fringe rule directly to a single budget line for a specific version, with optional rate/threshold/cutoff overrides. Returns the application ID needed for later updates.
budget_fringe_rule_create
ChatGPTCreate a fringe rule template (e.g. NI, pension, holiday pay). A rule is applied to a schedule by budget_fringe_attach_account, or to a single line by budget_fringe_attach_line.
budget_fringe_rule_list
ChatGPTList fringe rule templates for a budget (NI, pension, holiday pay, etc). Each rule has a basis (percentage or flat), rate, and optional threshold/cutoff/validity window. Returns paginated results (default 100, max 500).
budget_get
ChatGPTGet the budget tree for a project: header, versions, schedules (accounts), fringes, tags and the account's VAT codes (vat_codes: id, code, name, rate — the vat_code_id values actuals and POs take), with per-schedule totals. Lines are NOT included by default — each schedule carries line_count and the response sets lines_omitted:true; pass include_lines:true for the full line detail. budget_line_list and budget_line_get return the same detail more cheaply. Totals always reflect every line regardless. Use this to understand the budget structure before drilling into specific lines or running cost reports. Three grand totals are returned per version: grand_totals is the bare line subtotal, effective_grand_totals substitutes any top-down allocation caps, and loaded_grand_totals adds fringe on-costs — use loaded_grand_totals to answer "what does this budget cost". All three exclude the per-version production fee (see versions[].production_fee_basis/value) and any schedule whose parent_id no longer resolves; a scoped Budget Contributor/Reader sees totals for their granted schedules only. Note: line version values can change between calls due to concurrent edits (web UI, other API clients, or server-side recalculation, e.g. dynamic percentage-basis lines). Check updated_by.source and updated_at against your own last write before attributing an unexpected value to a bug — if updated_at is later than your last write and source is not your own client, the value was changed elsewhere. total_source tells you how total was derived.
budget_line_create
ChatGPTCreate a new budget line under a schedule/account. Pass quantity, rate, and x_factor here whenever you know them — they seed every version cell in one round trip and the response echoes the seeded cells back under line_versions. Per-version variations, and later edits to those cells, belong to budget_line_version_update.
budget_line_get
ChatGPTGet a single budget line including its per-version cells (quantity, rate, x-factor, total override, currency, fx_rate, and the percentage-basis config when the line is computed). Note: line version values can change between calls due to concurrent edits (web UI, other API clients, or server-side recalculation, e.g. dynamic percentage-basis lines). Check updated_by.source and updated_at against your own last write before attributing an unexpected value to a bug — if updated_at is later than your last write and source is not your own client, the value was changed elsewhere. total_source tells you how total was derived: percentage, override, quantity_rate, or null for an empty cell.
budget_line_list
ChatGPTList budget lines for a project with optional filters. Filters compose with AND. Returns raw line metadata. budget_line_get additionally returns per-version cell data (qty/rate/total). Returns paginated results (default 100, max 500).
budget_line_tag_attach
ChatGPTAttach a tag to a budget line. Returns the line_tag association ID needed for budget_line_tag_detach.
budget_line_tag_detach
ChatGPTRemove a tag from a budget line by its line_tag association ID.
budget_line_update
ChatGPTUpdate a budget line's metadata (code, description, supplier, unit). Per-version numeric values belong to budget_line_version_update.
budget_line_version_update
ChatGPTUpdate the per-version cell data for a budget line: quantity, rate, multiplier, total override, currency. Rejected with a 409-equivalent error if the version is locked. currency_code and fx_rate must be set together. The response echoes the version state immediately after this write, including updated_by and total_source. If a later read shows a different value, check updated_by/updated_at on that read rather than assuming this call failed. To make the write conditional, pass if_unmodified_since with the updated_at you last read — the write is then rejected rather than overwriting a concurrent edit.
budget_po_convert_to_actual
ChatGPTConvert an approved/issued/closed purchase order into actual spend rows. This is the canonical way to record that a PO has been paid: it mints budget_actual rows tagged with source=po_conversion and source_po_id=<this PO>, so the cost report offsets them against the PO's committed amount instead of double-counting. Idempotent — rerunning skips already-converted lines. This is the path for spend fulfilling a specific PO; budget_actual_create covers spend with no PO behind it. Side effect: when the account has a Xero organisation connected, each new actual is queued for sync to that Xero organisation, and the project's Budget Admins get an in-app alert and an email asking them to review the push.
budget_po_create
ChatGPTCreate a new purchase order in draft state. PO number is auto-assigned per project; reference holds the supplier's own quote, contract or order reference, carried to Xero as the PO Reference if the PO is later approved and pushed (this tool itself does not contact Xero). Line items are added with budget_po_line_create, and budget_po_submit puts the PO forward for approval. Pass at least one of contact_id or company_id so the PO has a recipient.
budget_po_get
ChatGPTGet a single purchase order with all its line items.
budget_po_line_create
ChatGPTAdd a line item to a purchase order. budget_line_id binds the PO line to a specific budget line (drives committed-spend rollups in the cost report). quantity and rate must be provided — a PO line with rate=0 is rarely intentional.
budget_po_line_update
ChatGPTUpdate a purchase order line item.
budget_po_list
ChatGPTList purchase orders for a project budget. Filters compose with AND. Returns PO headers only. budget_po_get returns a single PO including its line items. Returns paginated results (default 100, max 500).
budget_po_submit
ChatGPTSubmit a draft purchase order for approval (transitions draft → pending_approval). The server then auto-promotes it to approved if EITHER the PO total is at or below the budget's PO approval threshold — note a blank/null threshold means no gate, so every PO auto-approves — OR the submitter is the only effective Budget Admin on the project, since approval would otherwise deadlock. Check the returned status rather than assuming pending_approval. Available to editors. Side effect: notifies the other people involved in the approval (the budget admins, or the PO's creator) with an in-app alert, and emails them unless they have turned that category off. When the account has a Xero organisation connected, a PO that becomes approved, issued or cancelled is queued for sync to Xero: pushed automatically if it was synced before, otherwise held for a Budget Admin to review.
budget_po_transition
ChatGPTMove a purchase order through its state machine: pending_approval → approved, approved → issued, issued → closed, or any → cancelled. Approving requires Budget Admin and cannot be done by the PO's creator; issuing and closing require Budget Admin; submitting, withdrawing and cancelling require PO write access on a PO you created. Side effect: notifies the other people involved in the approval (the budget admins, or the PO's creator) with an in-app alert, and emails them unless they have turned that category off. When the account has a Xero organisation connected, a PO that becomes approved, issued or cancelled is queued for sync to Xero: pushed automatically if it was synced before, otherwise held for a Budget Admin to review.
budget_po_update
ChatGPTUpdate a purchase order header (supplier, reference, dates, currency, notes). Number can only change while status is draft or pending_approval.
budget_tag_create
ChatGPTCreate a custom tag definition for the budget. Tags are attached to lines via budget_line_tag_attach.
budget_tag_list
ChatGPTList custom tag definitions for a budget (e.g. department, cost type, region). Tags are attached to lines via budget_line_tag_attach. Returns paginated results (default 100, max 500).
budget_update
ChatGPTUpdate the budget header fields: name, default currency, PO auto-approval threshold, or notes. Manager-tier — affects every editor on the project. Returns the updated budget tree.
budget_version_list
ChatGPTList budget versions (e.g. commission, working, estimate, cost report, final) with their lock state and currency. The default_version_id on each budget identifies which one the cost report uses by default. Returns paginated results (default 100, max 500).
budget_version_lock
ChatGPTLock a budget version so no further cell, fringe, or tag edits can happen against it. Idempotent — locking an already-locked version is a no-op. Manager-tier — locking ends in-flight edits for every editor working on this version, so coordinate before calling. Locked versions can still be renamed and reordered, but their numeric cells become read-only.
budget_version_unlock
ChatGPTUnlock a previously-locked budget version, allowing cell/fringe/tag edits again. Idempotent — unlocking an already-unlocked version is a no-op. Manager-tier — only use when the producer explicitly wants to revise a locked snapshot.
calendar_check_contact_conflicts
ChatGPTCheck if a contact has overlapping calendar events across all projects in a date range. Use this before assigning contacts to events or when changing event dates.
calendar_check_user_conflicts
ChatGPTCheck if a team member has overlapping calendar events across all projects in a date range. Use this before assigning users to events or when changing event dates.
calendar_event_assign_user
ChatGPTAssign a team member to a calendar event. IMPORTANT: Always use calendar_check_user_conflicts first to check for scheduling overlaps before assigning.
calendar_event_attach_task
ChatGPTLink a task to a calendar event
calendar_event_create
ChatGPTCreate a new calendar event in a project
calendar_event_delete
ChatGPTDelete one or more calendar events
calendar_event_detach_task
ChatGPTRemove a task from a calendar event
calendar_event_get
ChatGPTGet details of a specific calendar event including assigned users, contacts, and task count
calendar_event_list
ChatGPTList all calendar events in a project. Returns paginated results (default 100, max 500).
calendar_event_unassign_user
ChatGPTRemove a team member from a calendar event
calendar_event_update
ChatGPTUpdate an existing calendar event. If changing dates on an event with assigned users or contacts, use calendar_check_user_conflicts and calendar_check_contact_conflicts to check for scheduling overlaps.
calendar_group_create
ChatGPTCreate a new calendar group in a project
calendar_group_delete
ChatGPTDelete one or more calendar groups
calendar_group_list
ChatGPTList calendar groups in a project (groups contain rows which contain events)
calendar_group_update
ChatGPTUpdate a calendar group
calendar_row_create
ChatGPTCreate a new calendar row in a project
calendar_row_delete
ChatGPTDelete one or more calendar rows
calendar_row_list
ChatGPTList calendar rows in a project, optionally filtered by group
calendar_row_update
ChatGPTUpdate a calendar row
company_create
ChatGPTCreate a new company/client
company_get
ChatGPTGet details of a specific company
company_list
ChatGPTList all companies/clients in the account
company_update
ChatGPTUpdate a company. Requires account admin permission.
contact_create
ChatGPTCreate a new contact. Requires account admin permission.
contact_get
ChatGPTGet details of a specific contact including project associations
contact_list
ChatGPTList contacts in the account, optionally filtered by company. Returns paginated results (default 100, max 500).
contact_update
ChatGPTUpdate a contact
help_get_article
ChatGPTFull text of one MotionHub help centre article, addressed by its path (e.g. "/help/account/users"). Paths come from help_list_articles. Each article documents how a feature behaves in the MotionHub UI; the response includes the article url.
help_list_articles
ChatGPTCatalogue of MotionHub help centre articles — title, description, keywords and path for each, optionally filtered to one group. The articles document how MotionHub features work and how tasks are carried out in the UI. Returns the article paths that help_get_article takes.
media_add_tags
ChatGPTAdd tags to a media item
media_get
ChatGPTGet detailed information about a specific media item including Azure AI analysis results (keywords, topics, labels, detected objects, people, locations, brands)
media_get_transcript
ChatGPTGet the transcript for a video or audio media item. Only available for media processed by Azure Video Indexer (azure_status: completed).
media_list
ChatGPTList media items in a project with optional search and type filtering. Returns paginated results (default 100, max 500).
media_remove_tags
ChatGPTRemove tags from a media item
media_semantic_search
ChatGPTSearch media using natural language. Finds semantically similar content even when exact keywords don't match. Example: "clips of people discussing safety concerns" will match media about risk assessments, health and safety, etc.
media_update_description
ChatGPTUpdate the description of a media item
programme_create
ChatGPTCreate a new programme. Requires account admin permission.
programme_get
ChatGPTGet details of a specific programme
programme_list
ChatGPTList all programmes in the account
programme_update
ChatGPTUpdate a programme. Requires account admin permission.
project_assign_contact
ChatGPTAssociate an existing contact with a project
project_assign_user
ChatGPTAdd an existing account user to a project with a specific role. Requires admin permission on the project.
project_create
ChatGPTCreate a new project. Requires account admin permission. Auto-assigns users flagged with add_to_future_projects.
project_list
ChatGPTList all projects the authenticated user has access to
project_list_members
ChatGPTList members of a project for task assignment
project_remove_contact
ChatGPTRemove a contact from a project
project_remove_user
ChatGPTRemove a user from a project. Requires manager permission on the project.
project_update
ChatGPTUpdate a project. Can update name, description, owner, delivery date, reference, and production contact details.
project_update_status
ChatGPTUpdate a project status or stage. Status values: development, in production, archived.
project_update_user_role
ChatGPTChange a user's role on a project. Requires admin permission on the project.
rusheslog_get
ChatGPTGet a specific rushes log with its media entries
rusheslog_list
ChatGPTList all rushes logs in a project
script_create
ChatGPTCreate a new script in a project. Types: "filming" (production script) or "edit" (editing script)
script_delete
ChatGPTDelete one or more scripts
script_get
ChatGPTGet a specific script with its scenes and content
script_list
ChatGPTList all scripts in a project
script_scene_add_title
ChatGPTAdd a title card (full-screen text) to a script scene. Shows the text for a fixed duration in the consolidated MP4 export — no media file needed. Useful for an intro title or labelling each actor in an audition reel. By default the card is appended to the end of the scene; pass position to insert it at a specific spot (e.g. position 0 to make it the first element, ahead of existing clips).
script_scene_associate_media
ChatGPTLink a media item to a script scene with optional in/out timecode points. Automatically extracts the transcript for the specified range from Azure insights.
script_scene_create
ChatGPTAdd a new empty scene to a script
script_scene_delete
ChatGPTRemove a scene from a script
script_scene_remove_media
ChatGPTRemove a media association from a script scene
script_scene_reorder
ChatGPTReorder scenes in a script by providing scene IDs in the desired order
script_scene_update
ChatGPTUpdate the visual or audio content of a scene. Content uses basic HTML with <p>, <strong>, <em> tags. IMPORTANT: All spoken dialogue MUST be enclosed in double quotes for accurate Running Time calculation. Example audio: <p><strong>V/O:</strong> "Welcome to the show."</p><p><strong>PRESENTER:</strong> "Today we explore the city."</p>
script_scene_update_media
ChatGPTUpdate the in/out timecode points for a media association in a scene. Recalculates the transcript for the new range.
script_scene_update_title
ChatGPTEdit a title card's text and/or duration, found by its media_assoc_id (from script_get). Provide text, duration, or both.
script_update
ChatGPTUpdate a script name, type, or description
task_create
ChatGPTCreate a new task in a project
task_delete
ChatGPTDelete one or more tasks
task_get
ChatGPTGet details of a specific task
task_list
ChatGPTList tasks for a project or across all projects. Returns paginated results (default 100, max 500). Note: status filter only applies when project_id is provided. Cross-project queries exclude completed tasks.
task_update
ChatGPTUpdate an existing task