{"name":"Final Frame","description":"Content platform: deals, titles, deliverables, QC, work orders, rights and availability, with an append-only audit trail.","url":"https://qa.app.final-frame.com","documentationUrl":"https://qa.app.final-frame.com/docs","version":"1.0.0","provider":{"organization":"Final Frame Ltd","url":"https://final-frame.com"},"capabilities":{"streaming":true,"pushNotifications":false,"stateTransitionHistory":true},"authentication":{"schemes":["bearer"],"credentials":"An API key from Organisation settings, Integrations, sent as Authorization: Bearer <key>. OAuth: pending."},"webhooks":{"events":["asset.received","qc.passed","qc.failed","deliverable.status_changed","deliverable.qc_waived","handoff.accepted","buyback.answered","workorder.created","rights.holding_recorded","rights.pencil_changed","deal.closed","deal.reopened","delivery.completed","delivery.failed","process.completed","process.failed","agent.proposal_created","agent.proposal_decided","sandbox.reset","approval.approved","approval.revoked","approval.reset","approval.change_requested","approval.change_resolved"],"signing":"Standard Webhooks","documentation":"https://qa.app.final-frame.com/docs/webhooks"},"versioning":{"policy":"https://qa.app.final-frame.com/docs/versioning","changelog":"https://qa.app.final-frame.com/docs/changelog","current":"/v1","summary":"Additive changes only within /v1; breaking changes go to /v2 with at least 6 months of notice (2 weeks in the Sandbox). Deprecated endpoints and fields answer with Deprecation, Sunset and Link headers."},"sandbox":{"documentation":"https://qa.app.final-frame.com/docs/sandbox","abilities":"Build against fictional data with the whole product, and register up to 5 webhooks of your own (webhook.manage), each hearing only your key’s events. No keys, buckets, people or settings."},"interfaces":{"openapi":"https://qa.app.final-frame.com/api/v1/openapi.json","status":"https://qa.app.final-frame.com/api/status.json","mcp":{"url":"https://qa.app.final-frame.com/api/mcp","transport":"streamable-http","protectedResourceMetadata":"https://qa.app.final-frame.com/.well-known/oauth-protected-resource"},"llms":"https://qa.app.final-frame.com/llms.txt"},"skills":[{"id":"projects","name":"Projects","description":"Find, read, create and change projects, their titles, placeholders, work orders and close-outs."},{"id":"rights","name":"Rights","description":"Read what an organisation holds and has licensed, record and revoke holdings and restrictions, check whether a right is available in a territory over a window, and export availability as EMA Avails."},{"id":"specs","name":"Delivery specs","description":"Read, create and change the organisation’s delivery specs, and copy the industry’s into the library."},{"id":"govern","name":"Govern and provision","description":"Mint and revoke API keys, invite people and change their roles, shape the group tree, read the organisation’s action log, and approve or decline agent writes."},{"id":"work","name":"Work orders","description":"Raise work orders idempotently where demand exceeds supply."},{"id":"operations","name":"Monitor and recover","description":"Watch the processing log, retry or stop a run, read metered usage, rotate and test webhook secrets, and archive, restore or delete a project."}],"capabilityMatrix":[{"lifecycle":"Discover","api":"GET /v1/me, GET /v1/reference/rights, GET /v1/openapi.json","cli":"ff whoami, ff reference rights","mcp":"whoami, rights_vocabulary; resources finalframe://docs/llms.txt, finalframe://openapi, finalframe://errors (every error code, what it means, what to do next, whether a retry can work) and finalframe://capabilities (this matrix); prompts deliver-a-deal, prepare-content (a Content Preparation project: no memo, counterparty or licence), check-and-export-avails and configure-organisation-as-code, each a step list naming the tools"},{"lifecycle":"Provision","api":"GET and PUT /v1/config and POST /v1/config/plan: the whole set-up as one document (delivery specs, formats, metadata schema, taxonomies, webhooks, groups, members invited by the same path, agent approvals and trusted keys by name, storage connections with credentials by reference), planned item by item, applied idempotently in one audited operation, deleting only in the sections prune names; GET /v1/config/schema; GET and POST /v1/keys (the value shown once, permissions never beyond the caller’s); GET /v1/roles; GET and POST /v1/invitations (adds the person, sends the link); GET /v1/members, PATCH /v1/members/{id} (role, scope); GET and POST /v1/groups, PATCH /v1/groups/{id}; people and teams (0425): PATCH /v1/people/{userId} (profile, country, working pattern), POST /v1/teams, PATCH /v1/teams/{id}, PUT /v1/teams/{id}/members/{userId} (a lead or a member, from any Group; a team grants nothing)","cli":"ff config export, ff config plan, ff config apply --prune, ff keys create, ff roles, ff members invite, ff members update, ff groups create, ff groups update","mcp":"create_key, list_roles, invite_member, update_member, list_groups, create_group, update_group, update_person, create_team, update_team, set_team_member"},{"lifecycle":"Operate","api":"GET /v1/projects, titles, deliverables, downloads; POST and PATCH projects, titles (add, identifiers, bulk edit) and placeholders; POST work orders; deal approvals: GET /v1/projects/{id}/approvals, POST /v1/projects/{id}/approvals/{stage}/approve, POST /v1/projects/{id}/approvals/change-requests and /change-requests/{id}/answer; the Image Studio: GET /v1/projects/{id}/deliverables/{id}/image-studio, POST .../images (a take) and .../images/commit; break markers: GET and PUT /v1/projects/{id}/deliverables/{id}/break-markers, POST .../reading, GET .../export, POST .../sets, PATCH and DELETE .../sets/{id}, POST .../commit; Graphics Studio templates: GET and POST /v1/studio/templates, GET and PATCH /v1/studio/templates/{id}, POST .../duplicate and .../archive, POST /v1/studio/canvases/from-template, GET and POST /v1/studio/canvases/{id}/outputs/{id}/placeholders and .../file; Graphics Studio canvases: GET /v1/studio/models, GET and POST /v1/studio/canvases, GET and PATCH /v1/studio/canvases/{id}, POST .../duplicate, .../archive and .../estimate, GET and POST .../runs, POST .../runs/stop, POST .../outputs/{id}/to-title; Commit export of a promo: POST /v1/projects/{id}/deliverables/{id}/promo/export, its settings over the placeholder’s spec; making files over MCP, each priced before it runs (make_right_file, extract_stem, run_check, plan_files_for_title, make_files_for_title); every write with an Idempotency-Key","cli":"ff projects, ff project, ff titles, ff title, ff deliverables, ff download, ff work-orders, ff work-order create","mcp":"find_projects, read_project, create_project, update_project, list_titles, read_title, add_title, update_title, bulk_edit_titles, list_deliverables, read_deliverable, read_deliverable_data, add_deliverable, create_deliverables_from_spec, update_deliverable, set_deliverable_status, write_title_metadata, read_qc_catalogue, waive_qc, read_image_studio, make_image, commit_image, read_break_markers, read_break_points, save_break_markers, export_break_markers, create_break_marker_set, rename_break_marker_set, delete_break_marker_set, commit_break_markers, list_studio_templates, read_studio_template, save_studio_template, update_studio_template, duplicate_studio_template, archive_studio_template, new_canvas_from_template, file_studio_output, list_canvases, read_canvas, list_studio_models, wire_options, estimate_canvas_run, read_canvas_runs, read_brief_defaults, list_studio_titles, read_studio_title, studio_template_options, list_studio_assets, create_canvas, duplicate_canvas, rename_canvas, archive_canvas, save_canvas, add_node, remove_node, move_node, configure_node, add_group, rename_group, move_group, resize_group, remove_group, connect_nodes, disconnect_nodes, run_canvas, stop_canvas_runs, send_output_to_title, commit_promo_export, make_right_file, extract_stem, run_check, plan_files_for_title, make_files_for_title, list_work_orders, create_work_order, read_deal_approvals, approve_deal_stage, request_deal_change, answer_deal_change"},{"lifecycle":"Monitor","api":"GET /v1/processes (status, kind, project, subject) and /v1/processes/{id}, the run every async write names in its Location; GET /v1/usage (metered figures for any period up to 92 days); GET /v1/projects/{id}/audit, close-out, costs (estimated, committed and actual); webhooks for asset, QC, status, handoff, buyback, delivery, deal, approval and process events (process.completed and process.failed when any run ends, with its status and retry links), with each endpoint’s delivery log; /status.json and /status.rss (platform state, 90 days of incidents)","cli":"ff audit, ff processes list, ff processes show, ff usage, ff webhooks list, ff webhooks deliveries","mcp":"read_audit, list_processes, read_process, read_usage, read_closeout, read_costs"},{"lifecycle":"Recover","api":"POST /v1/processes/{id}/retry (202, Location at the new run) and /stop; POST /v1/webhooks/{id}/test, /rotate-secret and deliveries/{id}/redeliver; POST /v1/projects/{id}/restore","cli":"ff processes retry, ff processes stop, ff webhooks test, ff webhooks rotate, ff project restore","mcp":"retry_process, stop_process, test_webhook, rotate_webhook_secret, restore_project"},{"lifecycle":"Rights","api":"GET /v1/rights/works, /v1/rights/works/{identity} (a season is {identity}#s2, an episode #s2e3), /v1/rights/works/{identity}/children, /v1/rights/availability, /v1/rights/map, /v1/rights/works/{identity}/windows and /release, /v1/titles/{titleId}/air-dates (air dates by channel; PATCH and DELETE /v1/air-dates/{id}, POST /v1/air-dates/import for a CSV; GET and POST /v1/air-dates/{id}/launch, an air date’s launch project), GET /v1/titles (Current and Past: view, status, search and sort; whether “move to Past?” is offered) and GET and PUT /v1/titles/{titleId}/status (Active, Wrapped, Cancelled, Ended, set by a person), GET /v1/projects/{id}/companions and PATCH .../deliverables/{deliverableId}/companion (an episode’s recaps beside it in the Screening Room, and a promo’s own fields), GET and PUT /v1/screening/companions and /v1/projects/{id}/screening/companions (the companion rules), /v1/rights/avails/ema (EMA Avails 1.7.3 workbook), /v1/rights/search (what can I sell), /v1/rights/pencils; POST /v1/rights/holdings and /v1/rights/restrictions, and /revoke on either; POST /v1/rights/pencils, and /extend, /release, /convert on one","cli":"ff works, ff work, ff check","mcp":"list_rights_works, read_work_rights, list_rights_children, check_availability, rights_map, search_avails, list_pencils, pencil_right, extend_pencil, release_pencil, convert_pencil, record_rights_holding, revoke_rights_holding, record_rights_restriction, revoke_rights_restriction, list_org_titles, read_title_status, set_title_status, read_air_date_launch, start_launch_project, list_episode_companions, set_promo_companion, read_companion_rules, set_companion_rules"},{"lifecycle":"Brand portal","api":"Grouping titles: GET /v1/titles/{titleId}/groupings and /rollup (cast, ratings and releases across its titles), POST /v1/title-memberships, DELETE /v1/title-memberships/{id}, PUT /v1/titles/{titleId}/members/order; brands and their looks: GET and POST /v1/brands, GET, PATCH and DELETE /v1/brands/{id}, GET and PUT /v1/brand and /v1/groups/{groupId}/brand, POST /v1/brands/logo-upload for a PNG logo; a title’s own placeholders: GET and POST /v1/titles/{titleId}/placeholders; template sets: GET and POST /v1/template-sets, GET, PATCH and DELETE /v1/template-sets/{id}, its /items and /rules (PUT and DELETE /v1/template-items/{id} and /v1/template-rules/{id}), POST /v1/template-sets/preview, /count (writes nothing) and /run (with the count as expectPlaceholders), and one set on one title: POST /v1/titles/{titleId}/template-sets/{setId}/count and /apply; a title’s seasons: GET /v1/titles/{titleId}/seasons, POST /v1/titles/{titleId}/seasons/count and /start (Start season N), GET and PUT /v1/seasons/carry-over; a brand’s guide: GET /v1/brand-portal/guides/{brandId} (its look, key art from its titles, its elements in order with their examples and Download) and PUT /v1/brand-portal/guides/{brandId}/elements/{element}; a title’s element slots: GET /v1/titles/{titleId}/element-slots, POST /v1/titles/{titleId}/element-slots/upload (a signed PUT), /replace (the old file kept as a version) and /{slotId}/reset (emptied, its files kept); art added on a title’s page: POST /v1/brand-portal/titles/{titleId}/art/upload (a signed PUT; JPEG, PNG, PSD, PSB, TIFF, AI or EPS, kept whole) and /art (filed in the title’s Library and put on the page, one row, a preview from what the file holds); review chains: GET and POST /v1/review-chains, PUT and DELETE /v1/review-chains/{id}; reviews: GET /v1/reviews (waiting on the caller), /v1/reviews/{id}, /v1/assets/{id}/review, POST /v1/reviews/{id}/decision (a person, with review.decide); usage rights: GET, PUT and DELETE /v1/assets/{id}/rights, GET /v1/assets/{id}/rights/check?territory=, GET /v1/rights/assets (every asset or family with rights, filtered and sorted, or expiring in 30 days); families: /v1/asset-families and its /members and /rights; GET /v1/projects/{id}/fulfilment; the portal: GET /v1/brand-portal, /pages/{kind}/{id}, its /draft (as an audience will see it once its drafts are published) and /audience (who publishing reaches), POST /pages/{kind}/{id}/publish (its drafts), /search, /items/{id}/download (rights checked, as in the app), POST /items, PATCH and DELETE /items/{id}, PUT /pages/{kind}/{id}/guidelines, requests, guests, share links (the url once, an optional email gate; one link with GET, PATCH and its /activity, its people with POST /people and DELETE /people/{personId}) and the portal’s settings, link defaults and auto-publish (GET and PUT /settings) and /report, /report/export (CSV)","cli":"ff call","mcp":"find_brand_kit, list_title_placeholders, count_template_run, run_template_sets, list_reviews, decide_review_step, check_asset_rights, list_rights_assets, list_share_links, read_share_link, change_share_link, add_share_link_person, remove_share_link_person, revoke_share_link, preview_brand_page, read_portal_audience, publish_brand_page, read_portal_settings, set_portal_auto_publish, list_title_seasons, count_season_start, start_season, read_season_carry_over, set_season_carry_over, list_element_slots, start_element_slot_upload, replace_element_slot, reset_element_slot, read_brand_guide, set_brand_guide_element, get_portal_download_link, start_portal_art_upload, add_portal_art"},{"lifecycle":"Specs","api":"GET and POST /v1/delivery-specs, PATCH /v1/delivery-specs/{id}; GET /v1/industry-specs and POST /v1/industry-specs/{id}/duplicate","cli":"ff config export, ff config plan, ff config apply","mcp":"list_delivery_specs, create_delivery_spec, update_delivery_spec, duplicate_industry_spec"},{"lifecycle":"Storage","api":"GET /v1/cloud/connections and their objects; POST /v1/cloud/imports (an object onto a placeholder); GET /v1/bin, POST /v1/bin/uploads, GET /v1/bin/download; POST /v1/projects/{id}/deliverables/{id}/attach from the bin or another placeholder; POST /v1/projects/{id}/storage-deliveries (files out to a connected bucket, with a receipt), its /preview, GET it and its /receipt; POST /v1/projects/{id}/imports/from-link (the files at a share link: Aspera on Cloud, MASV, WeTransfer, Dropbox, Google Drive, Box, OneDrive, SharePoint, Frame.io; `password` for a share with one; `placeholder` and `path` for one file onto one placeholder), its /preview, GET /v1/projects/{id}/imports/from-link/{importId}; connections as code in /v1/config, credentials by reference to a connection that holds one","cli":"ff call, ff config apply, ff import-link","mcp":"start_upload, upload_part_urls, complete_upload, get_download_link, list_storage_destinations, start_storage_delivery, read_storage_delivery, import_from_link, file_onto_placeholder"},{"lifecycle":"Govern","api":"Permissions on every key, never beyond its minter’s; GET /v1/keys, GET /v1/members; GET /v1/audit (the organisation’s action log, by time, person, key and action) and GET /v1/projects/{id}/audit; GET and PUT /v1/settings/agent-approvals, GET /v1/proposals, POST /v1/proposals/{id}/approve and /decline (never by the proposing credential), PUT /v1/keys/{id}/trusted; the approvals setting, trusted keys, members and groups held as code in /v1/config, with POST /v1/config/plan for review before apply and a config.apply audit row per apply; GET /v1/people and /v1/people/{userId} (status, role, every membership said in words, teams, open work), GET /v1/teams and /v1/teams/{id} (members and lead, what routes to it, its open work); GET /v1/workload (the work across every project by team or person: open, due this week, overdue, done, on track or behind, the trend week on week, types of work, where load is uneven); capacity: GET /v1/holidays and PUT and DELETE /v1/holidays/{country}/{day} (the public holiday calendars of the organisation’s countries, with its own days), GET and POST /v1/people/{userId}/time-off, PATCH and DELETE /v1/people/{userId}/time-off/{id}, PUT /v1/work-orders/{id}/estimate and /v1/template-items/{itemId}/estimate (hours), GET /v1/workload/capacity (hours against estimated load by week, by team or person)","cli":"ff keys list, ff members list, ff config plan, ff audit, ff proposals list, ff proposals approve, ff proposals decline","mcp":"list_keys, list_members, read_audit, list_proposals, decide_proposal, check_proposal; every tool refuses outside its scope, list_people, read_person, list_teams, read_team, read_workload, list_holidays, set_holiday, remove_holiday, list_time_off, add_time_off, change_time_off, remove_time_off, set_work_order_estimate, set_template_item_estimate, read_capacity"},{"lifecycle":"Deprovision","api":"DELETE /v1/keys/{id}, /v1/members/{id}, /v1/invitations/{id}, /v1/groups/{id}; POST /v1/members/{id}/reset-sign-in for a lost device; Revoke a key in a click or by API; personal keys die with the membership; POST /v1/projects/{id}/archive and DELETE /v1/projects/{id} (files purged by the worker, recoverable for 30 days; a shared deal is refused); DELETE /v1/webhooks/{id}; POST /v1/people/{userId}/deactivate (their open work and review steps to a team or a person, access and sessions ended, the trail kept), DELETE /v1/teams/{id} and /v1/teams/{id}/members/{userId}","cli":"ff members remove, ff groups delete, ff keys revoke, ff project archive, ff project delete","mcp":"revoke_key, remove_member, reset_member_sign_in, delete_group, archive_project, delete_project, deactivate_person, delete_team, remove_team_member"}]}