# Frame.io API Documentation # Frame.io Developer > Power custom workflows and automations with Frame.io's V4-compatible REST API

Frame.io Developer

Power custom workflows and automations

Learn what's new in the V4 platform and start building with Frame.io Try endpoints in the API playground with interactive snippets. Step-by-step guide to migrate from legacy V2 API to the new V4 platform. Easily integrate with Frame.io via our Python & Typescript SDKs.

Need Help?

If you need additional support beyond what's covered in these documents, please reach out to the Frame.io Support Team for assistance by chatting with us on our Support Site.

# List account user roles GET https://api.frame.io/v4/accounts/{account_id}/users List user roles for a given account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/account-permissions/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/users: get: operationId: index summary: List account user roles description: >- List user roles for a given account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_accountPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include_deactivated in: query description: >- Supports including deactivated users in the response. Default is false. required: false schema: type: boolean - name: sort in: query description: Sort account users by query params required: false schema: $ref: '#/components/schemas/V4AccountsAccountIdUsersGetParametersSort' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AccountUserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdUsersGetParametersSort: type: string enum: - role_asc - role_desc - name_asc - name_desc - email_asc - email_desc description: Sort by query parameter for account users title: V4AccountsAccountIdUsersGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount AccountUserRoleRole: type: string enum: - member - owner - admin - reviewer description: Account User Role title: AccountUserRoleRole User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User AccountUserRole: type: object properties: role: oneOf: - $ref: '#/components/schemas/AccountUserRoleRole' - type: 'null' description: Account User Role user: $ref: '#/components/schemas/User' required: - role - user description: Frame.io Account User Role title: AccountUserRole Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links AccountUserRolesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/AccountUserRole' description: Account User Roles links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io Account user role details title: AccountUserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.accountPermissions.index("ef94cbba-1268-4df5-84eb-732989b839fc", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.account_permissions.index( account_id="ef94cbba-1268-4df5-84eb-732989b839fc", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/ef94cbba-1268-4df5-84eb-732989b839fc/users")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List accounts GET https://api.frame.io/v4/accounts List accounts for the current user.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/accounts/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts: get: operationId: index summary: List accounts description: >- List accounts for the current user.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_accounts parameters: - name: sort in: query description: Sort accounts by query params required: false schema: $ref: '#/components/schemas/V4AccountsGetParametersSort' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AccountsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: V4AccountsGetParametersSort: type: string enum: - display_name_asc - created_at_asc - display_name_desc - created_at_desc description: Sort by query parameter for accounts title: V4AccountsGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount AccountRolesItems: type: string enum: - admin - member - owner title: AccountRolesItems Account: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe IMS Organization ID associated with the account, when available. created_at: type: string format: date-time description: Created Timestamp display_name: type: string description: Account Name id: type: string format: uuid description: Account ID image: type: - string - 'null' description: The account image url roles: type: array items: $ref: '#/components/schemas/AccountRolesItems' description: Account User Roles storage_limit: type: - integer - 'null' description: >- The number of bytes of non-archived storage in the account. Value is nil when there is no limit storage_usage: type: integer description: The number of bytes of non-archived storage the account is using updated_at: type: string format: date-time description: Update timestamp v4_migrated_at: type: - string - 'null' format: date-time description: Migration timestamp required: - created_at - display_name - id - roles - storage_limit - storage_usage - updated_at description: Account details title: Account Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links AccountsResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/Account' description: Accounts links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: AccountsResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.accounts.index({}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.accounts.index() ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List audit logs GET https://api.frame.io/v4/accounts/{account_id}/audit_logs List audit logs with filtering capabilities via query params.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/accounts/auditlog-index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/audit_logs: get: operationId: auditlog-index summary: List audit logs description: >- List audit logs with filtering capabilities via query params.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_accounts parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdAuditLogsGetParametersInclude - name: filters in: query description: '' required: false schema: $ref: '#/components/schemas/Filters' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: api-version in: header description: '' required: true schema: $ref: >- #/components/schemas/V4AccountsAccountIdAuditLogsGetParametersApiVersion responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AuditLogsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdAuditLogsGetParametersInclude: type: string enum: - user description: Include query parameter for audit logs title: V4AccountsAccountIdAuditLogsGetParametersInclude FiltersEventType: type: string enum: - access_request_approved - access_request_denied - access_request_submitted - account_aup_migration_created - account_aup_migration_deleted - account_aup_migration_downgrade_completed - account_aup_migration_downgrade_failed - account_aup_migration_downgrade_requested - account_aup_migration_product_migrated - account_aup_migration_started - account_aup_migration_updated - account_aup_user_migration_completed - account_aup_user_migration_created - account_aup_user_migration_deleted - account_aup_user_migration_failed - account_aup_user_migration_on_hold - account_aup_user_migration_started - account_aup_user_migration_unheld - account_aup_user_migration_updated - account_delinquent - account_field_created - account_field_deleted - account_field_updated - account_fio_version_migrated - account_locked - account_member_created - account_member_deleted - account_member_updated - account_mfa_enforced - account_ownership_transferred - account_permissions_granted_to_user - account_restored - account_updated - account_user_deleted - account_user_group_created - account_user_group_deleted - account_user_group_members_added - account_user_group_members_removed - account_user_group_updated - account_user_updated - action_created - action_deleted - action_updated - admin_update_to_v4 - allowed_domain_created - allowed_domain_deleted - anonymous_user_created - asset_assignee_changed - asset_copied - asset_created - asset_deleted - asset_metadata_created - asset_moved - asset_restored - asset_status_changed - asset_updated - asset_versioned - assets_unversioned - bulk_account_deletion_started - bulk_assets_deleted - bulk_assets_restored - bulk_assets_retranscoded - bulk_emails_updated - bulk_projects_activated - bulk_projects_deactivated - bulk_projects_mounted_storage_status_updated - bulk_users_removed - collaborator_added - collaborator_deleted - collection_updated - comment_completed - comment_created - comment_deleted - comment_liked - comment_uncompleted - comment_updated - controlled_domain_created - controlled_domain_updated - email_address_change_failure - email_address_changed - email_change_confirmation_requested - email_confirmed - file_uploaded - google_auth_disabled - google_auth_enabled - high_risk_sign_up - join_presentation_request_approved - join_project_request_approved - join_request_accepted - join_request_created - join_request_declined - join_request_deleted - join_request_reset - join_review_link_request_approved - join_team_request_approved - label_updated - login_factor_created - login_factor_validated - media_created - media_deleted - metadata_value_updated - new_device_login - new_user_email_confirmation_requested - oauth_app_created - oauth_app_deleted - oauth_app_disabled - oauth_app_enabled - oauth_app_updated - password_changed - password_reset_requested - pending_account_member_created - pending_account_member_deleted - pending_collaborator_created - pending_collaborator_deleted - pending_reviewer_created - pending_reviewer_deleted - pending_team_member_created - pending_team_member_deleted - plan_created - plan_deleted - plan_updated - preference_updated - presentation_created - presentation_deleted - presentation_updated - project_activated - project_archive_completed - project_archived - project_created - project_deactivated - project_deleted - project_field_created - project_field_deleted - project_field_updated - project_invite_link_created - project_invite_link_revoked - project_moved - project_permissions_granted_to_account_user_group - project_permissions_granted_to_user - project_restored - project_unarchive_completed - project_unarchived - project_updated - push_tokens_added - push_tokens_deleted - resource_control_policies_updated - resource_invite_sent - review_link_assets_added - review_link_assets_deleted - review_link_created - review_link_deleted - review_link_emailed - review_link_updated - reviewer_created - reviewer_deleted - role_added - role_removed - sbwm_template_created - sbwm_template_deleted - sbwm_template_updated - session_refreshed - session_revoked - share_activity_tracking_consent_changed - share_branding_preset_updated - share_created - share_deleted - share_invites_sent - share_list_created - share_list_deleted - share_list_updated - share_reviewers_added - share_reviewers_removed - share_updated - share_viewed - subscription_cancelled - subscription_card_updated - subscription_created - subscription_line_item_created - subscription_line_item_deleted - subscription_restored - subscription_updated - team_created - team_creator_updated - team_deleted - team_lifecycle_policy_updated - team_member_created - team_member_deleted - team_member_reset - team_member_updated - team_updated - transcript_completed_self - transcript_diarization_consent_changed - transfer_batch_completed - user_anonymized - user_deactivated - user_login - user_login_attempt - user_logout - user_mfa_enforced - user_reactivated - user_signup - user_token_created - user_token_deleted - user_token_disabled - user_token_enabled - user_token_updated - user_updated - v4_planned_migration_creation_failed - v4_planned_migration_date_updated - webhook_created - webhook_deleted - webhook_updated - workfront_asset_approval_status_updated - workspace_permissions_granted_to_account_user_group - workspace_permissions_granted_to_user description: Filter by event type title: FiltersEventType FiltersResourceType: type: string enum: - account - account_field_definition - account_member - account_user_group - action - allowed_domain - anonymous_user - asset - asset_metadata - collaborator - collection - comment - comment_impression - controlled_domain - folder - join_request - login_factor - media - oauth_app - pending_account_member - pending_collaborator - pending_reviewer - pending_team_member - plan - presentation - project - project_field_definition - project_invite_link - project_preference - reset_token - review_link - reviewer - sbwm_template - share - share_list - subscription - subscription_line_item - team - team_member - transfer_batch - user - user_token - v4_planned_migration - version_stack - webhook description: Filter by resource type title: FiltersResourceType Filters: type: object properties: event_type: $ref: '#/components/schemas/FiltersEventType' description: Filter by event type from_date: type: string format: date description: 'Start date for search, Format: ISO8601 extended [YYYY-MM-DD]' ip_address: type: string description: >- Filter by IP address. This supports both IPv4 (1.1.1.1) and IPv6 (2001:db8:3333:4444:5555:6666:7777:8888) project_id: type: string format: uuid description: Filter by Project ID (UUID) resource_id: type: string format: uuid description: Filter by Resource ID (UUID) resource_type: $ref: '#/components/schemas/FiltersResourceType' description: Filter by resource type to_date: type: string format: date description: 'End date for search, Format: ISO8601 extended [YYYY-MM-DD]' user_id: type: string format: uuid description: Filter by User ID (UUID) workspace_id: type: string format: uuid description: Filter by Workspace ID (UUID) description: Audit logs search filter parameters title: Filters RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount V4AccountsAccountIdAuditLogsGetParametersApiVersion: type: string enum: - '4.0' title: V4AccountsAccountIdAuditLogsGetParametersApiVersion AuditLogwithIncludesEventType: type: string enum: - access_request_approved - access_request_denied - access_request_submitted - account_aup_migration_created - account_aup_migration_deleted - account_aup_migration_downgrade_completed - account_aup_migration_downgrade_failed - account_aup_migration_downgrade_requested - account_aup_migration_product_migrated - account_aup_migration_started - account_aup_migration_updated - account_aup_user_migration_completed - account_aup_user_migration_created - account_aup_user_migration_deleted - account_aup_user_migration_failed - account_aup_user_migration_on_hold - account_aup_user_migration_started - account_aup_user_migration_unheld - account_aup_user_migration_updated - account_delinquent - account_field_created - account_field_deleted - account_field_updated - account_fio_version_migrated - account_locked - account_member_created - account_member_deleted - account_member_updated - account_mfa_enforced - account_ownership_transferred - account_permissions_granted_to_user - account_restored - account_updated - account_user_deleted - account_user_group_created - account_user_group_deleted - account_user_group_members_added - account_user_group_members_removed - account_user_group_updated - account_user_updated - action_created - action_deleted - action_updated - admin_update_to_v4 - allowed_domain_created - allowed_domain_deleted - anonymous_user_created - asset_assignee_changed - asset_copied - asset_created - asset_deleted - asset_metadata_created - asset_moved - asset_restored - asset_status_changed - asset_updated - asset_versioned - assets_unversioned - bulk_account_deletion_started - bulk_assets_deleted - bulk_assets_restored - bulk_assets_retranscoded - bulk_emails_updated - bulk_projects_activated - bulk_projects_deactivated - bulk_projects_mounted_storage_status_updated - bulk_users_removed - collaborator_added - collaborator_deleted - collection_updated - comment_completed - comment_created - comment_deleted - comment_liked - comment_uncompleted - comment_updated - controlled_domain_created - controlled_domain_updated - email_address_change_failure - email_address_changed - email_change_confirmation_requested - email_confirmed - file_uploaded - google_auth_disabled - google_auth_enabled - high_risk_sign_up - join_presentation_request_approved - join_project_request_approved - join_request_accepted - join_request_created - join_request_declined - join_request_deleted - join_request_reset - join_review_link_request_approved - join_team_request_approved - label_updated - login_factor_created - login_factor_validated - media_created - media_deleted - metadata_value_updated - new_device_login - new_user_email_confirmation_requested - oauth_app_created - oauth_app_deleted - oauth_app_disabled - oauth_app_enabled - oauth_app_updated - password_changed - password_reset_requested - pending_account_member_created - pending_account_member_deleted - pending_collaborator_created - pending_collaborator_deleted - pending_reviewer_created - pending_reviewer_deleted - pending_team_member_created - pending_team_member_deleted - plan_created - plan_deleted - plan_updated - preference_updated - presentation_created - presentation_deleted - presentation_updated - project_activated - project_archive_completed - project_archived - project_created - project_deactivated - project_deleted - project_field_created - project_field_deleted - project_field_updated - project_invite_link_created - project_invite_link_revoked - project_moved - project_permissions_granted_to_account_user_group - project_permissions_granted_to_user - project_restored - project_unarchive_completed - project_unarchived - project_updated - push_tokens_added - push_tokens_deleted - resource_control_policies_updated - resource_invite_sent - review_link_assets_added - review_link_assets_deleted - review_link_created - review_link_deleted - review_link_emailed - review_link_updated - reviewer_created - reviewer_deleted - role_added - role_removed - sbwm_template_created - sbwm_template_deleted - sbwm_template_updated - session_refreshed - session_revoked - share_activity_tracking_consent_changed - share_branding_preset_updated - share_created - share_deleted - share_invites_sent - share_list_created - share_list_deleted - share_list_updated - share_reviewers_added - share_reviewers_removed - share_updated - share_viewed - subscription_cancelled - subscription_card_updated - subscription_created - subscription_line_item_created - subscription_line_item_deleted - subscription_restored - subscription_updated - team_created - team_creator_updated - team_deleted - team_lifecycle_policy_updated - team_member_created - team_member_deleted - team_member_reset - team_member_updated - team_updated - transcript_completed_self - transcript_diarization_consent_changed - transfer_batch_completed - user_anonymized - user_deactivated - user_login - user_login_attempt - user_logout - user_mfa_enforced - user_reactivated - user_signup - user_token_created - user_token_deleted - user_token_disabled - user_token_enabled - user_token_updated - user_updated - v4_planned_migration_creation_failed - v4_planned_migration_date_updated - webhook_created - webhook_deleted - webhook_updated - workfront_asset_approval_status_updated - workspace_permissions_granted_to_account_user_group - workspace_permissions_granted_to_user title: AuditLogwithIncludesEventType AuditLogwithIncludesResourceType: type: string enum: - account - account_field_definition - account_member - account_user_group - action - allowed_domain - anonymous_user - asset - asset_metadata - collaborator - collection - comment - comment_impression - controlled_domain - folder - join_request - login_factor - media - oauth_app - pending_account_member - pending_collaborator - pending_reviewer - pending_team_member - plan - presentation - project - project_field_definition - project_invite_link - project_preference - reset_token - review_link - reviewer - sbwm_template - share - share_list - subscription - subscription_line_item - team - team_member - transfer_batch - user - user_token - v4_planned_migration - version_stack - webhook title: AuditLogwithIncludesResourceType User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User AuditLogwithIncludes: type: object properties: account_id: type: string format: uuid event_type: $ref: '#/components/schemas/AuditLogwithIncludesEventType' inserted_at: type: string ip_address: type: string project_id: type: - string - 'null' format: uuid resource_id: type: string format: uuid resource_type: $ref: '#/components/schemas/AuditLogwithIncludesResourceType' user: oneOf: - $ref: '#/components/schemas/User' - type: 'null' user_id: type: - string - 'null' format: uuid workspace_id: type: - string - 'null' format: uuid required: - account_id - event_type - inserted_at - ip_address - project_id - resource_id - resource_type - user_id - workspace_id description: Frame.io Audit Event title: AuditLogwithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links AuditLogsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/AuditLogwithIncludes' description: Audit logs links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io Audit log events title: AuditLogsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.accounts.auditlogIndex("9db7676e-cf18-42fa-b962-9097cf8c29a2", { filters: {}, apiVersion: "4.0", }); } main(); ``` ```python from frameio import Frameio, Filters client = Frameio( token="YOUR_TOKEN_HERE", ) client.accounts.auditlog_index( account_id="9db7676e-cf18-42fa-b962-9097cf8c29a2", filters=Filters(), api_version="4.0", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("api-version", "4.0") req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["api-version"] = '4.0' request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D") .header("api-version", "4.0") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D', [ 'headers' => [ 'Authorization' => 'Bearer ', 'api-version' => '4.0', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D"); var request = new RestRequest(Method.GET); request.AddHeader("api-version", "4.0"); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "api-version": "4.0", "Authorization": "Bearer " ] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/9db7676e-cf18-42fa-b962-9097cf8c29a2/audit_logs?filters=%7B%7D")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List collections GET https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/collections List collections for a project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/collections/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/collections: get: operationId: index summary: List collections description: >- List collections for a project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_collections parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: '#/components/schemas/CollectionInclude' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CollectionsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID CollectionInclude: type: string description: Include query parameter for collections title: CollectionInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount CollectionAggregationMode: type: string enum: - static - dynamic title: CollectionAggregationMode User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ProjectStatus: type: string enum: - active - inactive description: Project Status title: ProjectStatus Project: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id description: Frame.io Project title: Project ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share Collection: type: object properties: aggregation_mode: $ref: '#/components/schemas/CollectionAggregationMode' auto_generated: type: boolean created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' description: type: - string - 'null' description: Collection description id: type: string format: uuid description: Collection ID name: type: - string - 'null' description: Collection name private: type: boolean project: $ref: '#/components/schemas/Project' project_id: type: string format: uuid description: Project ID root_folder_id: type: - string - 'null' format: uuid description: Root folder ID shares: type: array items: $ref: '#/components/schemas/Share' description: Shares updated_at: type: string format: date-time description: Update timestamp required: - aggregation_mode - auto_generated - created_at - description - id - name - private - project_id - root_folder_id - updated_at title: Collection Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links CollectionsResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/Collection' description: Collections links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: CollectionsResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.collections.index("d7f5110a-f67d-4516-8421-90107a1bd875", "7758e221-6044-4317-9af0-beff69a702c7", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.collections.index( account_id="d7f5110a-f67d-4516-8421-90107a1bd875", project_id="7758e221-6044-4317-9af0-beff69a702c7", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/d7f5110a-f67d-4516-8421-90107a1bd875/projects/7758e221-6044-4317-9af0-beff69a702c7/collections")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show collection GET https://api.frame.io/v4/accounts/{account_id}/collections/{collection_id} Show collection details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/collections/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/collections/{collection_id}: get: operationId: show summary: Show collection description: >- Show collection details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_collections parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: collection_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: '#/components/schemas/CollectionInclude' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CollectionResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID CollectionInclude: type: string description: Include query parameter for collections title: CollectionInclude CollectionAggregationMode: type: string enum: - static - dynamic title: CollectionAggregationMode User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ProjectStatus: type: string enum: - active - inactive description: Project Status title: ProjectStatus Project: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id description: Frame.io Project title: Project ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share Collection: type: object properties: aggregation_mode: $ref: '#/components/schemas/CollectionAggregationMode' auto_generated: type: boolean created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' description: type: - string - 'null' description: Collection description id: type: string format: uuid description: Collection ID name: type: - string - 'null' description: Collection name private: type: boolean project: $ref: '#/components/schemas/Project' project_id: type: string format: uuid description: Project ID root_folder_id: type: - string - 'null' format: uuid description: Root folder ID shares: type: array items: $ref: '#/components/schemas/Share' description: Shares updated_at: type: string format: date-time description: Update timestamp required: - aggregation_mode - auto_generated - created_at - description - id - name - private - project_id - root_folder_id - updated_at title: Collection CollectionResponse: type: object properties: data: $ref: '#/components/schemas/Collection' required: - data title: CollectionResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.collections.show("f6af7a50-2377-4517-bb38-ae4831343370", "f84b299b-c08d-46e6-bbbb-2010f4210cf4", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.collections.show( account_id="f6af7a50-2377-4517-bb38-ae4831343370", collection_id="f84b299b-c08d-46e6-bbbb-2010f4210cf4", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/f6af7a50-2377-4517-bb38-ae4831343370/collections/f84b299b-c08d-46e6-bbbb-2010f4210cf4")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create comment POST https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/comments Content-Type: application/json Create a comment on a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/comments: post: operationId: create summary: Create comment description: >- Create a comment on a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: timestamp_as_timecode in: query description: '' required: false schema: type: boolean - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/CommentResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Comment params body content: application/json: schema: $ref: '#/components/schemas/CreateCommentParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId Anchor: type: object properties: x: type: number format: double description: Horizontal comment anchor location. 'y': type: number format: double description: Vertical comment anchor location. required: - x - 'y' title: Anchor AttachmentInput: type: object properties: file_size: type: integer description: Attachment file size in bytes (up to 5TB) media_type: type: string description: File media type name: type: string description: Filename required: - file_size - media_type - name description: Input for creating a comment attachment title: AttachmentInput LinkParams: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text url: type: string description: Link URL required: - end_index - start_index - url title: LinkParams TextReviewAnnotationBounds: type: object properties: height: type: number format: double description: Height of the rectangle width: type: number format: double description: Width of the rectangle x: type: number format: double description: Left corner position. 'y': type: number format: double description: Bottom corner position. required: - height - width - x - 'y' title: TextReviewAnnotationBounds TextReviewAnnotationTextReviewAnnotationType: type: string enum: - highlight - insert - remove - replace description: 'The type of text review annotation. ' title: TextReviewAnnotationTextReviewAnnotationType TextReviewAnnotation: type: object properties: bounds: type: array items: $ref: '#/components/schemas/TextReviewAnnotationBounds' description: >- An array of bounds representing a multiline selection origin at the lower-left corner. selection_text: type: - string - 'null' description: Selected text from the document. suggested_text: type: - string - 'null' description: Suggested replacement or insertion text. text_review_annotation_type: $ref: '#/components/schemas/TextReviewAnnotationTextReviewAnnotationType' description: 'The type of text review annotation. ' required: - bounds - selection_text - suggested_text - text_review_annotation_type title: TextReviewAnnotation TimeStamp: oneOf: - type: string format: HH:MM:SS:FF - type: integer title: TimeStamp CreateCommentParamsData: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' description: >- JSON geometry for on-screen drawings. Allowed for document, image, video, or stream file types. JSON must be stringified attachments: type: array items: $ref: '#/components/schemas/AttachmentInput' description: Optional attachments to create with the comment (max 6 attachments) completed: type: - boolean - 'null' description: Comment completion status duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter links: type: array items: $ref: '#/components/schemas/LinkParams' description: Comment text links. page: type: - integer - 'null' description: Document page. Only allowed when file type is a pdf document text: type: string description: Comment text (required) text_review_annotation: $ref: '#/components/schemas/TextReviewAnnotation' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' required: - text title: CreateCommentParamsData CreateCommentParams: type: object properties: data: $ref: '#/components/schemas/CreateCommentParamsData' required: - data description: Frame.io create comment params title: CreateCommentParams CommentAttachment: type: object properties: created_at: type: string format: date-time description: Creation timestamp file_size: type: integer description: Attachment file size in bytes (up to 5TB) id: type: string format: uuid description: Comment attachment ID media_type: type: - string - 'null' description: File media type name: type: string description: File name for the attachment upload_urls: type: - array - 'null' items: type: string description: >- Comment attachment upload URLs. Number of URLs returned will vary depending on the file size. required: - created_at - file_size - id - media_type - name title: CommentAttachment Link: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text text: type: string description: Link text url: type: string description: Link URL required: - end_index - start_index - text - url title: Link Mention: type: object properties: end_index: type: integer description: End index of mention text start_index: type: integer description: Start index of mention text text: type: string description: Mention text user_id: type: string format: uuid description: Mentioned user ID required: - end_index - start_index - text - user_id title: Mention Comment: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: Comment CommentResponse: type: object properties: data: $ref: '#/components/schemas/Comment' required: - data title: CommentResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.create("43e51eab-1419-4d6b-bb3b-5d7555bc4155", "8eb1822b-968c-47b2-819f-f8bc43388422", { data: { text: "This is great!", anchor: { x: 0.5, y: 0.5, }, annotation: "[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", attachments: [ { fileSize: 1024000, mediaType: "image/png", name: "screenshot.png", }, ], completed: false, duration: 10, links: [ { endIndex: 13, startIndex: 5, url: "https://www.example.com", }, ], page: 4, textReviewAnnotation: { bounds: [ { height: 42, width: 130, x: 12.5, y: 24, }, ], selectionText: "existing copy", suggestedText: "updated copy", textReviewAnnotationType: "replace", }, timestamp: "00:00:02:12", }, }); } main(); ``` ```python from frameio import Frameio, Anchor, AttachmentInput, LinkParams, TextReviewAnnotation, TextReviewAnnotationBounds from frameio.comments import CreateCommentParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.create( account_id="43e51eab-1419-4d6b-bb3b-5d7555bc4155", file_id="8eb1822b-968c-47b2-819f-f8bc43388422", data=CreateCommentParamsData( text="This is great!", anchor=Anchor( x=0.5, y=0.5, ), annotation="[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", attachments=[ AttachmentInput( file_size=1024000, media_type="image/png", name="screenshot.png", ) ], completed=False, duration=10, links=[ LinkParams( end_index=13, start_index=5, url="https://www.example.com", ) ], page=4, text_review_annotation=TextReviewAnnotation( bounds=[ TextReviewAnnotationBounds( height=42, width=130, x=12.5, y=24, ) ], selection_text="existing copy", suggested_text="updated copy", text_review_annotation_type="replace", ), timestamp="00:00:02:12", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments" payload := strings.NewReader("{\n \"data\": {\n \"text\": \"This is great!\",\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"attachments\": [\n {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n ],\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text_review_annotation\": {\n \"bounds\": [\n {\n \"height\": 42,\n \"width\": 130,\n \"x\": 12.5,\n \"y\": 24\n }\n ],\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\",\n \"text_review_annotation_type\": \"replace\"\n },\n \"timestamp\": \"00:00:02:12\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"text\": \"This is great!\",\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"attachments\": [\n {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n ],\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text_review_annotation\": {\n \"bounds\": [\n {\n \"height\": 42,\n \"width\": 130,\n \"x\": 12.5,\n \"y\": 24\n }\n ],\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\",\n \"text_review_annotation_type\": \"replace\"\n },\n \"timestamp\": \"00:00:02:12\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"text\": \"This is great!\",\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"attachments\": [\n {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n ],\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text_review_annotation\": {\n \"bounds\": [\n {\n \"height\": 42,\n \"width\": 130,\n \"x\": 12.5,\n \"y\": 24\n }\n ],\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\",\n \"text_review_annotation_type\": \"replace\"\n },\n \"timestamp\": \"00:00:02:12\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments', [ 'body' => '{ "data": { "text": "This is great!", "anchor": { "x": 0.5, "y": 0.5 }, "annotation": "[{\\"tool\\":\\"rect\\",\\"color\\":\\"#F22237\\",\\"size\\":8,\\"x\\":0.277726001863933,\\"y\\":0.12909555568499534,\\"w\\":0.3153168321877913,\\"h\\":0.5308131407269339,\\"ix\\":0.277726001863933,\\"iy\\":0.12909555568499534,\\"radius\\":8}]", "attachments": [ { "file_size": 1024000, "media_type": "image/png", "name": "screenshot.png" } ], "completed": false, "duration": 10, "links": [ { "end_index": 13, "start_index": 5, "url": "https://www.example.com" } ], "page": 4, "text_review_annotation": { "bounds": [ { "height": 42, "width": 130, "x": 12.5, "y": 24 } ], "selection_text": "existing copy", "suggested_text": "updated copy", "text_review_annotation_type": "replace" }, "timestamp": "00:00:02:12" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"text\": \"This is great!\",\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"attachments\": [\n {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n ],\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text_review_annotation\": {\n \"bounds\": [\n {\n \"height\": 42,\n \"width\": 130,\n \"x\": 12.5,\n \"y\": 24\n }\n ],\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\",\n \"text_review_annotation_type\": \"replace\"\n },\n \"timestamp\": \"00:00:02:12\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "text": "This is great!", "anchor": [ "x": 0.5, "y": 0.5 ], "annotation": "[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", "attachments": [ [ "file_size": 1024000, "media_type": "image/png", "name": "screenshot.png" ] ], "completed": false, "duration": 10, "links": [ [ "end_index": 13, "start_index": 5, "url": "https://www.example.com" ] ], "page": 4, "text_review_annotation": [ "bounds": [ [ "height": 42, "width": 130, "x": 12.5, "y": 24 ] ], "selection_text": "existing copy", "suggested_text": "updated copy", "text_review_annotation_type": "replace" ], "timestamp": "00:00:02:12" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/43e51eab-1419-4d6b-bb3b-5d7555bc4155/files/8eb1822b-968c-47b2-819f-f8bc43388422/comments")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create comment attachment POST https://api.frame.io/v4/accounts/{account_id}/comments/{comment_id}/attachments Content-Type: application/json Create an attachment for an existing comment.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/create-attachment ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/comments/{comment_id}/attachments: post: operationId: create-attachment summary: Create comment attachment description: >- Create an attachment for an existing comment.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: comment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/CommentAttachmentResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Comment attachment params body content: application/json: schema: $ref: '#/components/schemas/CreateAttachmentParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID AttachmentInput: type: object properties: file_size: type: integer description: Attachment file size in bytes (up to 5TB) media_type: type: string description: File media type name: type: string description: Filename required: - file_size - media_type - name description: Input for creating a comment attachment title: AttachmentInput CreateAttachmentParams: type: object properties: data: $ref: '#/components/schemas/AttachmentInput' required: - data description: Request body for creating a comment attachment title: CreateAttachmentParams CommentAttachment: type: object properties: created_at: type: string format: date-time description: Creation timestamp file_size: type: integer description: Attachment file size in bytes (up to 5TB) id: type: string format: uuid description: Comment attachment ID media_type: type: - string - 'null' description: File media type name: type: string description: File name for the attachment upload_urls: type: - array - 'null' items: type: string description: >- Comment attachment upload URLs. Number of URLs returned will vary depending on the file size. required: - created_at - file_size - id - media_type - name title: CommentAttachment CommentAttachmentResponse: type: object properties: data: $ref: '#/components/schemas/CommentAttachment' title: CommentAttachmentResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.createAttachment("39f194ab-0ad2-41a6-9c3c-d895c30d1651", "f012f1c0-4e04-45d7-beb7-d74464539a4a", { data: { fileSize: 1024000, mediaType: "image/png", name: "screenshot.png", }, }); } main(); ``` ```python from frameio import Frameio, AttachmentInput client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.create_attachment( account_id="39f194ab-0ad2-41a6-9c3c-d895c30d1651", comment_id="f012f1c0-4e04-45d7-beb7-d74464539a4a", data=AttachmentInput( file_size=1024000, media_type="image/png", name="screenshot.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments" payload := strings.NewReader("{\n \"data\": {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments', [ 'body' => '{ "data": { "file_size": 1024000, "media_type": "image/png", "name": "screenshot.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_size\": 1024000,\n \"media_type\": \"image/png\",\n \"name\": \"screenshot.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "file_size": 1024000, "media_type": "image/png", "name": "screenshot.png" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/39f194ab-0ad2-41a6-9c3c-d895c30d1651/comments/f012f1c0-4e04-45d7-beb7-d74464539a4a/attachments")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete comment DELETE https://api.frame.io/v4/accounts/{account_id}/comments/{comment_id} Delete comment from an asset.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/comments/{comment_id}: delete: operationId: delete summary: Delete comment description: >- Delete comment from an asset.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: comment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.delete("74c19a12-fc2f-47b9-b650-559899040619", "3046a1a8-7147-4413-b083-af5406701cda"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.delete( account_id="74c19a12-fc2f-47b9-b650-559899040619", comment_id="3046a1a8-7147-4413-b083-af5406701cda", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/74c19a12-fc2f-47b9-b650-559899040619/comments/3046a1a8-7147-4413-b083-af5406701cda")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete comment attachment DELETE https://api.frame.io/v4/accounts/{account_id}/comments/{comment_id}/attachments/{attachment_id} Delete an attachment from a comment.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/delete-attachment ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/comments/{comment_id}/attachments/{attachment_id}: delete: operationId: delete-attachment summary: Delete comment attachment description: >- Delete an attachment from a comment.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: comment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: attachment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.deleteAttachment("0d0f1337-2c85-4fc0-82c6-4f8499b33833", "bafdacf8-7c28-4c3d-b1ee-01332289b401", "a1f3a40a-3e51-4212-ad39-1d189e0dcbfa"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.delete_attachment( account_id="0d0f1337-2c85-4fc0-82c6-4f8499b33833", comment_id="bafdacf8-7c28-4c3d-b1ee-01332289b401", attachment_id="a1f3a40a-3e51-4212-ad39-1d189e0dcbfa", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/0d0f1337-2c85-4fc0-82c6-4f8499b33833/comments/bafdacf8-7c28-4c3d-b1ee-01332289b401/attachments/a1f3a40a-3e51-4212-ad39-1d189e0dcbfa")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List comments GET https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/comments List comments on a given asset.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/comments: get: operationId: index summary: List comments description: >- List comments on a given asset.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: timestamp_as_timecode in: query description: '' required: false schema: type: boolean - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFilesFileIdCommentsGetParametersInclude - name: sort in: query description: Sort comments by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFilesFileIdCommentsGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CommentsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFilesFileIdCommentsGetParametersInclude: type: string enum: - owner - replies description: Include query parameter for comments title: V4AccountsAccountIdFilesFileIdCommentsGetParametersInclude V4AccountsAccountIdFilesFileIdCommentsGetParametersSort: type: string enum: - owner_asc - owner_desc - completed_at_asc - completed_at_desc - created_at_asc - created_at_desc description: >- Sort query parameter for comments. Include query params for owner is required when sorting by owner. title: V4AccountsAccountIdFilesFileIdCommentsGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount Anchor: type: object properties: x: type: number format: double description: Horizontal comment anchor location. 'y': type: number format: double description: Vertical comment anchor location. required: - x - 'y' title: Anchor CommentAttachment: type: object properties: created_at: type: string format: date-time description: Creation timestamp file_size: type: integer description: Attachment file size in bytes (up to 5TB) id: type: string format: uuid description: Comment attachment ID media_type: type: - string - 'null' description: File media type name: type: string description: File name for the attachment upload_urls: type: - array - 'null' items: type: string description: >- Comment attachment upload URLs. Number of URLs returned will vary depending on the file size. required: - created_at - file_size - id - media_type - name title: CommentAttachment Link: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text text: type: string description: Link text url: type: string description: Link URL required: - end_index - start_index - text - url title: Link Mention: type: object properties: end_index: type: integer description: End index of mention text start_index: type: integer description: Start index of mention text text: type: string description: Mention text user_id: type: string format: uuid description: Mentioned user ID required: - end_index - start_index - text - user_id title: Mention TextReviewAnnotationBounds: type: object properties: height: type: number format: double description: Height of the rectangle width: type: number format: double description: Width of the rectangle x: type: number format: double description: Left corner position. 'y': type: number format: double description: Bottom corner position. required: - height - width - x - 'y' title: TextReviewAnnotationBounds TextReviewAnnotationTextReviewAnnotationType: type: string enum: - highlight - insert - remove - replace description: 'The type of text review annotation. ' title: TextReviewAnnotationTextReviewAnnotationType TextReviewAnnotation: type: object properties: bounds: type: array items: $ref: '#/components/schemas/TextReviewAnnotationBounds' description: >- An array of bounds representing a multiline selection origin at the lower-left corner. selection_text: type: - string - 'null' description: Selected text from the document. suggested_text: type: - string - 'null' description: Suggested replacement or insertion text. text_review_annotation_type: $ref: '#/components/schemas/TextReviewAnnotationTextReviewAnnotationType' description: 'The type of text review annotation. ' required: - bounds - selection_text - suggested_text - text_review_annotation_type title: TextReviewAnnotation TimeStamp: oneOf: - type: string format: HH:MM:SS:FF - type: integer title: TimeStamp User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User Comment: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: Comment CommentWithIncludes: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp owner: $ref: '#/components/schemas/User' replies: type: array items: $ref: '#/components/schemas/Comment' description: Replies required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: CommentWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links CommentsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/CommentWithIncludes' description: Comments links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: CommentsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.index("dc7174ae-fc2a-4ed8-b9b3-5c2831fff741", "5cd9cd68-43cc-4006-ac34-a7041271df4a", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.index( account_id="dc7174ae-fc2a-4ed8-b9b3-5c2831fff741", file_id="5cd9cd68-43cc-4006-ac34-a7041271df4a", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/dc7174ae-fc2a-4ed8-b9b3-5c2831fff741/files/5cd9cd68-43cc-4006-ac34-a7041271df4a/comments")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show comment GET https://api.frame.io/v4/accounts/{account_id}/comments/{comment_id} Show a single comment on a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/comments/{comment_id}: get: operationId: show summary: Show comment description: >- Show a single comment on a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: comment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: timestamp_as_timecode in: query description: '' required: false schema: type: boolean - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdCommentsCommentIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CommentWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdCommentsCommentIdGetParametersInclude: type: string enum: - owner - replies description: Include query parameter for comments title: V4AccountsAccountIdCommentsCommentIdGetParametersInclude Anchor: type: object properties: x: type: number format: double description: Horizontal comment anchor location. 'y': type: number format: double description: Vertical comment anchor location. required: - x - 'y' title: Anchor CommentAttachment: type: object properties: created_at: type: string format: date-time description: Creation timestamp file_size: type: integer description: Attachment file size in bytes (up to 5TB) id: type: string format: uuid description: Comment attachment ID media_type: type: - string - 'null' description: File media type name: type: string description: File name for the attachment upload_urls: type: - array - 'null' items: type: string description: >- Comment attachment upload URLs. Number of URLs returned will vary depending on the file size. required: - created_at - file_size - id - media_type - name title: CommentAttachment Link: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text text: type: string description: Link text url: type: string description: Link URL required: - end_index - start_index - text - url title: Link Mention: type: object properties: end_index: type: integer description: End index of mention text start_index: type: integer description: Start index of mention text text: type: string description: Mention text user_id: type: string format: uuid description: Mentioned user ID required: - end_index - start_index - text - user_id title: Mention TextReviewAnnotationBounds: type: object properties: height: type: number format: double description: Height of the rectangle width: type: number format: double description: Width of the rectangle x: type: number format: double description: Left corner position. 'y': type: number format: double description: Bottom corner position. required: - height - width - x - 'y' title: TextReviewAnnotationBounds TextReviewAnnotationTextReviewAnnotationType: type: string enum: - highlight - insert - remove - replace description: 'The type of text review annotation. ' title: TextReviewAnnotationTextReviewAnnotationType TextReviewAnnotation: type: object properties: bounds: type: array items: $ref: '#/components/schemas/TextReviewAnnotationBounds' description: >- An array of bounds representing a multiline selection origin at the lower-left corner. selection_text: type: - string - 'null' description: Selected text from the document. suggested_text: type: - string - 'null' description: Suggested replacement or insertion text. text_review_annotation_type: $ref: '#/components/schemas/TextReviewAnnotationTextReviewAnnotationType' description: 'The type of text review annotation. ' required: - bounds - selection_text - suggested_text - text_review_annotation_type title: TextReviewAnnotation TimeStamp: oneOf: - type: string format: HH:MM:SS:FF - type: integer title: TimeStamp User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User Comment: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: Comment CommentWithIncludes: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp owner: $ref: '#/components/schemas/User' replies: type: array items: $ref: '#/components/schemas/Comment' description: Replies required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: CommentWithIncludes CommentWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/CommentWithIncludes' required: - data title: CommentWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.show("b94819d0-e830-4a05-9c27-5a97466f1d6d", "c7450961-701d-4949-a0e5-99fb26352892", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.show( account_id="b94819d0-e830-4a05-9c27-5a97466f1d6d", comment_id="c7450961-701d-4949-a0e5-99fb26352892", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/b94819d0-e830-4a05-9c27-5a97466f1d6d/comments/c7450961-701d-4949-a0e5-99fb26352892")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update comment PATCH https://api.frame.io/v4/accounts/{account_id}/comments/{comment_id} Content-Type: application/json Update comment on given asset.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/comments/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/comments/{comment_id}: patch: operationId: update summary: Update comment description: >- Update comment on given asset.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_comments parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: comment_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: timestamp_as_timecode in: query description: '' required: false schema: type: boolean - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CommentResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Comment params body content: application/json: schema: $ref: '#/components/schemas/UpdateCommentParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID Anchor: type: object properties: x: type: number format: double description: Horizontal comment anchor location. 'y': type: number format: double description: Vertical comment anchor location. required: - x - 'y' title: Anchor LinkParams: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text url: type: string description: Link URL required: - end_index - start_index - url title: LinkParams TextReviewAnnotationBounds: type: object properties: height: type: number format: double description: Height of the rectangle width: type: number format: double description: Width of the rectangle x: type: number format: double description: Left corner position. 'y': type: number format: double description: Bottom corner position. required: - height - width - x - 'y' title: TextReviewAnnotationBounds TextReviewAnnotationUpdateTextReviewAnnotationType: type: string enum: - highlight - insert - remove - replace description: Optional annotation type override. title: TextReviewAnnotationUpdateTextReviewAnnotationType TextReviewAnnotationUpdate: type: object properties: bounds: type: array items: $ref: '#/components/schemas/TextReviewAnnotationBounds' description: >- Optional bounds array. When omitted, previously stored bounds are preserved. selection_text: type: - string - 'null' description: Optional selection text override. suggested_text: type: - string - 'null' description: Optional suggestion override. text_review_annotation_type: $ref: >- #/components/schemas/TextReviewAnnotationUpdateTextReviewAnnotationType description: Optional annotation type override. description: Payload for updating an existing text review annotation. title: TextReviewAnnotationUpdate TimeStamp: oneOf: - type: string format: HH:MM:SS:FF - type: integer title: TimeStamp UpdateCommentParamsData: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' description: >- JSON geometry for on-screen drawings. Allowed for document, image, video, or stream file types. JSON must be stringified. completed: type: - boolean - 'null' description: Comment completion status duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter links: type: array items: $ref: '#/components/schemas/LinkParams' description: Comment text links. page: type: - integer - 'null' description: Document page. Only allowed when file type is a pdf document text: type: string description: Comment text text_review_annotation: $ref: '#/components/schemas/TextReviewAnnotationUpdate' timestamp: $ref: '#/components/schemas/TimeStamp' title: UpdateCommentParamsData UpdateCommentParams: type: object properties: data: $ref: '#/components/schemas/UpdateCommentParamsData' required: - data description: Frame.io update comment params title: UpdateCommentParams CommentAttachment: type: object properties: created_at: type: string format: date-time description: Creation timestamp file_size: type: integer description: Attachment file size in bytes (up to 5TB) id: type: string format: uuid description: Comment attachment ID media_type: type: - string - 'null' description: File media type name: type: string description: File name for the attachment upload_urls: type: - array - 'null' items: type: string description: >- Comment attachment upload URLs. Number of URLs returned will vary depending on the file size. required: - created_at - file_size - id - media_type - name title: CommentAttachment Link: type: object properties: end_index: type: integer description: End index of link text start_index: type: integer description: Start index of link text text: type: string description: Link text url: type: string description: Link URL required: - end_index - start_index - text - url title: Link Mention: type: object properties: end_index: type: integer description: End index of mention text start_index: type: integer description: Start index of mention text text: type: string description: Mention text user_id: type: string format: uuid description: Mentioned user ID required: - end_index - start_index - text - user_id title: Mention TextReviewAnnotationTextReviewAnnotationType: type: string enum: - highlight - insert - remove - replace description: 'The type of text review annotation. ' title: TextReviewAnnotationTextReviewAnnotationType TextReviewAnnotation: type: object properties: bounds: type: array items: $ref: '#/components/schemas/TextReviewAnnotationBounds' description: >- An array of bounds representing a multiline selection origin at the lower-left corner. selection_text: type: - string - 'null' description: Selected text from the document. suggested_text: type: - string - 'null' description: Suggested replacement or insertion text. text_review_annotation_type: $ref: '#/components/schemas/TextReviewAnnotationTextReviewAnnotationType' description: 'The type of text review annotation. ' required: - bounds - selection_text - suggested_text - text_review_annotation_type title: TextReviewAnnotation Comment: type: object properties: anchor: oneOf: - $ref: '#/components/schemas/Anchor' - type: 'null' description: Comment anchor location. {(x, y) | 0 <= x <= 1, 0 <= y <= 1}. annotation: type: - string - 'null' attachments: type: - array - 'null' items: $ref: '#/components/schemas/CommentAttachment' description: Attachments associated with this comment (0-6 attachments allowed) completed_at: type: - string - 'null' format: date-time description: Completion timestamp completer_id: type: - string - 'null' format: uuid description: ID of user who marked the comment as completed created_at: type: string format: date-time description: Creation timestamp duration: type: - integer - 'null' description: >- Duration of comment in frames. Requires presence of timestamp parameter file_id: type: string format: uuid description: File ID id: type: string format: uuid description: Comment ID links: type: array items: $ref: '#/components/schemas/Link' description: Links mentions: type: array items: $ref: '#/components/schemas/Mention' description: Mentions page: type: - integer - 'null' description: Document page text: type: string description: Comment text text_edited_at: type: - string - 'null' format: date-time description: Text edited timestamp text_review_annotation: oneOf: - $ref: '#/components/schemas/TextReviewAnnotation' - type: 'null' description: Text review annotation details for comments left on text documents. timestamp: $ref: '#/components/schemas/TimeStamp' updated_at: type: string format: date-time description: Update timestamp required: - annotation - attachments - completed_at - completer_id - created_at - duration - file_id - id - links - mentions - page - text - text_edited_at - text_review_annotation - timestamp - updated_at title: Comment CommentResponse: type: object properties: data: $ref: '#/components/schemas/Comment' required: - data title: CommentResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.comments.update("101a9789-2648-419d-b579-8f4dc1302416", "59d111ee-e8b8-472c-bb33-1690a15a83d2", { data: { anchor: { x: 0.5, y: 0.5, }, annotation: "[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", completed: false, duration: 10, links: [ { endIndex: 13, startIndex: 5, url: "https://www.example.com", }, ], page: 4, text: "This is great!", textReviewAnnotation: { selectionText: "existing copy", suggestedText: "updated copy", }, timestamp: 100, }, }); } main(); ``` ```python from frameio import Frameio, Anchor, LinkParams, TextReviewAnnotationUpdate from frameio.comments import UpdateCommentParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.comments.update( account_id="101a9789-2648-419d-b579-8f4dc1302416", comment_id="59d111ee-e8b8-472c-bb33-1690a15a83d2", data=UpdateCommentParamsData( anchor=Anchor( x=0.5, y=0.5, ), annotation="[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", completed=False, duration=10, links=[ LinkParams( end_index=13, start_index=5, url="https://www.example.com", ) ], page=4, text="This is great!", text_review_annotation=TextReviewAnnotationUpdate( selection_text="existing copy", suggested_text="updated copy", ), timestamp=100, ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2" payload := strings.NewReader("{\n \"data\": {\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text\": \"This is great!\",\n \"text_review_annotation\": {\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\"\n },\n \"timestamp\": 100\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text\": \"This is great!\",\n \"text_review_annotation\": {\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\"\n },\n \"timestamp\": 100\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text\": \"This is great!\",\n \"text_review_annotation\": {\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\"\n },\n \"timestamp\": 100\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2', [ 'body' => '{ "data": { "anchor": { "x": 0.5, "y": 0.5 }, "annotation": "[{\\"tool\\":\\"rect\\",\\"color\\":\\"#F22237\\",\\"size\\":8,\\"x\\":0.277726001863933,\\"y\\":0.12909555568499534,\\"w\\":0.3153168321877913,\\"h\\":0.5308131407269339,\\"ix\\":0.277726001863933,\\"iy\\":0.12909555568499534,\\"radius\\":8}]", "completed": false, "duration": 10, "links": [ { "end_index": 13, "start_index": 5, "url": "https://www.example.com" } ], "page": 4, "text": "This is great!", "text_review_annotation": { "selection_text": "existing copy", "suggested_text": "updated copy" }, "timestamp": 100 } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"anchor\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"annotation\": \"[{\\\"tool\\\":\\\"rect\\\",\\\"color\\\":\\\"#F22237\\\",\\\"size\\\":8,\\\"x\\\":0.277726001863933,\\\"y\\\":0.12909555568499534,\\\"w\\\":0.3153168321877913,\\\"h\\\":0.5308131407269339,\\\"ix\\\":0.277726001863933,\\\"iy\\\":0.12909555568499534,\\\"radius\\\":8}]\",\n \"completed\": false,\n \"duration\": 10,\n \"links\": [\n {\n \"end_index\": 13,\n \"start_index\": 5,\n \"url\": \"https://www.example.com\"\n }\n ],\n \"page\": 4,\n \"text\": \"This is great!\",\n \"text_review_annotation\": {\n \"selection_text\": \"existing copy\",\n \"suggested_text\": \"updated copy\"\n },\n \"timestamp\": 100\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "anchor": [ "x": 0.5, "y": 0.5 ], "annotation": "[{\"tool\":\"rect\",\"color\":\"#F22237\",\"size\":8,\"x\":0.277726001863933,\"y\":0.12909555568499534,\"w\":0.3153168321877913,\"h\":0.5308131407269339,\"ix\":0.277726001863933,\"iy\":0.12909555568499534,\"radius\":8}]", "completed": false, "duration": 10, "links": [ [ "end_index": 13, "start_index": 5, "url": "https://www.example.com" ] ], "page": 4, "text": "This is great!", "text_review_annotation": [ "selection_text": "existing copy", "suggested_text": "updated copy" ], "timestamp": 100 ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/101a9789-2648-419d-b579-8f4dc1302416/comments/59d111ee-e8b8-472c-bb33-1690a15a83d2")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create custom action POST https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/actions Content-Type: application/json Create a custom action in a workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/custom-actions/actions-create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/actions: post: operationId: actions-create summary: Create custom action description: >- Create a custom action in a workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_customActions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ActionCreateResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Action params content: application/json: schema: $ref: '#/components/schemas/ActionCreateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID ActionCreateParamsData: type: object properties: description: type: string description: Action description event: type: string description: Event name sent to `url` multi_asset: type: boolean default: true description: Manages action trigger on multiple assets name: type: string description: Action name timeout: type: integer description: Timeout for the action requests in seconds url: type: string description: URL where `event` is sent required: - description - event - name - url title: ActionCreateParamsData ActionCreateParams: type: object properties: data: $ref: '#/components/schemas/ActionCreateParamsData' required: - data description: Custom Action creation parameters title: ActionCreateParams ActionCreateResponseData: type: object properties: active: type: boolean description: Active Status created_at: type: string format: date-time creator_id: type: string format: uuid description: Creator ID deleted_at: type: - string - 'null' format: date-time description: type: string description: Action Description event: type: string description: Event Name id: type: string format: uuid description: Action ID multi_asset: type: boolean description: Manages action trigger on multiple assets name: type: string description: Action Name timeout: type: integer description: Timeout for the action requests in seconds updated_at: type: string format: date-time url: type: string description: Action URL workspace_id: type: string format: uuid description: Workspace ID secret: type: string description: >- Secret used to validate underlying webhook requests. Make sure to store your secret. You won't be able to see it again! required: - active - created_at - creator_id - deleted_at - description - event - id - name - updated_at - url - workspace_id - secret title: ActionCreateResponseData ActionCreateResponse: type: object properties: data: $ref: '#/components/schemas/ActionCreateResponseData' required: - data description: Returns a single custom action with secret. title: ActionCreateResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.customActions.actionsCreate("091b3d85-8b0f-4914-b8e9-e80ee2e2ded8", "82457150-3f85-49d7-b985-a868e0417ab4", { data: { description: "customizing our workflow", event: "my.event", name: "First Custom Action", url: "https://example.com/custom-action", timeout: 7, }, }); } main(); ``` ```python from frameio import Frameio from frameio.custom_actions import ActionCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.custom_actions.actions_create( account_id="091b3d85-8b0f-4914-b8e9-e80ee2e2ded8", workspace_id="82457150-3f85-49d7-b985-a868e0417ab4", data=ActionCreateParamsData( description="customizing our workflow", event="my.event", name="First Custom Action", url="https://example.com/custom-action", timeout=7, ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions" payload := strings.NewReader("{\n \"data\": {\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"name\": \"First Custom Action\",\n \"url\": \"https://example.com/custom-action\",\n \"timeout\": 7\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"name\": \"First Custom Action\",\n \"url\": \"https://example.com/custom-action\",\n \"timeout\": 7\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"name\": \"First Custom Action\",\n \"url\": \"https://example.com/custom-action\",\n \"timeout\": 7\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions', [ 'body' => '{ "data": { "description": "customizing our workflow", "event": "my.event", "name": "First Custom Action", "url": "https://example.com/custom-action", "timeout": 7 } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"name\": \"First Custom Action\",\n \"url\": \"https://example.com/custom-action\",\n \"timeout\": 7\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "description": "customizing our workflow", "event": "my.event", "name": "First Custom Action", "url": "https://example.com/custom-action", "timeout": 7 ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/091b3d85-8b0f-4914-b8e9-e80ee2e2ded8/workspaces/82457150-3f85-49d7-b985-a868e0417ab4/actions")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete custom action DELETE https://api.frame.io/v4/accounts/{account_id}/actions/{action_id} Delete a custom action.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/custom-actions/actions-delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/actions/{action_id}: delete: operationId: actions-delete summary: Delete custom action description: >- Delete a custom action.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_customActions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: action_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.customActions.actionsDelete("79fd6f43-2b37-43ac-8d21-10570daaa5b7", "1848f63c-07bf-464c-986e-fb4eee0692e3"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.custom_actions.actions_delete( account_id="79fd6f43-2b37-43ac-8d21-10570daaa5b7", action_id="1848f63c-07bf-464c-986e-fb4eee0692e3", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/79fd6f43-2b37-43ac-8d21-10570daaa5b7/actions/1848f63c-07bf-464c-986e-fb4eee0692e3")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List actions GET https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/actions List actions in a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/custom-actions/actions-index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/actions: get: operationId: actions-index summary: List actions description: >- List actions in a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_customActions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdActionsGetParametersInclude - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ActionsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWorkspacesWorkspaceIdActionsGetParametersInclude: type: string enum: - creator description: Include query parameter for custom actions title: V4AccountsAccountIdWorkspacesWorkspaceIdActionsGetParametersInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ActionWithIncludes: type: object properties: active: type: boolean description: Active Status created_at: type: string format: date-time creator_id: type: string format: uuid description: Creator ID deleted_at: type: - string - 'null' format: date-time description: type: string description: Action Description event: type: string description: Event Name id: type: string format: uuid description: Action ID multi_asset: type: boolean description: Manages action trigger on multiple assets name: type: string description: Action Name timeout: type: integer description: Timeout for the action requests in seconds updated_at: type: string format: date-time url: type: string description: Action URL workspace_id: type: string format: uuid description: Workspace ID creator: $ref: '#/components/schemas/User' required: - active - created_at - creator_id - deleted_at - description - event - id - name - updated_at - url - workspace_id title: ActionWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links ActionsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/ActionWithIncludes' description: Actions links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io actions title: ActionsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.customActions.actionsIndex("4a5233e8-2368-42c1-84b2-dc45c6e99655", "8aae09f0-02ad-4ef6-832b-b5d49aec19da", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.custom_actions.actions_index( account_id="4a5233e8-2368-42c1-84b2-dc45c6e99655", workspace_id="8aae09f0-02ad-4ef6-832b-b5d49aec19da", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/4a5233e8-2368-42c1-84b2-dc45c6e99655/workspaces/8aae09f0-02ad-4ef6-832b-b5d49aec19da/actions")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show custom action details GET https://api.frame.io/v4/accounts/{account_id}/actions/{action_id} Show custom action details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/custom-actions/actions-show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/actions/{action_id}: get: operationId: actions-show summary: Show custom action details description: >- Show custom action details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_customActions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: action_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdActionsActionIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ActionWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdActionsActionIdGetParametersInclude: type: string enum: - creator description: Include query parameter for custom actions title: V4AccountsAccountIdActionsActionIdGetParametersInclude User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ActionWithIncludes: type: object properties: active: type: boolean description: Active Status created_at: type: string format: date-time creator_id: type: string format: uuid description: Creator ID deleted_at: type: - string - 'null' format: date-time description: type: string description: Action Description event: type: string description: Event Name id: type: string format: uuid description: Action ID multi_asset: type: boolean description: Manages action trigger on multiple assets name: type: string description: Action Name timeout: type: integer description: Timeout for the action requests in seconds updated_at: type: string format: date-time url: type: string description: Action URL workspace_id: type: string format: uuid description: Workspace ID creator: $ref: '#/components/schemas/User' required: - active - created_at - creator_id - deleted_at - description - event - id - name - updated_at - url - workspace_id title: ActionWithIncludes ActionWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/ActionWithIncludes' required: - data description: Frame.io action details title: ActionWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.customActions.actionsShow("be899171-e87b-4b7c-8613-9f39d6e6b2dc", "8dc385a3-e1a4-49ff-b0a0-afd47090cbda", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.custom_actions.actions_show( account_id="be899171-e87b-4b7c-8613-9f39d6e6b2dc", action_id="8dc385a3-e1a4-49ff-b0a0-afd47090cbda", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/be899171-e87b-4b7c-8613-9f39d6e6b2dc/actions/8dc385a3-e1a4-49ff-b0a0-afd47090cbda")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update custom action PATCH https://api.frame.io/v4/accounts/{account_id}/actions/{action_id} Content-Type: application/json Update custom action details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/custom-actions/actions-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/actions/{action_id}: patch: operationId: actions-update summary: Update custom action description: >- Update custom action details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_customActions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: action_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ActionResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Action params content: application/json: schema: $ref: '#/components/schemas/ActionUpdateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID ActionUpdateParamsData: type: object properties: active: type: boolean description: Active Status description: type: string description: Action description event: type: string description: Event name sent to `url` multi_asset: type: boolean description: Manages action trigger on multiple assets name: type: string description: Action name timeout: type: integer description: Timeout for the action requests in seconds url: type: string description: URL where `event` is sent title: ActionUpdateParamsData ActionUpdateParams: type: object properties: data: $ref: '#/components/schemas/ActionUpdateParamsData' required: - data description: Custom Action update parameters title: ActionUpdateParams Action: type: object properties: active: type: boolean description: Active Status created_at: type: string format: date-time creator_id: type: string format: uuid description: Creator ID deleted_at: type: - string - 'null' format: date-time description: type: string description: Action Description event: type: string description: Event Name id: type: string format: uuid description: Action ID multi_asset: type: boolean description: Manages action trigger on multiple assets name: type: string description: Action Name timeout: type: integer description: Timeout for the action requests in seconds updated_at: type: string format: date-time url: type: string description: Action URL workspace_id: type: string format: uuid description: Workspace ID required: - active - created_at - creator_id - deleted_at - description - event - id - name - updated_at - url - workspace_id title: Action ActionResponse: type: object properties: data: $ref: '#/components/schemas/Action' required: - data description: Action details title: ActionResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.customActions.actionsUpdate("8405902f-7272-43d6-bb51-3dfceced7c94", "dfe2bb3b-581c-4098-9e62-f2784a71542f", { data: { active: true, description: "customizing our workflow", event: "my.event", multiAsset: true, name: "First Custom Action", timeout: 7, url: "https://example.com/custom-action", }, }); } main(); ``` ```python from frameio import Frameio from frameio.custom_actions import ActionUpdateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.custom_actions.actions_update( account_id="8405902f-7272-43d6-bb51-3dfceced7c94", action_id="dfe2bb3b-581c-4098-9e62-f2784a71542f", data=ActionUpdateParamsData( active=True, description="customizing our workflow", event="my.event", multi_asset=True, name="First Custom Action", timeout=7, url="https://example.com/custom-action", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f" payload := strings.NewReader("{\n \"data\": {\n \"active\": true,\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"multi_asset\": true,\n \"name\": \"First Custom Action\",\n \"timeout\": 7,\n \"url\": \"https://example.com/custom-action\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"active\": true,\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"multi_asset\": true,\n \"name\": \"First Custom Action\",\n \"timeout\": 7,\n \"url\": \"https://example.com/custom-action\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"active\": true,\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"multi_asset\": true,\n \"name\": \"First Custom Action\",\n \"timeout\": 7,\n \"url\": \"https://example.com/custom-action\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f', [ 'body' => '{ "data": { "active": true, "description": "customizing our workflow", "event": "my.event", "multi_asset": true, "name": "First Custom Action", "timeout": 7, "url": "https://example.com/custom-action" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"active\": true,\n \"description\": \"customizing our workflow\",\n \"event\": \"my.event\",\n \"multi_asset\": true,\n \"name\": \"First Custom Action\",\n \"timeout\": 7,\n \"url\": \"https://example.com/custom-action\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "active": true, "description": "customizing our workflow", "event": "my.event", "multi_asset": true, "name": "First Custom Action", "timeout": 7, "url": "https://example.com/custom-action" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/8405902f-7272-43d6-bb51-3dfceced7c94/actions/dfe2bb3b-581c-4098-9e62-f2784a71542f")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Copy file POST https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/copy Content-Type: application/json Copy file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/copy ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/copy: post: operationId: copy summary: Copy file description: >- Copy file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: copy_metadata in: query description: Whether to copy metadata values along with the file required: false schema: type: boolean default: false - name: copy_comments in: query description: Which comments to copy along with the file required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFilesFileIdCopyPostParametersCopyComments default: none - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileCopyResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: File params content: application/json: schema: $ref: '#/components/schemas/FileCopyParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFilesFileIdCopyPostParametersCopyComments: type: string enum: - none - internal - public - all default: none title: V4AccountsAccountIdFilesFileIdCopyPostParametersCopyComments FileCopyParamsData: type: object properties: parent_id: type: string description: Destination folder ID. Defaults to file parent ID. title: FileCopyParamsData FileCopyParams: type: object properties: data: $ref: '#/components/schemas/FileCopyParamsData' description: File copy parameters title: FileCopyParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File FileCopyResponse: type: object properties: data: $ref: '#/components/schemas/File' required: - data title: FileCopyResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.copy("2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf", "10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileCopyParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.copy( account_id="2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf", file_id="10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc", data=FileCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/2dfdb8ad-e5e3-4ce1-80ac-7f53baf965bf/files/10dfa1ea-9c3d-4ab0-9f41-52cac7793ebc/copy")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create file POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/files Content-Type: application/json Create new file under parent folder. `Create file (local upload)` and `Create file (remote upload)` have replaced this endpoint.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/files: post: operationId: create summary: Create file description: >- Create new file under parent folder. `Create file (local upload)` and `Create file (remote upload)` have replaced this endpoint.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/FileWithUploadUrlsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FileCreateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileCreateParamsData: type: object properties: file_size: type: integer description: File size in bytes (up to 5TB) media_type: type: string description: |- MIME type, Example: image/gif name: type: string description: File name source_url: type: string description: >- Source URL - Initiates a remote upload from the given URL when present required: - file_size - media_type - name title: FileCreateParamsData FileCreateParams: type: object properties: data: $ref: '#/components/schemas/FileCreateParamsData' required: - data title: FileCreateParams FileWithUploadUrlsStatus: type: string enum: - created - transcoded - uploaded title: FileWithUploadUrlsStatus UploadUrl: type: object properties: size: type: integer description: Upload chunk size url: type: string description: >- S3 presigned URL. Client should make a PUT request to this URL that includes the "x-amz-acl: private" header along with the file or file chunk data. required: - size - url title: UploadUrl FileWithUploadUrls: type: object properties: id: type: string format: uuid description: File ID name: type: string description: File Name adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithUploadUrlsStatus' upload_urls: type: array items: $ref: '#/components/schemas/UploadUrl' description: >- File upload URLs. Number of URLs returned will vary depending on the file size. required: - file_size - media_type - status title: FileWithUploadUrls FileWithUploadUrlsResponse: type: object properties: data: $ref: '#/components/schemas/FileWithUploadUrls' required: - data title: FileWithUploadUrlsResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.create("4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0", "ddd39243-df03-4be9-aa2f-c40425689b23", { data: { fileSize: 1137444, mediaType: "image/png", name: "asset.png", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.create( account_id="4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0", folder_id="ddd39243-df03-4be9-aa2f-c40425689b23", data=FileCreateParamsData( file_size=1137444, media_type="image/png", name="asset.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files" payload := strings.NewReader("{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files', [ 'body' => '{ "data": { "file_size": 1137444, "media_type": "image/png", "name": "asset.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "file_size": 1137444, "media_type": "image/png", "name": "asset.png" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.create("4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0", "ddd39243-df03-4be9-aa2f-c40425689b23", { data: { fileSize: 1137444, mediaType: "image/png", name: "asset.png", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.create( account_id="4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0", folder_id="ddd39243-df03-4be9-aa2f-c40425689b23", data=FileCreateParamsData( file_size=1137444, media_type="image/png", name="asset.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files" payload := strings.NewReader("{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files', [ 'body' => '{ "data": { "file_size": 1137444, "media_type": "image/png", "name": "asset.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_size\": 1137444,\n \"media_type\": \"image/png\",\n \"name\": \"asset.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "file_size": 1137444, "media_type": "image/png", "name": "asset.png" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/4e0ad3a6-5aa8-48ba-bc44-edbdbd4f34d0/folders/ddd39243-df03-4be9-aa2f-c40425689b23/files")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create file (local upload) POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/files/local_upload Content-Type: application/json Create new file under parent folder through local upload.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/create-local-upload ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/files/local_upload: post: operationId: create-local-upload summary: Create file (local upload) description: >- Create new file under parent folder through local upload.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/FileWithUploadUrlsResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FileCreateLocalUploadParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileCreateLocalUploadParamsData: type: object properties: file_size: type: integer description: File size in bytes (up to 5TB) name: type: string description: File name required: - file_size - name title: FileCreateLocalUploadParamsData FileCreateLocalUploadParams: type: object properties: data: $ref: '#/components/schemas/FileCreateLocalUploadParamsData' required: - data title: FileCreateLocalUploadParams FileWithUploadUrlsStatus: type: string enum: - created - transcoded - uploaded title: FileWithUploadUrlsStatus UploadUrl: type: object properties: size: type: integer description: Upload chunk size url: type: string description: >- S3 presigned URL. Client should make a PUT request to this URL that includes the "x-amz-acl: private" header along with the file or file chunk data. required: - size - url title: UploadUrl FileWithUploadUrls: type: object properties: id: type: string format: uuid description: File ID name: type: string description: File Name adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithUploadUrlsStatus' upload_urls: type: array items: $ref: '#/components/schemas/UploadUrl' description: >- File upload URLs. Number of URLs returned will vary depending on the file size. required: - file_size - media_type - status title: FileWithUploadUrls FileWithUploadUrlsResponse: type: object properties: data: $ref: '#/components/schemas/FileWithUploadUrls' required: - data title: FileWithUploadUrlsResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.createLocalUpload("81b541b0-bfff-4b1e-97d3-f36750736b31", "7b7139aa-8a27-4acd-880d-dda69e5ee9c8", { data: { fileSize: 1137444, name: "asset.png", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileCreateLocalUploadParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.create_local_upload( account_id="81b541b0-bfff-4b1e-97d3-f36750736b31", folder_id="7b7139aa-8a27-4acd-880d-dda69e5ee9c8", data=FileCreateLocalUploadParamsData( file_size=1137444, name="asset.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload" payload := strings.NewReader("{\n \"data\": {\n \"file_size\": 1137444,\n \"name\": \"asset.png\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_size\": 1137444,\n \"name\": \"asset.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_size\": 1137444,\n \"name\": \"asset.png\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload', [ 'body' => '{ "data": { "file_size": 1137444, "name": "asset.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_size\": 1137444,\n \"name\": \"asset.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "file_size": 1137444, "name": "asset.png" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/81b541b0-bfff-4b1e-97d3-f36750736b31/folders/7b7139aa-8a27-4acd-880d-dda69e5ee9c8/files/local_upload")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create file (remote upload) POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/files/remote_upload Content-Type: application/json Create new file under parent folder through remote upload.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/create-remote-upload ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/files/remote_upload: post: operationId: create-remote-upload summary: Create file (remote upload) description: >- Create new file under parent folder through remote upload.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '202': description: Accepted content: application/json: schema: $ref: '#/components/schemas/FileRemoteUploadResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FileCreateRemoteUploadParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileCreateRemoteUploadParamsData: type: object properties: name: type: string description: File name source_url: type: string description: Source URL - Initiates a remote upload from the provided URL required: - name - source_url title: FileCreateRemoteUploadParamsData FileCreateRemoteUploadParams: type: object properties: data: $ref: '#/components/schemas/FileCreateRemoteUploadParamsData' required: - data title: FileCreateRemoteUploadParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File FileRemoteUploadResponseLinks: type: object properties: {} description: Link to asset operation status title: FileRemoteUploadResponseLinks FileRemoteUploadResponse: type: object properties: data: $ref: '#/components/schemas/File' links: $ref: '#/components/schemas/FileRemoteUploadResponseLinks' description: Link to asset operation status required: - data - links title: FileRemoteUploadResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.createRemoteUpload("9075f200-69d0-4e9a-b154-76d4abe64cc4", "4f11c5e5-d713-4a94-8dc5-36df2fb02371", { data: { name: "asset.png", sourceUrl: "https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileCreateRemoteUploadParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.create_remote_upload( account_id="9075f200-69d0-4e9a-b154-76d4abe64cc4", folder_id="4f11c5e5-d713-4a94-8dc5-36df2fb02371", data=FileCreateRemoteUploadParamsData( name="asset.png", source_url="https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"asset.png\",\n \"source_url\": \"https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"asset.png\",\n \"source_url\": \"https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"asset.png\",\n \"source_url\": \"https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload', [ 'body' => '{ "data": { "name": "asset.png", "source_url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"asset.png\",\n \"source_url\": \"https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "name": "asset.png", "source_url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/9075f200-69d0-4e9a-b154-76d4abe64cc4/folders/4f11c5e5-d713-4a94-8dc5-36df2fb02371/files/remote_upload")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete file DELETE https://api.frame.io/v4/accounts/{account_id}/files/{file_id} Delete file by ID.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}: delete: operationId: delete summary: Delete file description: >- Delete file by ID.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.delete("ee6a3aca-4087-473b-8e05-ed92ad88398d", "794bf0bf-1f12-449d-a912-41f9d5a33223"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.delete( account_id="ee6a3aca-4087-473b-8e05-ed92ad88398d", file_id="794bf0bf-1f12-449d-a912-41f9d5a33223", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/ee6a3aca-4087-473b-8e05-ed92ad88398d/files/794bf0bf-1f12-449d-a912-41f9d5a33223")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Import file POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/files/import Content-Type: application/json Import a file from a storage location configured on the account.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/import-file ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/files/import: post: operationId: import-file summary: Import file description: >- Import a file from a storage location configured on the account.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '202': description: Accepted content: application/json: schema: $ref: '#/components/schemas/FileResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FileImportParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileImportParamsData: type: object properties: key: type: string description: File key/path within the filespace name: type: string description: File name storage_location: type: string description: >- Storage location with account UUID as the value or prefix. Applies to accounts with Storage Connect required: - key - name - storage_location title: FileImportParamsData FileImportParams: type: object properties: data: $ref: '#/components/schemas/FileImportParamsData' required: - data title: FileImportParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File FileResponse: type: object properties: data: $ref: '#/components/schemas/File' required: - data title: FileResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.importFile("bc8d579f-ab35-475f-9ef9-2e6f319e7c89", "883bf2cf-e56d-482a-b765-40d68af90823", { data: { key: "uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png", name: "asset.png", storageLocation: "123e4567-e89b-12d3-a456-426614174000", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileImportParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.import_file( account_id="bc8d579f-ab35-475f-9ef9-2e6f319e7c89", folder_id="883bf2cf-e56d-482a-b765-40d68af90823", data=FileImportParamsData( key="uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png", name="asset.png", storage_location="123e4567-e89b-12d3-a456-426614174000", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import" payload := strings.NewReader("{\n \"data\": {\n \"key\": \"uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png\",\n \"name\": \"asset.png\",\n \"storage_location\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"key\": \"uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png\",\n \"name\": \"asset.png\",\n \"storage_location\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"key\": \"uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png\",\n \"name\": \"asset.png\",\n \"storage_location\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import', [ 'body' => '{ "data": { "key": "uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png", "name": "asset.png", "storage_location": "123e4567-e89b-12d3-a456-426614174000" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"key\": \"uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png\",\n \"name\": \"asset.png\",\n \"storage_location\": \"123e4567-e89b-12d3-a456-426614174000\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "key": "uploads/08091b0f-a541-42f5-a059-5e8c4afecc12/original.png", "name": "asset.png", "storage_location": "123e4567-e89b-12d3-a456-426614174000" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/bc8d579f-ab35-475f-9ef9-2e6f319e7c89/folders/883bf2cf-e56d-482a-b765-40d68af90823/files/import")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List files GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/files List files in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/list ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/files: get: operationId: list summary: List files description: >- List files in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdFilesGetParametersInclude - name: sort in: query description: Sort files by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdFilesGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileAssetsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFoldersFolderIdFilesGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: V4AccountsAccountIdFoldersFolderIdFilesGetParametersInclude V4AccountsAccountIdFoldersFolderIdFilesGetParametersSort: type: string enum: - name_asc - created_at_asc - updated_at_asc - file_size_asc - name_desc - created_at_desc - updated_at_desc - file_size_desc description: Sort by query parameter for files title: V4AccountsAccountIdFoldersFolderIdFilesGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FolderWithIncludesType: type: string enum: - file - folder - version_stack title: FolderWithIncludesType FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType AssetWithIncludes: oneOf: - type: object properties: type: $ref: '#/components/schemas/AssetCommonWithIncludesType' adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - type - created_at - id - name - parent_id - project_id - updated_at - view_url - file_size - media_type - status description: FileWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/FolderWithIncludesType' cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - cover_file_id - id - name - parent_id - created_at - project_id - updated_at - view_url description: FolderWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/VersionStackWithIncludesType' head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - head_version - id - name - parent_id - created_at - project_id - updated_at - view_url description: VersionStackWithIncludes variant discriminator: propertyName: type title: AssetWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links FileAssetsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/AssetWithIncludes' description: Assets links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: FileAssetsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.list("fa5642fa-6ceb-4036-8385-a361207074cf", "cfc1b463-4479-4eae-8576-2c917ecf56a3", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.list( account_id="fa5642fa-6ceb-4036-8385-a361207074cf", folder_id="cfc1b463-4479-4eae-8576-2c917ecf56a3", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/fa5642fa-6ceb-4036-8385-a361207074cf/folders/cfc1b463-4479-4eae-8576-2c917ecf56a3/files")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Move file PATCH https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/move Content-Type: application/json Move file to a folder or version_stack.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/move ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/move: patch: operationId: move summary: Move file description: >- Move file to a folder or version_stack.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FileMoveParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileMoveParamsData: type: object properties: parent_id: type: string description: Destination folder or version stack ID title: FileMoveParamsData FileMoveParams: type: object properties: data: $ref: '#/components/schemas/FileMoveParamsData' required: - data description: File move parameters title: FileMoveParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File FileResponse: type: object properties: data: $ref: '#/components/schemas/File' required: - data title: FileResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.move("8ef38964-fd4f-4535-abad-d3b5cb1c938f", "d7837fc1-5fec-4add-a517-be5de1767a29", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileMoveParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.move( account_id="8ef38964-fd4f-4535-abad-d3b5cb1c938f", file_id="d7837fc1-5fec-4add-a517-be5de1767a29", data=FileMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/8ef38964-fd4f-4535-abad-d3b5cb1c938f/files/d7837fc1-5fec-4add-a517-be5de1767a29/move")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show file GET https://api.frame.io/v4/accounts/{account_id}/files/{file_id} Show file details.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download the file then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't completed (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 10 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}: get: operationId: show summary: Show file description: > Show file details.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download the file then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't completed (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 10 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFilesFileIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFilesFileIdGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: V4AccountsAccountIdFilesFileIdGetParametersInclude User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes FileWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/FileWithIncludes' required: - data title: FileWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.show("1c762dba-d767-48b5-8ef4-445018a6b933", "6ea6d0bb-65cd-4b73-b3d0-84efac5c3625", { include: "media_links.original", }); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.show( account_id="1c762dba-d767-48b5-8ef4-445018a6b933", file_id="6ea6d0bb-65cd-4b73-b3d0-84efac5c3625", include="media_links.original", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/1c762dba-d767-48b5-8ef4-445018a6b933/files/6ea6d0bb-65cd-4b73-b3d0-84efac5c3625?include=media_links.original")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show file upload status GET https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/status Show file upload status details.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/show-file-upload-status ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/status: get: operationId: show-file-upload-status summary: Show file upload status description: >- Show file upload status details.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileUploadStatusResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileUploadStatus: type: object properties: filetype: type: string description: File type id: type: string format: uuid description: File ID upload_complete: type: boolean description: Indicates if upload is complete upload_completed_at: type: - string - 'null' format: date-time description: Timestamp when the asset was successfully uploaded upload_failed: type: boolean description: Indicates if upload failed uploaded_at: type: - string - 'null' format: date-time description: Timestamp when the operation started required: - filetype - id - upload_complete - upload_completed_at - upload_failed - uploaded_at title: FileUploadStatus FileUploadStatusResponse: type: object properties: data: $ref: '#/components/schemas/FileUploadStatus' required: - data title: FileUploadStatusResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.showFileUploadStatus("37321356-57d7-4d82-986a-bafd1a76b0d5", "e0c62722-2835-485c-8460-a823b7c36eb7"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.show_file_upload_status( account_id="37321356-57d7-4d82-986a-bafd1a76b0d5", file_id="e0c62722-2835-485c-8460-a823b7c36eb7", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/37321356-57d7-4d82-986a-bafd1a76b0d5/files/e0c62722-2835-485c-8460-a823b7c36eb7/status")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update file PATCH https://api.frame.io/v4/accounts/{account_id}/files/{file_id} Content-Type: application/json Update file details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/files/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}: patch: operationId: update summary: Update file description: >- Update file details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_files parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FileResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: File params content: application/json: schema: $ref: '#/components/schemas/FileUpdateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FileUpdateParamsData: type: object properties: name: type: string description: File name title: FileUpdateParamsData FileUpdateParams: type: object properties: data: $ref: '#/components/schemas/FileUpdateParamsData' required: - data description: File update parameters title: FileUpdateParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File FileResponse: type: object properties: data: $ref: '#/components/schemas/File' required: - data title: FileResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.files.update("337306a3-50a1-4713-852c-34166b2b21a3", "e8578b53-c829-430d-9e15-360fbc91a56f", { data: { name: "asset.png", }, }); } main(); ``` ```python from frameio import Frameio from frameio.files import FileUpdateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.files.update( account_id="337306a3-50a1-4713-852c-34166b2b21a3", file_id="e8578b53-c829-430d-9e15-360fbc91a56f", data=FileUpdateParamsData( name="asset.png", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"asset.png\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"asset.png\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"asset.png\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f', [ 'body' => '{ "data": { "name": "asset.png" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"asset.png\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["name": "asset.png"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/337306a3-50a1-4713-852c-34166b2b21a3/files/e8578b53-c829-430d-9e15-360fbc91a56f")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List folder user roles GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/users List user roles for a given folder.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folder-permissions/folder-user-roles-index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/users: get: operationId: folder-user-roles-index summary: List folder user roles description: >- List user roles for a given folder.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_folderPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include_deactivated in: query description: >- Supports including deactivated users in the response. Default is false. required: false schema: type: boolean - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount UserRoleRole: type: string enum: - workspace_admin - full_access - editor - edit_only - commenter - viewer - admin - owner title: UserRoleRole User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User UserRole: type: object properties: role: $ref: '#/components/schemas/UserRoleRole' user: $ref: '#/components/schemas/User' required: - role - user description: Frame.io User Role title: UserRole Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links UserRolesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/UserRole' description: User Roles links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io user role details title: UserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folderPermissions.folderUserRolesIndex("3ebff3ab-f3ef-4640-8e28-70719712cd9c", "a2a51974-9a31-4159-99c6-91b37687847c", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folder_permissions.folder_user_roles_index( account_id="3ebff3ab-f3ef-4640-8e28-70719712cd9c", folder_id="a2a51974-9a31-4159-99c6-91b37687847c", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3ebff3ab-f3ef-4640-8e28-70719712cd9c/folders/a2a51974-9a31-4159-99c6-91b37687847c/users")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Remove a user from a given folder DELETE https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/users/{user_id} Remove a user from a given folder.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folder-permissions/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/users/{user_id}: delete: operationId: delete summary: Remove a user from a given folder description: >- Remove a user from a given folder.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_folderPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folderPermissions.delete("7ab8c702-6c7e-4a4c-bc93-49d536506e5b", "1c11901b-6220-4abe-bedf-034774c9284c", "25ad2fa9-05d7-46c8-902d-3e7b70c94a2e"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folder_permissions.delete( account_id="7ab8c702-6c7e-4a4c-bc93-49d536506e5b", folder_id="1c11901b-6220-4abe-bedf-034774c9284c", user_id="25ad2fa9-05d7-46c8-902d-3e7b70c94a2e", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/7ab8c702-6c7e-4a4c-bc93-49d536506e5b/folders/1c11901b-6220-4abe-bedf-034774c9284c/users/25ad2fa9-05d7-46c8-902d-3e7b70c94a2e")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update user roles for the given folder PATCH https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/users/{user_id} Content-Type: application/json Update user roles for the given folder if the user is already added to the folder. If the user is not added to the folder, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folder-permissions/folder-user-roles-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/users/{user_id}: patch: operationId: folder-user-roles-update summary: Update user roles for the given folder description: >- Update user roles for the given folder if the user is already added to the folder. If the user is not added to the folder, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_folderPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpdateUserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Update user roles params body content: application/json: schema: $ref: '#/components/schemas/UpdateUserRolesParams' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID UpdateUserRolesParamsDataRole: type: string enum: - full_access - editor - edit_only - commenter - viewer title: UpdateUserRolesParamsDataRole UpdateUserRolesParamsData: type: object properties: role: $ref: '#/components/schemas/UpdateUserRolesParamsDataRole' required: - role title: UpdateUserRolesParamsData UpdateUserRolesParams: type: object properties: data: $ref: '#/components/schemas/UpdateUserRolesParamsData' required: - data description: Update user roles params title: UpdateUserRolesParams UpdateUserRolesResponseDataRole: type: string enum: - full_access - editor - edit_only - commenter - viewer title: UpdateUserRolesResponseDataRole UpdateUserRolesResponseData: type: object properties: role: $ref: '#/components/schemas/UpdateUserRolesResponseDataRole' title: UpdateUserRolesResponseData UpdateUserRolesResponse: type: object properties: data: $ref: '#/components/schemas/UpdateUserRolesResponseData' required: - data title: UpdateUserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folderPermissions.folderUserRolesUpdate("8b8d2ad9-8279-4a10-bb78-996ce51d680b", "ed4316b2-8a48-46d8-8f2d-cb4c6aca2975", "e1630b2e-e119-4c08-9f64-3e69203997d4", { data: { role: "editor", }, }); } main(); ``` ```python from frameio import Frameio, UpdateUserRolesParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folder_permissions.folder_user_roles_update( account_id="8b8d2ad9-8279-4a10-bb78-996ce51d680b", folder_id="ed4316b2-8a48-46d8-8f2d-cb4c6aca2975", user_id="e1630b2e-e119-4c08-9f64-3e69203997d4", data=UpdateUserRolesParamsData( role="editor", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4" payload := strings.NewReader("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"role\": \"editor\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4', [ 'body' => '{ "data": { "role": "editor" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"role\": \"editor\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["role": "editor"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/8b8d2ad9-8279-4a10-bb78-996ce51d680b/folders/ed4316b2-8a48-46d8-8f2d-cb4c6aca2975/users/e1630b2e-e119-4c08-9f64-3e69203997d4")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Copy folder POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/copy Content-Type: application/json Copy folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/copy ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/copy: post: operationId: copy summary: Copy folder description: >- Copy folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: copy_metadata in: query description: Whether to copy metadata values along with the folder required: false schema: type: boolean default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FolderCopyResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Folder params content: application/json: schema: $ref: '#/components/schemas/FolderCopyParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FolderCopyParamsData: type: object properties: parent_id: type: string description: Destination folder ID. Defaults to folder parent ID. title: FolderCopyParamsData FolderCopyParams: type: object properties: data: $ref: '#/components/schemas/FolderCopyParamsData' description: Folder copy parameters title: FolderCopyParams FolderType: type: string enum: - file - folder - version_stack title: FolderType Folder: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - cover_file_id title: Folder FolderCopyResponse: type: object properties: data: $ref: '#/components/schemas/Folder' required: - data title: FolderCopyResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.copy("53f18786-1355-4b66-b7be-950dc22875ae", "8efad1a0-d879-4c86-be9f-57f20dc61fab", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.folders import FolderCopyParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.copy( account_id="53f18786-1355-4b66-b7be-950dc22875ae", folder_id="8efad1a0-d879-4c86-be9f-57f20dc61fab", data=FolderCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.copy("53f18786-1355-4b66-b7be-950dc22875ae", "8efad1a0-d879-4c86-be9f-57f20dc61fab", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.folders import FolderCopyParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.copy( account_id="53f18786-1355-4b66-b7be-950dc22875ae", folder_id="8efad1a0-d879-4c86-be9f-57f20dc61fab", data=FolderCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/53f18786-1355-4b66-b7be-950dc22875ae/folders/8efad1a0-d879-4c86-be9f-57f20dc61fab/copy")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create folder POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/folders Content-Type: application/json Create a new folder inside the given folder_id path param.
Rate Limits: 3 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/folders: post: operationId: create summary: Create folder description: >- Create a new folder inside the given folder_id path param.
Rate Limits: 3 calls per 1 second(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/FolderResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FolderCreateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FolderCreateParamsData: type: object properties: name: type: string description: Folder name title: FolderCreateParamsData FolderCreateParams: type: object properties: data: $ref: '#/components/schemas/FolderCreateParamsData' required: - data description: Folder creation parameters title: FolderCreateParams FolderType: type: string enum: - file - folder - version_stack title: FolderType Folder: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - cover_file_id title: Folder FolderResponse: type: object properties: data: $ref: '#/components/schemas/Folder' required: - data title: FolderResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.create("34884eb6-0611-4406-8813-7f7b77d4d73e", "ef332174-9c33-418a-b0e6-17d1b5736106", { data: { name: "Folder name", }, }); } main(); ``` ```python from frameio import Frameio from frameio.folders import FolderCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.create( account_id="34884eb6-0611-4406-8813-7f7b77d4d73e", folder_id="ef332174-9c33-418a-b0e6-17d1b5736106", data=FolderCreateParamsData( name="Folder name", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders', [ 'body' => '{ "data": { "name": "Folder name" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["name": "Folder name"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/34884eb6-0611-4406-8813-7f7b77d4d73e/folders/ef332174-9c33-418a-b0e6-17d1b5736106/folders")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete folder DELETE https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id} Delete folder by id.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}: delete: operationId: delete summary: Delete folder description: >- Delete folder by id.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.delete("ff228d59-4985-4e26-882d-384774a34e80", "d99a219d-79ef-4adc-a4ef-ae0337e5da63"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.delete( account_id="ff228d59-4985-4e26-882d-384774a34e80", folder_id="d99a219d-79ef-4adc-a4ef-ae0337e5da63", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/ff228d59-4985-4e26-882d-384774a34e80/folders/d99a219d-79ef-4adc-a4ef-ae0337e5da63")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List folder children GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/children List the children in the given folder.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/children: get: operationId: index summary: List folder children description: > List the children in the given folder.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdChildrenGetParametersInclude - name: type in: query description: '' required: false schema: $ref: '#/components/schemas/ChildrenType' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FolderAssetsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFoldersFolderIdChildrenGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: V4AccountsAccountIdFoldersFolderIdChildrenGetParametersInclude ChildrenType: type: string description: Type filter for folder children title: ChildrenType RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FolderWithIncludesType: type: string enum: - file - folder - version_stack title: FolderWithIncludesType FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType AssetWithIncludes: oneOf: - type: object properties: type: $ref: '#/components/schemas/AssetCommonWithIncludesType' adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - type - created_at - id - name - parent_id - project_id - updated_at - view_url - file_size - media_type - status description: FileWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/FolderWithIncludesType' cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - cover_file_id - id - name - parent_id - created_at - project_id - updated_at - view_url description: FolderWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/VersionStackWithIncludesType' head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - head_version - id - name - parent_id - created_at - project_id - updated_at - view_url description: VersionStackWithIncludes variant discriminator: propertyName: type title: AssetWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links FolderAssetsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/AssetWithIncludes' description: Assets links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: FolderAssetsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.index("d990eb1b-3170-48b0-ae11-6f721b96b198", "0e1b1b3e-7493-455a-b5c9-09b56137e410", { include: "media_links.original", }); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.index( account_id="d990eb1b-3170-48b0-ae11-6f721b96b198", folder_id="0e1b1b3e-7493-455a-b5c9-09b56137e410", include="media_links.original", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/d990eb1b-3170-48b0-ae11-6f721b96b198/folders/0e1b1b3e-7493-455a-b5c9-09b56137e410/children?include=media_links.original")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List folders GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/folders List folders in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/list ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/folders: get: operationId: list summary: List folders description: >- List folders in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdFoldersGetParametersInclude - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FoldersWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFoldersFolderIdFoldersGetParametersInclude: type: string enum: - creator - project - metadata description: Include query parameter for assets title: V4AccountsAccountIdFoldersFolderIdFoldersGetParametersInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes FolderWithIncludesType: type: string enum: - file - folder - version_stack title: FolderWithIncludesType FolderWithIncludes: type: object properties: cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - cover_file_id - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: FolderWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links FoldersWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/FolderWithIncludes' description: Folders links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: FoldersWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.list("7402205f-fba6-4486-96c3-311b77f02cbb", "771a44a2-734d-4c71-800e-303c5d13c4d7", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.list( account_id="7402205f-fba6-4486-96c3-311b77f02cbb", folder_id="771a44a2-734d-4c71-800e-303c5d13c4d7", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/7402205f-fba6-4486-96c3-311b77f02cbb/folders/771a44a2-734d-4c71-800e-303c5d13c4d7/folders")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Move folder PATCH https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/move Content-Type: application/json Move folder to a folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/move ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/move: patch: operationId: move summary: Move folder description: >- Move folder to a folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FolderResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/FolderMoveParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FolderMoveParamsData: type: object properties: parent_id: type: string description: Destination folder ID title: FolderMoveParamsData FolderMoveParams: type: object properties: data: $ref: '#/components/schemas/FolderMoveParamsData' required: - data description: Folder move parameters title: FolderMoveParams FolderType: type: string enum: - file - folder - version_stack title: FolderType Folder: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - cover_file_id title: Folder FolderResponse: type: object properties: data: $ref: '#/components/schemas/Folder' required: - data title: FolderResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.move("551d3cef-e9f1-4a0b-a7c6-c8f305b53b69", "e9d9e03a-8b2b-443a-80c4-449c0620f0cd", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.folders import FolderMoveParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.move( account_id="551d3cef-e9f1-4a0b-a7c6-c8f305b53b69", folder_id="e9d9e03a-8b2b-443a-80c4-449c0620f0cd", data=FolderMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/551d3cef-e9f1-4a0b-a7c6-c8f305b53b69/folders/e9d9e03a-8b2b-443a-80c4-449c0620f0cd/move")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show folder GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id} Show folder details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}: get: operationId: show summary: Show folder description: >- Show folder details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FolderWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFoldersFolderIdGetParametersInclude: type: string enum: - creator - project - metadata description: Include query parameter for assets title: V4AccountsAccountIdFoldersFolderIdGetParametersInclude User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes FolderWithIncludesType: type: string enum: - file - folder - version_stack title: FolderWithIncludesType FolderWithIncludes: type: object properties: cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - cover_file_id - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: FolderWithIncludes FolderWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/FolderWithIncludes' required: - data title: FolderWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.show("589d6e53-a575-4654-adbe-da8115863631", "ce17bd2f-ef59-4ac9-9f31-85043023c06e", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.show( account_id="589d6e53-a575-4654-adbe-da8115863631", folder_id="ce17bd2f-ef59-4ac9-9f31-85043023c06e", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/589d6e53-a575-4654-adbe-da8115863631/folders/ce17bd2f-ef59-4ac9-9f31-85043023c06e")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update folder PATCH https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id} Content-Type: application/json Update folder details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/folders/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}: patch: operationId: update summary: Update folder description: >- Update folder details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_folders parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FolderResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Folder update params body content: application/json: schema: $ref: '#/components/schemas/FolderUpdateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FolderUpdateParamsData: type: object properties: name: type: string description: Folder name title: FolderUpdateParamsData FolderUpdateParams: type: object properties: data: $ref: '#/components/schemas/FolderUpdateParamsData' required: - data description: Folder update parameters title: FolderUpdateParams FolderType: type: string enum: - file - folder - version_stack title: FolderType Folder: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FolderType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - cover_file_id title: Folder FolderResponse: type: object properties: data: $ref: '#/components/schemas/Folder' required: - data title: FolderResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.folders.update("2ca8b8a8-838f-43df-93f8-dc2b0fc90f86", "0c4fa32f-4740-48e4-96ba-38bb01de7f6d", { data: { name: "Folder name", }, }); } main(); ``` ```python from frameio import Frameio from frameio.folders import FolderUpdateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.folders.update( account_id="2ca8b8a8-838f-43df-93f8-dc2b0fc90f86", folder_id="0c4fa32f-4740-48e4-96ba-38bb01de7f6d", data=FolderUpdateParamsData( name="Folder name", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d', [ 'body' => '{ "data": { "name": "Folder name" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"Folder name\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["name": "Folder name"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/2ca8b8a8-838f-43df-93f8-dc2b0fc90f86/folders/0c4fa32f-4740-48e4-96ba-38bb01de7f6d")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create group POST https://api.frame.io/v4/accounts/{account_id}/groups Content-Type: application/json Create group for the current account.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/groups/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/groups: post: operationId: create summary: Create group description: >- Create group for the current account.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_groups parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/GroupResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Group params body content: application/json: schema: $ref: '#/components/schemas/CreateGroupParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId CreateGroupParamsData: type: object properties: emoji: type: string description: Group emoji for UI display name: type: string description: Group name required: - emoji - name title: CreateGroupParamsData CreateGroupParams: type: object properties: data: $ref: '#/components/schemas/CreateGroupParamsData' required: - data description: Frame.io create group params title: CreateGroupParams GroupCommonSource: type: string enum: - frame - adobe - workfront description: Group source title: GroupCommonSource GroupCommon: type: object properties: created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name source: $ref: '#/components/schemas/GroupCommonSource' description: Group source updated_at: type: string format: date-time description: Update timestamp required: - created_at - creator_id - emoji - id - member_count - name - source - updated_at title: GroupCommon GroupResponse: type: object properties: data: $ref: '#/components/schemas/GroupCommon' required: - data title: GroupResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.groups.create("b9d415d9-c738-45ed-bce3-8f5fd9987f6f", { data: { emoji: "smile", name: "group-1", }, }); } main(); ``` ```python from frameio import Frameio from frameio.groups import CreateGroupParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.groups.create( account_id="b9d415d9-c738-45ed-bce3-8f5fd9987f6f", data=CreateGroupParamsData( emoji="smile", name="group-1", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups" payload := strings.NewReader("{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups', [ 'body' => '{ "data": { "emoji": "smile", "name": "group-1" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "emoji": "smile", "name": "group-1" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/b9d415d9-c738-45ed-bce3-8f5fd9987f6f/groups")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List groups GET https://api.frame.io/v4/accounts/{account_id}/groups List groups in account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/groups/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/groups: get: operationId: index summary: List groups description: >- List groups in account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_groups parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: '#/components/schemas/V4AccountsAccountIdGroupsGetParametersInclude' - name: sort in: query description: Sort groups by query params required: false schema: $ref: '#/components/schemas/V4AccountsAccountIdGroupsGetParametersSort' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/GroupsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdGroupsGetParametersInclude: type: string enum: - creator description: Include query parameter for groups title: V4AccountsAccountIdGroupsGetParametersInclude V4AccountsAccountIdGroupsGetParametersSort: type: string enum: - creator_asc - creator_desc - name_asc - name_desc - created_at_asc - created_at_desc description: Sort query parameter for Groups. title: V4AccountsAccountIdGroupsGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount GroupCommonWithIncludesSource: type: string enum: - frame - adobe - workfront description: Group source title: GroupCommonWithIncludesSource User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User SyncGroupWithIncludesSyncStatus: type: string enum: - not_started - in_progress - completed - error description: Imported group sync status title: SyncGroupWithIncludesSyncStatus GroupWithIncludes: oneOf: - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' sync_status: $ref: '#/components/schemas/SyncGroupWithIncludesSyncStatus' description: Imported group sync status required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at - sync_status description: SyncGroupWithIncludes variant - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at description: GroupCommonWithIncludes variant - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at description: GroupCommonWithIncludes variant discriminator: propertyName: source title: GroupWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links GroupsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/GroupWithIncludes' description: Groups links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: GroupsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.groups.index("b46ad7aa-8f9b-4e4b-97cd-6c40076638a2", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.groups.index( account_id="b46ad7aa-8f9b-4e4b-97cd-6c40076638a2", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/b46ad7aa-8f9b-4e4b-97cd-6c40076638a2/groups")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show group GET https://api.frame.io/v4/accounts/{account_id}/groups/{group_id} Show group details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/groups/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/groups/{group_id}: get: operationId: show summary: Show group description: >- Show group details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_groups parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: group_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdGroupsGroupIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/GroupWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdGroupsGroupIdGetParametersInclude: type: string enum: - creator description: Include query parameter for groups title: V4AccountsAccountIdGroupsGroupIdGetParametersInclude GroupCommonWithIncludesSource: type: string enum: - frame - adobe - workfront description: Group source title: GroupCommonWithIncludesSource User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User SyncGroupWithIncludesSyncStatus: type: string enum: - not_started - in_progress - completed - error description: Imported group sync status title: SyncGroupWithIncludesSyncStatus GroupWithIncludes: oneOf: - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' sync_status: $ref: '#/components/schemas/SyncGroupWithIncludesSyncStatus' description: Imported group sync status required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at - sync_status description: SyncGroupWithIncludes variant - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at description: GroupCommonWithIncludes variant - type: object properties: source: $ref: '#/components/schemas/GroupCommonWithIncludesSource' description: Group source created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name updated_at: type: string format: date-time description: Update timestamp creator: $ref: '#/components/schemas/User' required: - source - created_at - creator_id - emoji - id - member_count - name - updated_at description: GroupCommonWithIncludes variant discriminator: propertyName: source title: GroupWithIncludes GroupWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/GroupWithIncludes' required: - data title: GroupWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.groups.show("6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23", "ef3c409b-4677-41de-b40b-41683f1c4b16", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.groups.show( account_id="6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23", group_id="ef3c409b-4677-41de-b40b-41683f1c4b16", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/6ded4f88-38cd-4b48-b9d2-2b9cf1bc0c23/groups/ef3c409b-4677-41de-b40b-41683f1c4b16")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update group PATCH https://api.frame.io/v4/accounts/{account_id}/groups/{group_id} Content-Type: application/json Update group details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/groups/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/groups/{group_id}: patch: operationId: update summary: Update group description: >- Update group details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_groups parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: group_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/GroupResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Group params content: application/json: schema: $ref: '#/components/schemas/UpdateGroupParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID UpdateGroupParamsData: type: object properties: emoji: type: string description: Group emoji for UI display name: type: string description: Group name title: UpdateGroupParamsData UpdateGroupParams: type: object properties: data: $ref: '#/components/schemas/UpdateGroupParamsData' required: - data description: Frame.io update group params title: UpdateGroupParams GroupCommonSource: type: string enum: - frame - adobe - workfront description: Group source title: GroupCommonSource GroupCommon: type: object properties: created_at: type: string format: date-time description: Creation timestamp creator_id: type: - string - 'null' format: uuid description: ID of group creator emoji: type: string description: Group emoji for UI display id: type: string format: uuid description: Group ID member_count: type: integer description: Number of members in group name: type: string description: Group name source: $ref: '#/components/schemas/GroupCommonSource' description: Group source updated_at: type: string format: date-time description: Update timestamp required: - created_at - creator_id - emoji - id - member_count - name - source - updated_at title: GroupCommon GroupResponse: type: object properties: data: $ref: '#/components/schemas/GroupCommon' required: - data title: GroupResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.groups.update("951e9160-f405-42cc-bd6d-e463730da82c", "48901321-6530-49ea-9150-ba6752310803", { data: { emoji: "smile", name: "group-1", }, }); } main(); ``` ```python from frameio import Frameio from frameio.groups import UpdateGroupParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.groups.update( account_id="951e9160-f405-42cc-bd6d-e463730da82c", group_id="48901321-6530-49ea-9150-ba6752310803", data=UpdateGroupParamsData( emoji="smile", name="group-1", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803" payload := strings.NewReader("{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803', [ 'body' => '{ "data": { "emoji": "smile", "name": "group-1" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"emoji\": \"smile\",\n \"name\": \"group-1\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "emoji": "smile", "name": "group-1" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/951e9160-f405-42cc-bd6d-e463730da82c/groups/48901321-6530-49ea-9150-ba6752310803")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show metadata GET https://api.frame.io/v4/accounts/{account_id}/files/{file_id}/metadata Show the metadata of a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/files/{file_id}/metadata: get: operationId: show summary: Show metadata description: >- Show the metadata of a file.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_metadata parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: file_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: show_null in: query description: '' required: false schema: type: boolean - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MetadataResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField MetadataWithDefinition: type: object properties: file_id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: Metadata fields values required: - file_id - metadata title: MetadataWithDefinition MetadataResponse: type: object properties: data: $ref: '#/components/schemas/MetadataWithDefinition' required: - data title: MetadataResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadata.show("dfddae82-299f-452c-917c-091e5a736804", "7b026c06-17d3-4f9c-b3d8-65202e1ac885", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata.show( account_id="dfddae82-299f-452c-917c-091e5a736804", file_id="7b026c06-17d3-4f9c-b3d8-65202e1ac885", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/dfddae82-299f-452c-917c-091e5a736804/files/7b026c06-17d3-4f9c-b3d8-65202e1ac885/metadata")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update metadata across multiple files PATCH https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/metadata/values Content-Type: application/json Update metadata values across multiple files.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata/bulk-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/metadata/values: patch: operationId: bulk-update summary: Update metadata across multiple files description: >- Update metadata values across multiple files.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_metadata parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/BulkUpdateMetadataParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId BulkUpdateMetadataParamsDataValuesItems: type: object properties: field_definition_id: type: string format: uuid value: description: Any type required: - field_definition_id - value title: BulkUpdateMetadataParamsDataValuesItems BulkUpdateMetadataParamsData: type: object properties: file_ids: type: array items: $ref: '#/components/schemas/FrameOrAdobeId' description: Files for bulk updates values: type: array items: $ref: '#/components/schemas/BulkUpdateMetadataParamsDataValuesItems' description: >- Metadata field and value mapping params. Note: Select and MultiSelect field values should be passed as lists, eg: []. Users and MultiUser values should be passed as lists formatted as follows: [{id: , type: "user"}, {id: , type: "account_user_group"} required: - file_ids - values title: BulkUpdateMetadataParamsData BulkUpdateMetadataParams: type: object properties: data: $ref: '#/components/schemas/BulkUpdateMetadataParamsData' required: - data title: BulkUpdateMetadataParams BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadata.bulkUpdate("3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9", "d1d079e8-accb-4784-80da-2e673233a5ac", { data: { fileIds: [ "232dac9f-e53a-4e91-a73c-a8c8096e9df2", "ae72f3a3-2838-4a9c-85c3-9c46cf62cf71", ], values: [ { fieldDefinitionId: "cd4e5573-eabd-4ade-a238-676acefe6d05", value: [ { id: "39433bee-7715-4705-b03d-79ca1661b02f", type: "user", }, { id: "ec82df64-a097-4635-8e45-ae23d5eaec93", type: "account_user_group", }, ], }, ], }, }); } main(); ``` ```python from frameio import Frameio from frameio.metadata import BulkUpdateMetadataParamsData, BulkUpdateMetadataParamsDataValuesItem client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata.bulk_update( account_id="3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9", project_id="d1d079e8-accb-4784-80da-2e673233a5ac", data=BulkUpdateMetadataParamsData( file_ids=[ "232dac9f-e53a-4e91-a73c-a8c8096e9df2", "ae72f3a3-2838-4a9c-85c3-9c46cf62cf71" ], values=[ BulkUpdateMetadataParamsDataValuesItem( field_definition_id="cd4e5573-eabd-4ade-a238-676acefe6d05", value=[{"id": "39433bee-7715-4705-b03d-79ca1661b02f", "type": "user"}, {"id": "ec82df64-a097-4635-8e45-ae23d5eaec93", "type": "account_user_group"}], ) ], ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values" payload := strings.NewReader("{\n \"data\": {\n \"file_ids\": [\n \"232dac9f-e53a-4e91-a73c-a8c8096e9df2\",\n \"ae72f3a3-2838-4a9c-85c3-9c46cf62cf71\"\n ],\n \"values\": [\n {\n \"field_definition_id\": \"cd4e5573-eabd-4ade-a238-676acefe6d05\",\n \"value\": [\n {\n \"id\": \"39433bee-7715-4705-b03d-79ca1661b02f\",\n \"type\": \"user\"\n },\n {\n \"id\": \"ec82df64-a097-4635-8e45-ae23d5eaec93\",\n \"type\": \"account_user_group\"\n }\n ]\n }\n ]\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_ids\": [\n \"232dac9f-e53a-4e91-a73c-a8c8096e9df2\",\n \"ae72f3a3-2838-4a9c-85c3-9c46cf62cf71\"\n ],\n \"values\": [\n {\n \"field_definition_id\": \"cd4e5573-eabd-4ade-a238-676acefe6d05\",\n \"value\": [\n {\n \"id\": \"39433bee-7715-4705-b03d-79ca1661b02f\",\n \"type\": \"user\"\n },\n {\n \"id\": \"ec82df64-a097-4635-8e45-ae23d5eaec93\",\n \"type\": \"account_user_group\"\n }\n ]\n }\n ]\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_ids\": [\n \"232dac9f-e53a-4e91-a73c-a8c8096e9df2\",\n \"ae72f3a3-2838-4a9c-85c3-9c46cf62cf71\"\n ],\n \"values\": [\n {\n \"field_definition_id\": \"cd4e5573-eabd-4ade-a238-676acefe6d05\",\n \"value\": [\n {\n \"id\": \"39433bee-7715-4705-b03d-79ca1661b02f\",\n \"type\": \"user\"\n },\n {\n \"id\": \"ec82df64-a097-4635-8e45-ae23d5eaec93\",\n \"type\": \"account_user_group\"\n }\n ]\n }\n ]\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values', [ 'body' => '{ "data": { "file_ids": [ "232dac9f-e53a-4e91-a73c-a8c8096e9df2", "ae72f3a3-2838-4a9c-85c3-9c46cf62cf71" ], "values": [ { "field_definition_id": "cd4e5573-eabd-4ade-a238-676acefe6d05", "value": [ { "id": "39433bee-7715-4705-b03d-79ca1661b02f", "type": "user" }, { "id": "ec82df64-a097-4635-8e45-ae23d5eaec93", "type": "account_user_group" } ] } ] } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_ids\": [\n \"232dac9f-e53a-4e91-a73c-a8c8096e9df2\",\n \"ae72f3a3-2838-4a9c-85c3-9c46cf62cf71\"\n ],\n \"values\": [\n {\n \"field_definition_id\": \"cd4e5573-eabd-4ade-a238-676acefe6d05\",\n \"value\": [\n {\n \"id\": \"39433bee-7715-4705-b03d-79ca1661b02f\",\n \"type\": \"user\"\n },\n {\n \"id\": \"ec82df64-a097-4635-8e45-ae23d5eaec93\",\n \"type\": \"account_user_group\"\n }\n ]\n }\n ]\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "file_ids": ["232dac9f-e53a-4e91-a73c-a8c8096e9df2", "ae72f3a3-2838-4a9c-85c3-9c46cf62cf71"], "values": [ [ "field_definition_id": "cd4e5573-eabd-4ade-a238-676acefe6d05", "value": [ [ "id": "39433bee-7715-4705-b03d-79ca1661b02f", "type": "user" ], [ "id": "ec82df64-a097-4635-8e45-ae23d5eaec93", "type": "account_user_group" ] ] ] ] ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3da3cd7c-9fe6-49f7-a6f1-3d4bd7259ad9/projects/d1d079e8-accb-4784-80da-2e673233a5ac/metadata/values")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create account level field definitions POST https://api.frame.io/v4/accounts/{account_id}/metadata/field_definitions Content-Type: application/json Create account level field definitions.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata-fields/metadata-field-definitions-create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/metadata/field_definitions: post: operationId: metadata-field-definitions-create summary: Create account level field definitions description: >- Create account level field definitions.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_metadataFields parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/FieldDefinitionResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/CreateFieldDefinitionParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat: type: string enum: - local - friendly - usa - euro - iso default: local title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat: type: string enum: - twelve_hour - twenty_four_hour default: twelve_hour title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration: type: object properties: display_format: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat display_timezone: type: boolean default: false include_time: type: boolean default: false time_format: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat default: twelve_hour required: - display_format title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat: type: string enum: - bitrate - bits - duration - framerate - frequency - storage - timecode description: Number format title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration: type: object properties: number_format: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat description: Number format scale: type: integer description: >- Number scale. Indicates the number of decimal places of precision for the number value required: - scale title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle: type: string enum: - star - heart - thumbs_up description: Field type title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration: type: object properties: color: type: string description: 'Color value hex code for the `style` icon symbols. ex: #fbd400' max_value: type: integer style: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle description: Field type required: - max_value title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems: type: object properties: color: type: string description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name required: - display_name title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems required: - options title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration SelectMultiDefinitionParamsFieldConfigurationOptionsItems: type: object properties: color: type: string description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name required: - display_name title: SelectMultiDefinitionParamsFieldConfigurationOptionsItems SelectMultiDefinitionParamsFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/SelectMultiDefinitionParamsFieldConfigurationOptionsItems required: - options title: SelectMultiDefinitionParamsFieldConfiguration SelectMultiDefinitionParamsFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - date - user_multi - user_single description: Field type title: SelectMultiDefinitionParamsFieldType ToggleDefinitionParamsFieldConfiguration: type: object properties: color: type: string description: 'Color value hex code. ex: #fbd400' title: ToggleDefinitionParamsFieldConfiguration ToggleDefinitionParamsFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - date - user_multi - user_single description: Field type title: ToggleDefinitionParamsFieldType CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType required: - id - type title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType notify_members: type: boolean required: - member_options_type - notify_members title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType required: - id - type title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType notify_members: type: boolean required: - member_options_type - notify_members title: >- CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration CreateFieldDefinitionParamsData: oneOf: - type: object properties: field_type: type: string enum: - date description: 'Discriminator value: date' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: DateDefinitionParams variant - type: object properties: field_type: type: string enum: - long_text description: 'Discriminator value: long_text' name: type: string description: Field definition name required: - field_type - name description: LongTextDefinitionParams variant - type: object properties: field_type: type: string enum: - number description: 'Discriminator value: number' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: NumberDefinitionParams variant - type: object properties: field_type: type: string enum: - rating description: 'Discriminator value: rating' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: RatingDefinitionParams variant - type: object properties: field_type: type: string enum: - select description: 'Discriminator value: select' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: SelectDefinitionParams variant - type: object properties: field_type: $ref: '#/components/schemas/SelectMultiDefinitionParamsFieldType' description: Field type field_configuration: $ref: >- #/components/schemas/SelectMultiDefinitionParamsFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: SelectMultiDefinitionParams variant - type: object properties: field_type: type: string enum: - text description: 'Discriminator value: text' name: type: string description: Field definition name required: - field_type - name description: TextDefinitionParams variant - type: object properties: field_type: $ref: '#/components/schemas/ToggleDefinitionParamsFieldType' description: Field type field_configuration: $ref: '#/components/schemas/ToggleDefinitionParamsFieldConfiguration' name: type: string description: Field definition name required: - field_type - name description: ToggleDefinitionParams variant - type: object properties: field_type: type: string enum: - user_multi description: 'Discriminator value: user_multi' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: UserMultiDefinitionParams variant - type: object properties: field_type: type: string enum: - user_single description: 'Discriminator value: user_single' field_configuration: $ref: >- #/components/schemas/CreateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration name: type: string description: Field definition name required: - field_type - field_configuration - name description: UserSingleDefinitionParams variant discriminator: propertyName: field_type title: CreateFieldDefinitionParamsData CreateFieldDefinitionParams: type: object properties: data: $ref: '#/components/schemas/CreateFieldDefinitionParamsData' title: CreateFieldDefinitionParams FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat: type: string enum: - local - friendly - usa - euro - iso default: local title: FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat: type: string enum: - twelve_hour - twenty_four_hour default: twelve_hour title: FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat FieldDefinitionDiscriminatorMappingDateFieldConfiguration: type: object properties: display_format: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat display_timezone: type: boolean default: false include_time: type: boolean default: false time_format: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat default: twelve_hour required: - display_format title: FieldDefinitionDiscriminatorMappingDateFieldConfiguration LongTextDefinitionFieldConfiguration: type: object properties: {} title: LongTextDefinitionFieldConfiguration LongTextDefinitionFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: LongTextDefinitionFieldType FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat: type: string enum: - bitrate - bits - duration - framerate - frequency - storage - timecode description: Number format title: FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat FieldDefinitionDiscriminatorMappingNumberFieldConfiguration: type: object properties: number_format: oneOf: - $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat - type: 'null' description: Number format scale: type: integer description: >- Number scale. Indicates the number of decimal places of precision for the number value required: - scale title: FieldDefinitionDiscriminatorMappingNumberFieldConfiguration FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle: type: string enum: - star - heart - thumbs_up description: Field type title: FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle FieldDefinitionDiscriminatorMappingRatingFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `style` icon symbols. ex: #fbd400' max_value: type: integer style: oneOf: - $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle - type: 'null' description: Field type required: - max_value title: FieldDefinitionDiscriminatorMappingRatingFieldConfiguration FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems FieldDefinitionDiscriminatorMappingSelectFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems required: - options title: FieldDefinitionDiscriminatorMappingSelectFieldConfiguration FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: >- FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems required: - options title: FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration TextDefinitionFieldConfiguration: type: object properties: {} title: TextDefinitionFieldConfiguration TextDefinitionFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: TextDefinitionFieldType FieldDefinitionDiscriminatorMappingToggleFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code. ex: #fbd400' required: - color title: FieldDefinitionDiscriminatorMappingToggleFieldConfiguration FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType required: - id - type title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType required: - id - type title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration FieldDefinition: oneOf: - type: object properties: field_type: type: string enum: - date description: 'Discriminator value: date' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: DateDefinition variant - type: object properties: field_type: $ref: '#/components/schemas/LongTextDefinitionFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: '#/components/schemas/LongTextDefinitionFieldConfiguration' id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: LongTextDefinition variant - type: object properties: field_type: type: string enum: - number description: 'Discriminator value: number' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingNumberFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: NumberDefinition variant - type: object properties: field_type: type: string enum: - rating description: 'Discriminator value: rating' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingRatingFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: RatingDefinition variant - type: object properties: field_type: type: string enum: - select description: 'Discriminator value: select' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectDefinition variant - type: object properties: field_type: type: string enum: - select_multi description: 'Discriminator value: select_multi' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectMultiDefinition variant - type: object properties: field_type: $ref: '#/components/schemas/TextDefinitionFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: '#/components/schemas/TextDefinitionFieldConfiguration' id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: TextDefinition variant - type: object properties: field_type: type: string enum: - toggle description: 'Discriminator value: toggle' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingToggleFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: ToggleDefinition variant - type: object properties: field_type: type: string enum: - user_multi description: 'Discriminator value: user_multi' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserMultiDefinition variant - type: object properties: field_type: type: string enum: - user_single description: 'Discriminator value: user_single' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserSingleDefinition variant discriminator: propertyName: field_type title: FieldDefinition FieldDefinitionResponse: type: object properties: data: $ref: '#/components/schemas/FieldDefinition' required: - data title: FieldDefinitionResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadataFields.metadataFieldDefinitionsCreate("96d2423a-e903-4fed-a619-047ac14e2526", { data: { fieldType: "select", fieldConfiguration: { options: [ { displayName: "Option 1", }, { displayName: "Option 2", }, ], enableAddNew: false, }, name: "Fields definition name", }, }); } main(); ``` ```python from frameio import Frameio, SelectDefinitionParamsFieldConfiguration, SelectDefinitionParamsFieldConfigurationOptionsItem from frameio.metadata_fields import CreateFieldDefinitionParamsData_Select client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata_fields.metadata_field_definitions_create( account_id="96d2423a-e903-4fed-a619-047ac14e2526", data=CreateFieldDefinitionParamsData_Select( field_configuration=SelectDefinitionParamsFieldConfiguration( options=[ SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ) ], enable_add_new=False, ), name="Fields definition name", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions" payload := strings.NewReader("{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ],\n \"enable_add_new\": false\n },\n \"name\": \"Fields definition name\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ],\n \"enable_add_new\": false\n },\n \"name\": \"Fields definition name\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ],\n \"enable_add_new\": false\n },\n \"name\": \"Fields definition name\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions', [ 'body' => '{ "data": { "field_type": "select", "field_configuration": { "options": [ { "display_name": "Option 1" }, { "display_name": "Option 2" } ], "enable_add_new": false }, "name": "Fields definition name" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ],\n \"enable_add_new\": false\n },\n \"name\": \"Fields definition name\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "field_type": "select", "field_configuration": [ "options": [["display_name": "Option 1"], ["display_name": "Option 2"]], "enable_add_new": false ], "name": "Fields definition name" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/96d2423a-e903-4fed-a619-047ac14e2526/metadata/field_definitions")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete account level custom field definitions DELETE https://api.frame.io/v4/accounts/{account_id}/metadata/field_definitions/{field_definition_id} Delete account level custom field definitions.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata-fields/metadata-field-definitions-delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/metadata/field_definitions/{field_definition_id}: delete: operationId: metadata-field-definitions-delete summary: Delete account level custom field definitions description: >- Delete account level custom field definitions.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_metadataFields parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: field_definition_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadataFields.metadataFieldDefinitionsDelete("dabead49-1ff5-4dd4-8830-b5a62d006120", "c20fc113-3da8-4b0e-8f7b-0fca82b2312a"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata_fields.metadata_field_definitions_delete( account_id="dabead49-1ff5-4dd4-8830-b5a62d006120", field_definition_id="c20fc113-3da8-4b0e-8f7b-0fca82b2312a", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/dabead49-1ff5-4dd4-8830-b5a62d006120/metadata/field_definitions/c20fc113-3da8-4b0e-8f7b-0fca82b2312a")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List account level field definitions GET https://api.frame.io/v4/accounts/{account_id}/metadata/field_definitions List account level field definitions.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata-fields/metadata-field-definitions-index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/metadata/field_definitions: get: operationId: metadata-field-definitions-index summary: List account level field definitions description: >- List account level field definitions.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_metadataFields parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: filters in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdMetadataFieldDefinitionsGetParametersFilters - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdMetadataFieldDefinitionsGetParametersInclude - name: sort in: query description: Sort field definitions by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdMetadataFieldDefinitionsGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FieldDefinitionsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdMetadataFieldDefinitionsGetParametersFilters: type: object properties: exclude_immutable: type: boolean description: Filters out read-only fields. exclude_inactive: type: boolean description: Filters out inactive fields. description: Filter parameters title: V4AccountsAccountIdMetadataFieldDefinitionsGetParametersFilters V4AccountsAccountIdMetadataFieldDefinitionsGetParametersInclude: type: string enum: - creator description: Include query parameter for metadata field definitions title: V4AccountsAccountIdMetadataFieldDefinitionsGetParametersInclude V4AccountsAccountIdMetadataFieldDefinitionsGetParametersSort: type: string enum: - name_asc - created_at_asc - name_desc - created_at_desc description: Sort by query parameter for field definitions title: V4AccountsAccountIdMetadataFieldDefinitionsGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount DateDefinitionWithIncludesFieldConfigurationDisplayFormat: type: string enum: - local - friendly - usa - euro - iso default: local title: DateDefinitionWithIncludesFieldConfigurationDisplayFormat DateDefinitionWithIncludesFieldConfigurationTimeFormat: type: string enum: - twelve_hour - twenty_four_hour default: twelve_hour title: DateDefinitionWithIncludesFieldConfigurationTimeFormat DateDefinitionWithIncludesFieldConfiguration: type: object properties: display_format: $ref: >- #/components/schemas/DateDefinitionWithIncludesFieldConfigurationDisplayFormat display_timezone: type: boolean default: false include_time: type: boolean default: false time_format: $ref: >- #/components/schemas/DateDefinitionWithIncludesFieldConfigurationTimeFormat default: twelve_hour required: - display_format title: DateDefinitionWithIncludesFieldConfiguration DateDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: DateDefinitionWithIncludesFieldType User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User LongTextDefinitionWithIncludesFieldConfiguration: type: object properties: {} title: LongTextDefinitionWithIncludesFieldConfiguration LongTextDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: LongTextDefinitionWithIncludesFieldType NumberDefinitionWithIncludesFieldConfigurationNumberFormat: type: string enum: - bitrate - bits - duration - framerate - frequency - storage - timecode description: Number format title: NumberDefinitionWithIncludesFieldConfigurationNumberFormat NumberDefinitionWithIncludesFieldConfiguration: type: object properties: number_format: oneOf: - $ref: >- #/components/schemas/NumberDefinitionWithIncludesFieldConfigurationNumberFormat - type: 'null' description: Number format scale: type: integer description: >- Number scale. Indicates the number of decimal places of precision for the number value required: - scale title: NumberDefinitionWithIncludesFieldConfiguration NumberDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: NumberDefinitionWithIncludesFieldType RatingDefinitionWithIncludesFieldConfigurationStyle: type: string enum: - star - heart - thumbs_up description: Field type title: RatingDefinitionWithIncludesFieldConfigurationStyle RatingDefinitionWithIncludesFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `style` icon symbols. ex: #fbd400' max_value: type: integer style: oneOf: - $ref: >- #/components/schemas/RatingDefinitionWithIncludesFieldConfigurationStyle - type: 'null' description: Field type required: - max_value title: RatingDefinitionWithIncludesFieldConfiguration RatingDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: RatingDefinitionWithIncludesFieldType SelectDefinitionWithIncludesFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: SelectDefinitionWithIncludesFieldConfigurationOptionsItems SelectDefinitionWithIncludesFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/SelectDefinitionWithIncludesFieldConfigurationOptionsItems required: - options title: SelectDefinitionWithIncludesFieldConfiguration SelectDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: SelectDefinitionWithIncludesFieldType SelectMultiDefinitionWithIncludesFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: SelectMultiDefinitionWithIncludesFieldConfigurationOptionsItems SelectMultiDefinitionWithIncludesFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/SelectMultiDefinitionWithIncludesFieldConfigurationOptionsItems required: - options title: SelectMultiDefinitionWithIncludesFieldConfiguration SelectMultiDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: SelectMultiDefinitionWithIncludesFieldType TextDefinitionWithIncludesFieldConfiguration: type: object properties: {} title: TextDefinitionWithIncludesFieldConfiguration TextDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: TextDefinitionWithIncludesFieldType ToggleDefinitionWithIncludesFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code. ex: #fbd400' required: - color title: ToggleDefinitionWithIncludesFieldConfiguration ToggleDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: ToggleDefinitionWithIncludesFieldType UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItemsType UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItemsType required: - id - type title: UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItems UserMultiDefinitionWithIncludesFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: UserMultiDefinitionWithIncludesFieldConfigurationMemberOptionsType UserMultiDefinitionWithIncludesFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/UserMultiDefinitionWithIncludesFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/UserMultiDefinitionWithIncludesFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: UserMultiDefinitionWithIncludesFieldConfiguration UserMultiDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: UserMultiDefinitionWithIncludesFieldType UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItemsType UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItemsType required: - id - type title: UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItems UserSingleDefinitionWithIncludesFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: UserSingleDefinitionWithIncludesFieldConfigurationMemberOptionsType UserSingleDefinitionWithIncludesFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/UserSingleDefinitionWithIncludesFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/UserSingleDefinitionWithIncludesFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: UserSingleDefinitionWithIncludesFieldConfiguration UserSingleDefinitionWithIncludesFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: UserSingleDefinitionWithIncludesFieldType FieldDefinitionWithIncludes: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/DateDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/DateDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: DateDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/LongTextDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/LongTextDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: LongTextDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/NumberDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/NumberDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: NumberDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/RatingDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/RatingDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: RatingDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/SelectDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/SelectDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/SelectMultiDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/SelectMultiDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectMultiDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/TextDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/TextDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: TextDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/ToggleDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/ToggleDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: ToggleDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/UserMultiDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/UserMultiDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserMultiDefinitionWithIncludes variant - type: object properties: field_type: $ref: '#/components/schemas/UserSingleDefinitionWithIncludesFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/UserSingleDefinitionWithIncludesFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserSingleDefinitionWithIncludes variant discriminator: propertyName: field_type title: FieldDefinitionWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links FieldDefinitionsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/FieldDefinitionWithIncludes' description: Field definitions links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Account field definitions title: FieldDefinitionsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadataFields.metadataFieldDefinitionsIndex("e10ebd28-d84a-4331-897b-9a1c7c9ae057", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata_fields.metadata_field_definitions_index( account_id="e10ebd28-d84a-4331-897b-9a1c7c9ae057", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/e10ebd28-d84a-4331-897b-9a1c7c9ae057/metadata/field_definitions")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update account level custom field definitions PATCH https://api.frame.io/v4/accounts/{account_id}/metadata/field_definitions/{field_definition_id} Content-Type: application/json Update account level custom field definitions.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/metadata-fields/metadata-field-definitions-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/metadata/field_definitions/{field_definition_id}: patch: operationId: metadata-field-definitions-update summary: Update account level custom field definitions description: >- Update account level custom field definitions.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_metadataFields parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: field_definition_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/FieldDefinitionResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/UpdateFieldDefinitionParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat: type: string enum: - local - friendly - usa - euro - iso default: local title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat: type: string enum: - twelve_hour - twenty_four_hour default: twelve_hour title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration: type: object properties: display_format: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationDisplayFormat default: local display_timezone: type: boolean default: false include_time: type: boolean default: false time_format: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfigurationTimeFormat default: twelve_hour title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat: type: string enum: - bitrate - bits - duration - framerate - frequency - storage - timecode description: Number format title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration: type: object properties: number_format: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfigurationNumberFormat description: Number format scale: type: integer description: >- Number scale. Indicates the number of decimal places of precision for the number value title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle: type: string enum: - star - heart - thumbs_up description: Field type title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration: type: object properties: color: type: string description: 'Color value hex code for the `style` icon symbols. ex: #fbd400' max_value: type: integer style: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfigurationStyle description: Field type title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems: type: object properties: color: type: string description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name required: - display_name title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfigurationOptionsItems title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems: type: object properties: color: type: string description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name required: - display_name title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfiguration UpdateToggleDefinitionParamsFieldConfiguration: type: object properties: color: type: string description: 'Color value hex code. ex: #fbd400' title: UpdateToggleDefinitionParamsFieldConfiguration UpdateToggleDefinitionParamsFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - date - user_multi - user_single description: Field type of the field definition to be updated title: UpdateToggleDefinitionParamsFieldType UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType required: - id - type title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType notify_members: type: boolean required: - member_options_type - notify_members title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType required: - id - type title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType notify_members: type: boolean required: - member_options_type - notify_members title: >- UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration UpdateFieldDefinitionParamsData: oneOf: - type: object properties: field_type: type: string enum: - date description: 'Discriminator value: date' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingDateFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateDateDefinitionParams variant - type: object properties: field_type: type: string enum: - long_text description: 'Discriminator value: long_text' name: type: string description: Field definition name required: - field_type description: UpdateLongTextDefinitionParams variant - type: object properties: field_type: type: string enum: - number description: 'Discriminator value: number' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingNumberFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateNumberDefinitionParams variant - type: object properties: field_type: type: string enum: - rating description: 'Discriminator value: rating' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingRatingFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateRatingDefinitionParams variant - type: object properties: field_type: type: string enum: - select description: 'Discriminator value: select' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateSelectDefinitionParams variant - type: object properties: field_type: type: string enum: - select_multi description: 'Discriminator value: select_multi' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingSelectMultiFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateSelectMultiDefinitionParams variant - type: object properties: field_type: type: string enum: - text description: 'Discriminator value: text' name: type: string description: Field definition name required: - field_type description: UpdateTextDefinitionParams variant - type: object properties: field_type: $ref: '#/components/schemas/UpdateToggleDefinitionParamsFieldType' description: Field type of the field definition to be updated field_configuration: $ref: >- #/components/schemas/UpdateToggleDefinitionParamsFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateToggleDefinitionParams variant - type: object properties: field_type: type: string enum: - user_multi description: 'Discriminator value: user_multi' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserMultiFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateUserMultiDefinitionParams variant - type: object properties: field_type: type: string enum: - user_single description: 'Discriminator value: user_single' field_configuration: $ref: >- #/components/schemas/UpdateFieldDefinitionParamsDataDiscriminatorMappingUserSingleFieldConfiguration name: type: string description: Field definition name required: - field_type description: UpdateUserSingleDefinitionParams variant discriminator: propertyName: field_type title: UpdateFieldDefinitionParamsData UpdateFieldDefinitionParams: type: object properties: data: $ref: '#/components/schemas/UpdateFieldDefinitionParamsData' title: UpdateFieldDefinitionParams FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat: type: string enum: - local - friendly - usa - euro - iso default: local title: FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat: type: string enum: - twelve_hour - twenty_four_hour default: twelve_hour title: FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat FieldDefinitionDiscriminatorMappingDateFieldConfiguration: type: object properties: display_format: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfigurationDisplayFormat display_timezone: type: boolean default: false include_time: type: boolean default: false time_format: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfigurationTimeFormat default: twelve_hour required: - display_format title: FieldDefinitionDiscriminatorMappingDateFieldConfiguration LongTextDefinitionFieldConfiguration: type: object properties: {} title: LongTextDefinitionFieldConfiguration LongTextDefinitionFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: LongTextDefinitionFieldType FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat: type: string enum: - bitrate - bits - duration - framerate - frequency - storage - timecode description: Number format title: FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat FieldDefinitionDiscriminatorMappingNumberFieldConfiguration: type: object properties: number_format: oneOf: - $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingNumberFieldConfigurationNumberFormat - type: 'null' description: Number format scale: type: integer description: >- Number scale. Indicates the number of decimal places of precision for the number value required: - scale title: FieldDefinitionDiscriminatorMappingNumberFieldConfiguration FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle: type: string enum: - star - heart - thumbs_up description: Field type title: FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle FieldDefinitionDiscriminatorMappingRatingFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `style` icon symbols. ex: #fbd400' max_value: type: integer style: oneOf: - $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingRatingFieldConfigurationStyle - type: 'null' description: Field type required: - max_value title: FieldDefinitionDiscriminatorMappingRatingFieldConfiguration FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems FieldDefinitionDiscriminatorMappingSelectFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectFieldConfigurationOptionsItems required: - options title: FieldDefinitionDiscriminatorMappingSelectFieldConfiguration FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems: type: object properties: color: type: - string - 'null' description: 'Color value hex code for the `display_name`. ex: #fbd400' display_name: type: string description: Option display name id: type: string format: uuid required: - display_name title: >- FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration: type: object properties: enable_add_new: type: boolean default: true description: Allow or disallow adding in new option(s) from the grid/list view options: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectMultiFieldConfigurationOptionsItems required: - options title: FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration TextDefinitionFieldConfiguration: type: object properties: {} title: TextDefinitionFieldConfiguration TextDefinitionFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - user_single - user_multi - date description: Field type title: TextDefinitionFieldType FieldDefinitionDiscriminatorMappingToggleFieldConfiguration: type: object properties: color: type: - string - 'null' description: 'Color value hex code. ex: #fbd400' required: - color title: FieldDefinitionDiscriminatorMappingToggleFieldConfiguration FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItemsType required: - id - type title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType: type: string enum: - user - account_user_group title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems: type: object properties: id: type: string format: uuid description: User Id type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItemsType required: - id - type title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType: type: string enum: - all_project_members - custom title: >- FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration: type: object properties: custom_members: type: array items: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationCustomMembersItems member_options_type: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfigurationMemberOptionsType notify_members: type: boolean required: - custom_members - member_options_type - notify_members title: FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration FieldDefinition: oneOf: - type: object properties: field_type: type: string enum: - date description: 'Discriminator value: date' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingDateFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: DateDefinition variant - type: object properties: field_type: $ref: '#/components/schemas/LongTextDefinitionFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: '#/components/schemas/LongTextDefinitionFieldConfiguration' id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: LongTextDefinition variant - type: object properties: field_type: type: string enum: - number description: 'Discriminator value: number' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingNumberFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: NumberDefinition variant - type: object properties: field_type: type: string enum: - rating description: 'Discriminator value: rating' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingRatingFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: RatingDefinition variant - type: object properties: field_type: type: string enum: - select description: 'Discriminator value: select' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectDefinition variant - type: object properties: field_type: type: string enum: - select_multi description: 'Discriminator value: select_multi' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingSelectMultiFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: SelectMultiDefinition variant - type: object properties: field_type: $ref: '#/components/schemas/TextDefinitionFieldType' description: Field type created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: '#/components/schemas/TextDefinitionFieldConfiguration' id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: TextDefinition variant - type: object properties: field_type: type: string enum: - toggle description: 'Discriminator value: toggle' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingToggleFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: ToggleDefinition variant - type: object properties: field_type: type: string enum: - user_multi description: 'Discriminator value: user_multi' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserMultiFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserMultiDefinition variant - type: object properties: field_type: type: string enum: - user_single description: 'Discriminator value: user_single' created_at: type: string format: date-time description: Created Timestamp creator_id: type: string format: uuid description: Field definition creator ID field_configuration: $ref: >- #/components/schemas/FieldDefinitionDiscriminatorMappingUserSingleFieldConfiguration id: type: string format: uuid description: Field definition ID mutable: type: boolean description: Field definition mutability. System fields cannot be updated. name: type: string description: FieldDefinition Name updated_at: type: string format: date-time description: Updated Timestamp required: - field_type - created_at - creator_id - field_configuration - id - mutable - name - updated_at description: UserSingleDefinition variant discriminator: propertyName: field_type title: FieldDefinition FieldDefinitionResponse: type: object properties: data: $ref: '#/components/schemas/FieldDefinition' required: - data title: FieldDefinitionResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.metadataFields.metadataFieldDefinitionsUpdate("e9c15969-04a0-4c8e-983d-8775810d1df9", "d7183c6f-f62a-4a44-828e-6ac55ad8f341", { data: { fieldType: "select", fieldConfiguration: { enableAddNew: false, options: [ { displayName: "Option 1", }, { displayName: "Option 2", }, ], }, name: "Updated-Field-Name", }, }); } main(); ``` ```python from frameio import Frameio, UpdateSelectDefinitionParamsFieldConfiguration, UpdateSelectDefinitionParamsFieldConfigurationOptionsItem from frameio.metadata_fields import UpdateFieldDefinitionParamsData_Select client = Frameio( token="YOUR_TOKEN_HERE", ) client.metadata_fields.metadata_field_definitions_update( account_id="e9c15969-04a0-4c8e-983d-8775810d1df9", field_definition_id="d7183c6f-f62a-4a44-828e-6ac55ad8f341", data=UpdateFieldDefinitionParamsData_Select( field_configuration=UpdateSelectDefinitionParamsFieldConfiguration( enable_add_new=False, options=[ UpdateSelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), UpdateSelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ) ], ), name="Updated-Field-Name", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341" payload := strings.NewReader("{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"enable_add_new\": false,\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ]\n },\n \"name\": \"Updated-Field-Name\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"enable_add_new\": false,\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ]\n },\n \"name\": \"Updated-Field-Name\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"enable_add_new\": false,\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ]\n },\n \"name\": \"Updated-Field-Name\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341', [ 'body' => '{ "data": { "field_type": "select", "field_configuration": { "enable_add_new": false, "options": [ { "display_name": "Option 1" }, { "display_name": "Option 2" } ] }, "name": "Updated-Field-Name" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"field_type\": \"select\",\n \"field_configuration\": {\n \"enable_add_new\": false,\n \"options\": [\n {\n \"display_name\": \"Option 1\"\n },\n {\n \"display_name\": \"Option 2\"\n }\n ]\n },\n \"name\": \"Updated-Field-Name\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "field_type": "select", "field_configuration": [ "enable_add_new": false, "options": [["display_name": "Option 1"], ["display_name": "Option 2"]] ], "name": "Updated-Field-Name" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/e9c15969-04a0-4c8e-983d-8775810d1df9/metadata/field_definitions/d7183c6f-f62a-4a44-828e-6ac55ad8f341")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List project user roles GET https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/users List user roles for a given project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/project-permissions/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/users: get: operationId: index summary: List project user roles description: >- List user roles for a given project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_projectPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include_deactivated in: query description: >- Supports including deactivated users in the response. Default is false. required: false schema: type: boolean - name: sort in: query description: Sort users by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdProjectsProjectIdUsersGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProjectUserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdProjectsProjectIdUsersGetParametersSort: type: string enum: - role_asc - role_desc - name_asc - name_desc - email_asc - email_desc description: Sort query parameter for users title: V4AccountsAccountIdProjectsProjectIdUsersGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount UserRoleRole: type: string enum: - workspace_admin - full_access - editor - edit_only - commenter - viewer - admin - owner title: UserRoleRole User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User UserRole: type: object properties: role: $ref: '#/components/schemas/UserRoleRole' user: $ref: '#/components/schemas/User' required: - role - user description: Frame.io User Role title: UserRole Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links ProjectUserRolesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/UserRole' description: User Roles links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io user role details title: ProjectUserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projectPermissions.index("26ecb9e0-f5bf-4ce3-82f7-afb078956dc9", "0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.project_permissions.index( account_id="26ecb9e0-f5bf-4ce3-82f7-afb078956dc9", project_id="0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/26ecb9e0-f5bf-4ce3-82f7-afb078956dc9/projects/0b5b05f3-d7fe-4ec8-93ef-99ae4239cc8e/users")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Remove a user from a given project DELETE https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/users/{user_id} Remove a user from a given project.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/project-permissions/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/users/{user_id}: delete: operationId: delete summary: Remove a user from a given project description: >- Remove a user from a given project.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_projectPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projectPermissions.delete("80287b51-47e0-456a-b0b2-9a90611498e0", "ffa68481-5411-445d-96a0-b65b3f853c94", "ee7636b5-8493-4709-b464-b28cedd64073"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.project_permissions.delete( account_id="80287b51-47e0-456a-b0b2-9a90611498e0", project_id="ffa68481-5411-445d-96a0-b65b3f853c94", user_id="ee7636b5-8493-4709-b464-b28cedd64073", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/80287b51-47e0-456a-b0b2-9a90611498e0/projects/ffa68481-5411-445d-96a0-b65b3f853c94/users/ee7636b5-8493-4709-b464-b28cedd64073")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update user roles for the given project PATCH https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/users/{user_id} Content-Type: application/json Update user roles for the given project if the user is already added to the project. If the user is not added to the project, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/project-permissions/project-user-roles-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/users/{user_id}: patch: operationId: project-user-roles-update summary: Update user roles for the given project description: >- Update user roles for the given project if the user is already added to the project. If the user is not added to the project, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_projectPermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpdateUserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Update user roles params body content: application/json: schema: $ref: '#/components/schemas/UpdateUserRolesParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID UpdateUserRolesParamsDataRole: type: string enum: - full_access - editor - edit_only - commenter - viewer title: UpdateUserRolesParamsDataRole UpdateUserRolesParamsData: type: object properties: role: $ref: '#/components/schemas/UpdateUserRolesParamsDataRole' required: - role title: UpdateUserRolesParamsData UpdateUserRolesParams: type: object properties: data: $ref: '#/components/schemas/UpdateUserRolesParamsData' required: - data description: Update user roles params title: UpdateUserRolesParams UpdateUserRolesResponseDataRole: type: string enum: - full_access - editor - edit_only - commenter - viewer title: UpdateUserRolesResponseDataRole UpdateUserRolesResponseData: type: object properties: role: $ref: '#/components/schemas/UpdateUserRolesResponseDataRole' title: UpdateUserRolesResponseData UpdateUserRolesResponse: type: object properties: data: $ref: '#/components/schemas/UpdateUserRolesResponseData' required: - data title: UpdateUserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projectPermissions.projectUserRolesUpdate("8f165d49-1317-49a1-8980-220875a1159e", "b2d9aee0-087a-448a-9949-3d37676f341a", "1d0ef76d-5801-4b33-9cee-9015e0ba4fc8", { data: { role: "editor", }, }); } main(); ``` ```python from frameio import Frameio, UpdateUserRolesParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.project_permissions.project_user_roles_update( account_id="8f165d49-1317-49a1-8980-220875a1159e", project_id="b2d9aee0-087a-448a-9949-3d37676f341a", user_id="1d0ef76d-5801-4b33-9cee-9015e0ba4fc8", data=UpdateUserRolesParamsData( role="editor", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8" payload := strings.NewReader("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"role\": \"editor\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8', [ 'body' => '{ "data": { "role": "editor" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"role\": \"editor\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["role": "editor"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/8f165d49-1317-49a1-8980-220875a1159e/projects/b2d9aee0-087a-448a-9949-3d37676f341a/users/1d0ef76d-5801-4b33-9cee-9015e0ba4fc8")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create project POST https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/projects Content-Type: application/json Create project in a given workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/projects/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/projects: post: operationId: create summary: Create project description: >- Create project in a given workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_projects parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ProjectResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Project params content: application/json: schema: $ref: '#/components/schemas/ProjectParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID ProjectParamsData: type: object properties: name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not required: - name title: ProjectParamsData ProjectParams: type: object properties: data: $ref: '#/components/schemas/ProjectParamsData' required: - data description: Project parameters for create operations title: ProjectParams ProjectStatus: type: string enum: - active - inactive description: Project Status title: ProjectStatus Project: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id description: Frame.io Project title: Project ProjectResponse: type: object properties: data: $ref: '#/components/schemas/Project' required: - data description: Frame.io project details title: ProjectResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projects.create("8541382c-82a3-4d37-a823-aec08fa5ef0b", "eb222b53-03e4-4f48-9848-2a93be6b06ab", { data: { name: "Project Name", restricted: true, }, }); } main(); ``` ```python from frameio import Frameio from frameio.projects import ProjectParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.projects.create( account_id="8541382c-82a3-4d37-a823-aec08fa5ef0b", workspace_id="eb222b53-03e4-4f48-9848-2a93be6b06ab", data=ProjectParamsData( name="Project Name", restricted=True, ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects', [ 'body' => '{ "data": { "name": "Project Name", "restricted": true } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "name": "Project Name", "restricted": true ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/8541382c-82a3-4d37-a823-aec08fa5ef0b/workspaces/eb222b53-03e4-4f48-9848-2a93be6b06ab/projects")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete project DELETE https://api.frame.io/v4/accounts/{account_id}/projects/{project_id} Delete a project.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/projects/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}: delete: operationId: delete summary: Delete project description: >- Delete a project.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_projects parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projects.delete("9cc53382-b096-4076-a751-07742f80a540", "6405ee91-2cf2-474f-9f75-9014a8b3f842"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.projects.delete( account_id="9cc53382-b096-4076-a751-07742f80a540", project_id="6405ee91-2cf2-474f-9f75-9014a8b3f842", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/9cc53382-b096-4076-a751-07742f80a540/projects/6405ee91-2cf2-474f-9f75-9014a8b3f842")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List projects GET https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/projects List projects in a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/projects/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/projects: get: operationId: index summary: List projects description: >- List projects in a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_projects parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersInclude - name: sort in: query description: Sort projects by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProjectsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersInclude: type: string enum: - owner description: Include query parameter for projects title: V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersInclude V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersSort: type: string enum: - name_asc - created_at_asc - name_desc - created_at_desc description: Sort query parameter for projects title: V4AccountsAccountIdWorkspacesWorkspaceIdProjectsGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links ProjectsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/ProjectWithIncludes' description: Projects links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io projects title: ProjectsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projects.index("858a1897-7e65-4ba6-a456-27ead51570fc", "151a9163-7b7f-4a57-aca9-b372245374ce", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.projects.index( account_id="858a1897-7e65-4ba6-a456-27ead51570fc", workspace_id="151a9163-7b7f-4a57-aca9-b372245374ce", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/858a1897-7e65-4ba6-a456-27ead51570fc/workspaces/151a9163-7b7f-4a57-aca9-b372245374ce/projects")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show project GET https://api.frame.io/v4/accounts/{account_id}/projects/{project_id} Show project details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/projects/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}: get: operationId: show summary: Show project description: >- Show project details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_projects parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdProjectsProjectIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProjectWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdProjectsProjectIdGetParametersInclude: type: string enum: - owner description: Include query parameter for projects title: V4AccountsAccountIdProjectsProjectIdGetParametersInclude ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes ProjectWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/ProjectWithIncludes' required: - data description: Frame.io project details title: ProjectWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projects.show("724016a7-afba-499e-990b-0dd3109d6b5b", "7d71ce75-8730-4117-9ee9-e76bb31c599b", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.projects.show( account_id="724016a7-afba-499e-990b-0dd3109d6b5b", project_id="7d71ce75-8730-4117-9ee9-e76bb31c599b", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/724016a7-afba-499e-990b-0dd3109d6b5b/projects/7d71ce75-8730-4117-9ee9-e76bb31c599b")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update project PATCH https://api.frame.io/v4/accounts/{account_id}/projects/{project_id} Content-Type: application/json Update project details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/projects/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}: patch: operationId: update summary: Update project description: >- Update project details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_projects parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProjectResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Project params content: application/json: schema: $ref: '#/components/schemas/ProjectUpdateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId ProjectUpdateParamsDataStatus: type: string enum: - active - inactive description: Project Status title: ProjectUpdateParamsDataStatus ProjectUpdateParamsData: type: object properties: name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not status: $ref: '#/components/schemas/ProjectUpdateParamsDataStatus' description: Project Status title: ProjectUpdateParamsData ProjectUpdateParams: type: object properties: data: $ref: '#/components/schemas/ProjectUpdateParamsData' required: - data description: Project parameters for update operations title: ProjectUpdateParams ProjectStatus: type: string enum: - active - inactive description: Project Status title: ProjectStatus Project: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id description: Frame.io Project title: Project ProjectResponse: type: object properties: data: $ref: '#/components/schemas/Project' required: - data description: Frame.io project details title: ProjectResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.projects.update("851ee533-b1d9-4fd3-85f3-2d1213ae34c6", "03c61c11-18bd-462f-aa36-ed1c4ef23f2a", { data: { name: "Project Name", restricted: true, status: "active", }, }); } main(); ``` ```python from frameio import Frameio from frameio.projects import ProjectUpdateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.projects.update( account_id="851ee533-b1d9-4fd3-85f3-2d1213ae34c6", project_id="03c61c11-18bd-462f-aa36-ed1c4ef23f2a", data=ProjectUpdateParamsData( name="Project Name", restricted=True, status="active", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true,\n \"status\": \"active\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true,\n \"status\": \"active\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true,\n \"status\": \"active\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a', [ 'body' => '{ "data": { "name": "Project Name", "restricted": true, "status": "active" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"Project Name\",\n \"restricted\": true,\n \"status\": \"active\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "name": "Project Name", "restricted": true, "status": "active" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/851ee533-b1d9-4fd3-85f3-2d1213ae34c6/projects/03c61c11-18bd-462f-aa36-ed1c4ef23f2a")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Search account POST https://api.frame.io/v4/accounts/{account_id}/search Content-Type: application/json Search across assets, folders, and projects within an account. Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/search/search ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/search: post: operationId: search summary: Search account description: | Search across assets, folders, and projects within an account. Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_search parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SearchResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Search parameters content: application/json: schema: $ref: '#/components/schemas/SearchParams' servers: - url: https://api.frame.io components: schemas: UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount SearchParamsEngine: type: string enum: - lexical - nlp description: 'Search engine to use. Available engines: lexical, nlp.' title: SearchParamsEngine SearchParamsFilters: type: object properties: files_and_version_stacks: type: boolean default: true description: Include files and version stacks in search results folders: type: boolean default: true description: Include folders in search results projects: type: boolean default: true description: Include projects in search results description: Filters to control which types of results are returned title: SearchParamsFilters SearchParams: type: object properties: engine: $ref: '#/components/schemas/SearchParamsEngine' description: 'Search engine to use. Available engines: lexical, nlp.' filters: $ref: '#/components/schemas/SearchParamsFilters' description: Filters to control which types of results are returned query: type: string description: The search query text required: - engine - query description: Search request parameters title: SearchParams NameMatchType: type: string enum: - name_match title: NameMatchType NameMatch: type: object properties: name: type: string description: The name of the result terms: type: array items: type: string description: The terms in the search query that matched the result's name type: $ref: '#/components/schemas/NameMatchType' required: - name - terms - type description: The result's name is a match for the search query title: NameMatch SourceFilenameMatchType: type: string enum: - source_filename_match title: SourceFilenameMatchType SourceFilenameMatch: type: object properties: source_filename: type: string description: The original file name of the result terms: type: array items: type: string description: >- The terms in the search query that matched the result's original file name type: $ref: '#/components/schemas/SourceFilenameMatchType' required: - source_filename - terms - type description: The result's original file name is a match for the search query title: SourceFilenameMatch ProjectMatchProject: type: object properties: id: type: string format: uuid description: The project ID name: type: string description: The project name required: - id - name description: Project information for a project match title: ProjectMatchProject ProjectMatchType: type: string enum: - project_match title: ProjectMatchType ProjectMatch: type: object properties: project: $ref: '#/components/schemas/ProjectMatchProject' description: Project information for a project match terms: type: array items: type: string description: The terms in the search query that matched the project name type: $ref: '#/components/schemas/ProjectMatchType' required: - project - terms - type description: The asset's project name is a match for the search query title: ProjectMatch CreatorMatchType: type: string enum: - creator_match title: CreatorMatchType CreatorMatch: type: object properties: creator_id: type: string format: uuid description: The ID of the user who created the result type: $ref: '#/components/schemas/CreatorMatchType' required: - creator_id - type description: The result's creator is a match for the search query title: CreatorMatch AssigneeMatchType: type: string enum: - assignee_match title: AssigneeMatchType AssigneeMatch: type: object properties: assignee_id: type: string format: uuid description: The ID of the user who the result is assigned to type: $ref: '#/components/schemas/AssigneeMatchType' required: - assignee_id - type description: The result's assignee is a match for the search query title: AssigneeMatch FormatMatchType: type: string enum: - format_match title: FormatMatchType FormatMatch: type: object properties: format: type: string description: The format of the result type: $ref: '#/components/schemas/FormatMatchType' required: - format - type description: The result's format is a match for the search query title: FormatMatch KeywordsMatchType: type: string enum: - keywords_match title: KeywordsMatchType KeywordsMatch: type: object properties: keywords: type: array items: type: string description: The keywords of the result that are relevant to the search type: $ref: '#/components/schemas/KeywordsMatchType' required: - keywords - type description: The result's keywords are a match for the search query title: KeywordsMatch StatusMatchType: type: string enum: - status_match title: StatusMatchType StatusMatch: type: object properties: status: type: string description: The status of the result type: $ref: '#/components/schemas/StatusMatchType' required: - status - type description: The result's status is a match for the search query title: StatusMatch VisualMatchClipsItems: type: object properties: best_frame_time: type: integer description: Best matching frame time in milliseconds end_time: type: integer description: End time in milliseconds index: type: integer description: Chronological index of this clip relevancy_index: type: integer description: Index ordered by relevancy score start_time: type: integer description: Start time in milliseconds required: - best_frame_time - end_time - index - relevancy_index - start_time description: A subclip within a video that is a match for the search query title: VisualMatchClipsItems VisualMatchType: type: string enum: - visual_match title: VisualMatchType VisualMatch: type: object properties: clips: type: array items: $ref: '#/components/schemas/VisualMatchClipsItems' description: The list of subclips matching the query type: $ref: '#/components/schemas/VisualMatchType' required: - clips - type description: The result's content vector embedding is a match for the search query title: VisualMatch TranscriptionMatchMatchesItems: type: object properties: id: type: string format: uuid description: Transcription segment ID snippets: type: array items: type: string description: >- The small portion of the transcription that is a match for the search query terms: type: array items: type: string description: >- The terms in the search query that are a match for the result's transcription required: - id - snippets - terms description: A transcription segment that is a match for the search query title: TranscriptionMatchMatchesItems TranscriptionMatchType: type: string enum: - transcription_match title: TranscriptionMatchType TranscriptionMatch: type: object properties: matches: type: array items: $ref: '#/components/schemas/TranscriptionMatchMatchesItems' description: The transcriptions that match type: $ref: '#/components/schemas/TranscriptionMatchType' required: - matches - type description: The result's transcription is a match for the search query title: TranscriptionMatch CommentMatchType: type: string enum: - comment_match title: CommentMatchType CommentMatch: type: object properties: comment_id: type: string format: uuid description: The ID of the comment that matched the query snippet: type: string description: The small portion of the comment that matched the search query terms: type: array items: type: string description: The terms in the search query that matched the result's comment type: $ref: '#/components/schemas/CommentMatchType' required: - comment_id - snippet - terms - type description: The result's comment is a match for the search query title: CommentMatch RatingMatchType: type: string enum: - rating_match title: RatingMatchType RatingMatch: type: object properties: color: type: string description: The color of the rating field max_value: type: integer description: The maximum rating of the rating field for the result rating: type: integer description: The rating of the result style: type: string description: The style of the rating field type: $ref: '#/components/schemas/RatingMatchType' required: - rating - type description: The result's rating is a match for the search query title: RatingMatch CommentCountMatchType: type: string enum: - comment_count_match title: CommentCountMatchType CommentCountMatch: type: object properties: comment_count: type: integer description: The comment count of the result type: $ref: '#/components/schemas/CommentCountMatchType' required: - comment_count - type description: The result's comment count is a match for the search query title: CommentCountMatch PageCountMatchType: type: string enum: - page_count_match title: PageCountMatchType PageCountMatch: type: object properties: page_count: type: integer description: The page count of the result type: $ref: '#/components/schemas/PageCountMatchType' required: - page_count - type description: The result's page count is a match for the search query title: PageCountMatch DurationMatchType: type: string enum: - duration_match title: DurationMatchType DurationMatch: type: object properties: duration: type: number format: double description: The duration of the result in seconds type: $ref: '#/components/schemas/DurationMatchType' required: - duration - type description: The result's duration is a match for the search query title: DurationMatch FilesizeMatchType: type: string enum: - filesize_match title: FilesizeMatchType FilesizeMatch: type: object properties: filesize: type: integer description: The file size of the result in bytes type: $ref: '#/components/schemas/FilesizeMatchType' required: - filesize - type description: The result's file size is a match for the search query title: FilesizeMatch AudioSampleRateMatchType: type: string enum: - audio_sample_rate_match title: AudioSampleRateMatchType AudioSampleRateMatch: type: object properties: audio_sample_rate: type: number format: double description: The audio sample rate of the result in Hz type: $ref: '#/components/schemas/AudioSampleRateMatchType' required: - audio_sample_rate - type description: The result's audio sample rate is a match for the search query title: AudioSampleRateMatch NotesMatchType: type: string enum: - notes_match title: NotesMatchType NotesMatch: type: object properties: notes: type: string description: The notes of the result type: $ref: '#/components/schemas/NotesMatchType' required: - notes - type description: The result's notes is a match for the search query title: NotesMatch UploadedAtMatchType: type: string enum: - uploaded_at_match title: UploadedAtMatchType UploadedAtMatch: type: object properties: type: $ref: '#/components/schemas/UploadedAtMatchType' uploaded_at: type: string format: date-time description: The uploaded at timestamp of the result required: - type - uploaded_at description: The result's uploaded at timestamp is a match for the search query title: UploadedAtMatch UpdatedAtMatchType: type: string enum: - updated_at_match title: UpdatedAtMatchType UpdatedAtMatch: type: object properties: type: $ref: '#/components/schemas/UpdatedAtMatchType' updated_at: type: string format: date-time description: The updated at timestamp of the result required: - type - updated_at description: The result's updated at timestamp is a match for the search query title: UpdatedAtMatch DeletedAtMatchType: type: string enum: - deleted_at_match title: DeletedAtMatchType DeletedAtMatch: type: object properties: deleted_at: type: string format: date-time description: The deleted at timestamp of the result type: $ref: '#/components/schemas/DeletedAtMatchType' required: - deleted_at - type description: The result's deleted at timestamp is a match for the search query title: DeletedAtMatch InsertedAtMatchType: type: string enum: - inserted_at_match title: InsertedAtMatchType InsertedAtMatch: type: object properties: inserted_at: type: string format: date-time description: The inserted at timestamp of the result type: $ref: '#/components/schemas/InsertedAtMatchType' required: - inserted_at - type description: The result's inserted at timestamp is a match for the search query title: InsertedAtMatch FileTypeMatchType: type: string enum: - file_type_match title: FileTypeMatchType FileTypeMatch: type: object properties: file_type: type: string description: The file type of the result type: $ref: '#/components/schemas/FileTypeMatchType' required: - file_type - type description: The result's file type is a match for the search query title: FileTypeMatch BitDepthMatchType: type: string enum: - bit_depth_match title: BitDepthMatchType BitDepthMatch: type: object properties: bit_depth: type: number format: double description: The bit depth of the result type: $ref: '#/components/schemas/BitDepthMatchType' required: - bit_depth - type description: The result's bit depth is a match for the search query title: BitDepthMatch BitRateMatchType: type: string enum: - bit_rate_match title: BitRateMatchType BitRateMatch: type: object properties: bit_rate: type: number format: double description: The bit rate of the result in bps type: $ref: '#/components/schemas/BitRateMatchType' required: - bit_rate - type description: The result's bit rate is a match for the search query title: BitRateMatch CodecMatchType: type: string enum: - codec_match title: CodecMatchType CodecMatch: type: object properties: codec: type: string description: The codec of the result type: $ref: '#/components/schemas/CodecMatchType' required: - codec - type description: The result's codec is a match for the search query title: CodecMatch ChannelsMatchType: type: string enum: - channels_match title: ChannelsMatchType ChannelsMatch: type: object properties: channels: type: number format: double description: The number of audio channels of the result type: $ref: '#/components/schemas/ChannelsMatchType' required: - channels - type description: The result's channels is a match for the search query title: ChannelsMatch FrameRateMatchType: type: string enum: - frame_rate_match title: FrameRateMatchType FrameRateMatch: type: object properties: frame_rate: type: number format: double description: The frame rate of the result in fps type: $ref: '#/components/schemas/FrameRateMatchType' required: - frame_rate - type description: The result's frame rate is a match for the search query title: FrameRateMatch HasAlphaChannelMatchType: type: string enum: - has_alpha_channel_match title: HasAlphaChannelMatchType HasAlphaChannelMatch: type: object properties: has_alpha_channel: type: boolean description: Whether the result has an alpha channel type: $ref: '#/components/schemas/HasAlphaChannelMatchType' required: - has_alpha_channel - type description: The result's alpha channel presence is a match for the search query title: HasAlphaChannelMatch ColorSpaceMatchType: type: string enum: - color_space_match title: ColorSpaceMatchType ColorSpaceMatch: type: object properties: color_space: type: string description: The color space of the result type: $ref: '#/components/schemas/ColorSpaceMatchType' required: - color_space - type description: The result's color space is a match for the search query title: ColorSpaceMatch ResolutionWidthMatchType: type: string enum: - resolution_width_match title: ResolutionWidthMatchType ResolutionWidthMatch: type: object properties: resolution_width: type: number format: double description: The resolution width of the result in pixels type: $ref: '#/components/schemas/ResolutionWidthMatchType' required: - resolution_width - type description: The result's resolution width is a match for the search query title: ResolutionWidthMatch ResolutionHeightMatchType: type: string enum: - resolution_height_match title: ResolutionHeightMatchType ResolutionHeightMatch: type: object properties: resolution_height: type: number format: double description: The resolution height of the result in pixels type: $ref: '#/components/schemas/ResolutionHeightMatchType' required: - resolution_height - type description: The result's resolution height is a match for the search query title: ResolutionHeightMatch DynamicRangeMatchType: type: string enum: - dynamic_range_match title: DynamicRangeMatchType DynamicRangeMatch: type: object properties: dynamic_range: type: string description: The dynamic range of the result type: $ref: '#/components/schemas/DynamicRangeMatchType' required: - dynamic_range - type description: The result's dynamic range is a match for the search query title: DynamicRangeMatch SearchMatch: oneOf: - $ref: '#/components/schemas/NameMatch' - $ref: '#/components/schemas/SourceFilenameMatch' - $ref: '#/components/schemas/ProjectMatch' - $ref: '#/components/schemas/CreatorMatch' - $ref: '#/components/schemas/AssigneeMatch' - $ref: '#/components/schemas/FormatMatch' - $ref: '#/components/schemas/KeywordsMatch' - $ref: '#/components/schemas/StatusMatch' - $ref: '#/components/schemas/VisualMatch' - $ref: '#/components/schemas/TranscriptionMatch' - $ref: '#/components/schemas/CommentMatch' - $ref: '#/components/schemas/RatingMatch' - $ref: '#/components/schemas/CommentCountMatch' - $ref: '#/components/schemas/PageCountMatch' - $ref: '#/components/schemas/DurationMatch' - $ref: '#/components/schemas/FilesizeMatch' - $ref: '#/components/schemas/AudioSampleRateMatch' - $ref: '#/components/schemas/NotesMatch' - $ref: '#/components/schemas/UploadedAtMatch' - $ref: '#/components/schemas/UpdatedAtMatch' - $ref: '#/components/schemas/DeletedAtMatch' - $ref: '#/components/schemas/InsertedAtMatch' - $ref: '#/components/schemas/FileTypeMatch' - $ref: '#/components/schemas/BitDepthMatch' - $ref: '#/components/schemas/BitRateMatch' - $ref: '#/components/schemas/CodecMatch' - $ref: '#/components/schemas/ChannelsMatch' - $ref: '#/components/schemas/FrameRateMatch' - $ref: '#/components/schemas/HasAlphaChannelMatch' - $ref: '#/components/schemas/ColorSpaceMatch' - $ref: '#/components/schemas/ResolutionWidthMatch' - $ref: '#/components/schemas/ResolutionHeightMatch' - $ref: '#/components/schemas/DynamicRangeMatch' description: A match explaining why a result was returned title: SearchMatch AssetCommonType: type: string enum: - file - folder - version_stack title: AssetCommonType AssetCommon: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url title: AssetCommon AssetSearchResultType: type: string enum: - file_result - folder_result - version_stack_result title: AssetSearchResultType AssetSearchResult: type: object properties: matches: type: array items: $ref: '#/components/schemas/SearchMatch' description: Matches explaining why this result was returned result: $ref: '#/components/schemas/AssetCommon' type: $ref: '#/components/schemas/AssetSearchResultType' required: - matches - result - type description: A search result containing an asset (file, folder, or version stack) title: AssetSearchResult ProjectStatus: type: string enum: - active - inactive description: Project Status title: ProjectStatus Project: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id description: Frame.io Project title: Project ProjectSearchResultType: type: string enum: - project_result title: ProjectSearchResultType ProjectSearchResult: type: object properties: matches: type: array items: $ref: '#/components/schemas/SearchMatch' description: Matches explaining why this result was returned result: $ref: '#/components/schemas/Project' type: $ref: '#/components/schemas/ProjectSearchResultType' required: - matches - result - type description: A search result containing a project title: ProjectSearchResult SearchResponseDataItems: oneOf: - $ref: '#/components/schemas/AssetSearchResult' - $ref: '#/components/schemas/ProjectSearchResult' title: SearchResponseDataItems Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links SearchResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/SearchResponseDataItems' description: List of search results links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total number of matching results required: - data - links description: Response containing search results title: SearchResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.search.search("25581f19-7fd6-4905-9892-802373e09ee9", { engine: "nlp", query: "red car driving on highway", filters: { filesAndVersionStacks: true, folders: false, projects: false, }, }); } main(); ``` ```python from frameio import Frameio from frameio.search import SearchParamsFilters client = Frameio( token="YOUR_TOKEN_HERE", ) client.search.search( account_id="25581f19-7fd6-4905-9892-802373e09ee9", engine="nlp", query="red car driving on highway", filters=SearchParamsFilters( files_and_version_stacks=True, folders=False, projects=False, ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search" payload := strings.NewReader("{\n \"engine\": \"nlp\",\n \"query\": \"red car driving on highway\",\n \"filters\": {\n \"files_and_version_stacks\": true,\n \"folders\": false,\n \"projects\": false\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"engine\": \"nlp\",\n \"query\": \"red car driving on highway\",\n \"filters\": {\n \"files_and_version_stacks\": true,\n \"folders\": false,\n \"projects\": false\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"engine\": \"nlp\",\n \"query\": \"red car driving on highway\",\n \"filters\": {\n \"files_and_version_stacks\": true,\n \"folders\": false,\n \"projects\": false\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search', [ 'body' => '{ "engine": "nlp", "query": "red car driving on highway", "filters": { "files_and_version_stacks": true, "folders": false, "projects": false } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"engine\": \"nlp\",\n \"query\": \"red car driving on highway\",\n \"filters\": {\n \"files_and_version_stacks\": true,\n \"folders\": false,\n \"projects\": false\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [ "engine": "nlp", "query": "red car driving on highway", "filters": [ "files_and_version_stacks": true, "folders": false, "projects": false ] ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/25581f19-7fd6-4905-9892-802373e09ee9/search")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Add new asset to share POST https://api.frame.io/v4/accounts/{account_id}/shares/{share_id}/assets Content-Type: application/json Add new asset share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/add-asset ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}/assets: post: operationId: add-asset summary: Add new asset to share description: >- Add new asset share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AddAssetResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Add asset body content: application/json: schema: $ref: '#/components/schemas/AddAssetParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID AddAssetParamsData: type: object properties: asset_id: type: string description: ID for asset to be added. required: - asset_id title: AddAssetParamsData AddAssetParams: type: object properties: data: $ref: '#/components/schemas/AddAssetParamsData' required: - data description: Add asset to share parameters title: AddAssetParams ShareAccess: type: string enum: - public - secure title: ShareAccess AddAssetResponseData: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp asset_added: type: string format: uuid description: ID for asset added required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at - asset_added title: AddAssetResponseData AddAssetResponse: type: object properties: data: $ref: '#/components/schemas/AddAssetResponseData' required: - data title: AddAssetResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.addAsset("56a67be1-58e8-4e15-983a-94798a22cd0e", "e08e66b0-b272-4c09-acbf-928d48e7d289", { data: { assetId: "c1a4485f-34b1-4597-8621-c208864b03bf", }, }); } main(); ``` ```python from frameio import Frameio from frameio.shares import AddAssetParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.add_asset( account_id="56a67be1-58e8-4e15-983a-94798a22cd0e", share_id="e08e66b0-b272-4c09-acbf-928d48e7d289", data=AddAssetParamsData( asset_id="c1a4485f-34b1-4597-8621-c208864b03bf", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets" payload := strings.NewReader("{\n \"data\": {\n \"asset_id\": \"c1a4485f-34b1-4597-8621-c208864b03bf\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"asset_id\": \"c1a4485f-34b1-4597-8621-c208864b03bf\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"asset_id\": \"c1a4485f-34b1-4597-8621-c208864b03bf\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets', [ 'body' => '{ "data": { "asset_id": "c1a4485f-34b1-4597-8621-c208864b03bf" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"asset_id\": \"c1a4485f-34b1-4597-8621-c208864b03bf\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["asset_id": "c1a4485f-34b1-4597-8621-c208864b03bf"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/56a67be1-58e8-4e15-983a-94798a22cd0e/shares/e08e66b0-b272-4c09-acbf-928d48e7d289/assets")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Add reviewers to secure share POST https://api.frame.io/v4/accounts/{account_id}/shares/{share_id}/reviewers Content-Type: application/json Add reviewers to secure share by three identifier types: `adobe_user_id`, `email`, and `user_id`.
A request can only include one identifier type parameter.
`email` is the only identifier able to add reviewers to a Share who don't have a Frame account member on the account where the Share belongs.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/add-reviewers ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}/reviewers: post: operationId: add-reviewers summary: Add reviewers to secure share description: > Add reviewers to secure share by three identifier types: `adobe_user_id`, `email`, and `user_id`.
A request can only include one identifier type parameter.
`email` is the only identifier able to add reviewers to a Share who don't have a Frame account member on the account where the Share belongs.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Add reviewers to share body content: application/json: schema: $ref: '#/components/schemas/AddReviewersToShareParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID Email: type: string description: A valid email address. title: Email AddReviewersToShareParamsDataReviewers: type: object properties: adobe_user_ids: type: array items: type: string description: Adobe User IDs emails: type: array items: $ref: '#/components/schemas/Email' description: Email Addresses user_ids: type: array items: $ref: '#/components/schemas/UUID' description: User IDs title: AddReviewersToShareParamsDataReviewers AddReviewersToShareParamsData: type: object properties: message: type: string description: Message for notification content reviewers: $ref: '#/components/schemas/AddReviewersToShareParamsDataReviewers' required: - message - reviewers title: AddReviewersToShareParamsData AddReviewersToShareParams: type: object properties: data: $ref: '#/components/schemas/AddReviewersToShareParamsData' required: - data description: Add reviewers to a share title: AddReviewersToShareParams BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.addReviewers("c36c18a1-891d-4d17-917a-3f4f488d2df6", "776b563e-0a65-4f45-92a6-d145a476469a", { data: { message: "Please join my share!", reviewers: { emails: [ "email1@domain.com", "email2@domain.com", ], }, }, }); } main(); ``` ```python from frameio import Frameio from frameio.shares import AddReviewersToShareParamsData, AddReviewersToShareParamsDataReviewers client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.add_reviewers( account_id="c36c18a1-891d-4d17-917a-3f4f488d2df6", share_id="776b563e-0a65-4f45-92a6-d145a476469a", data=AddReviewersToShareParamsData( message="Please join my share!", reviewers=AddReviewersToShareParamsDataReviewers( emails=[ "email1@domain.com", "email2@domain.com" ], ), ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers" payload := strings.NewReader("{\n \"data\": {\n \"message\": \"Please join my share!\",\n \"reviewers\": {\n \"emails\": [\n \"email1@domain.com\",\n \"email2@domain.com\"\n ]\n }\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"message\": \"Please join my share!\",\n \"reviewers\": {\n \"emails\": [\n \"email1@domain.com\",\n \"email2@domain.com\"\n ]\n }\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"message\": \"Please join my share!\",\n \"reviewers\": {\n \"emails\": [\n \"email1@domain.com\",\n \"email2@domain.com\"\n ]\n }\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers', [ 'body' => '{ "data": { "message": "Please join my share!", "reviewers": { "emails": [ "email1@domain.com", "email2@domain.com" ] } } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"message\": \"Please join my share!\",\n \"reviewers\": {\n \"emails\": [\n \"email1@domain.com\",\n \"email2@domain.com\"\n ]\n }\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "message": "Please join my share!", "reviewers": ["emails": ["email1@domain.com", "email2@domain.com"]] ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/c36c18a1-891d-4d17-917a-3f4f488d2df6/shares/776b563e-0a65-4f45-92a6-d145a476469a/reviewers")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create share POST https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/shares Content-Type: application/json Create share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/shares: post: operationId: create summary: Create share description: >- Create share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ShareResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Share params body content: application/json: schema: $ref: '#/components/schemas/CreateShareParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId CreateShareParamsDataDiscriminatorMappingAssetAccess: type: string enum: - public - secure title: CreateShareParamsDataDiscriminatorMappingAssetAccess CreateShareParamsData: oneOf: - type: object properties: type: type: string enum: - asset description: 'Discriminator value: asset' access: $ref: >- #/components/schemas/CreateShareParamsDataDiscriminatorMappingAssetAccess asset_ids: type: array items: $ref: '#/components/schemas/FrameOrAdobeId' description: Asset IDs (File, folder, and/or version stack IDs). description: type: - string - 'null' description: 'Share description - NOTE: Requires feature custom_branded_shares' downloading_enabled: type: - boolean - 'null' description: Whether downloading is enabled on the share expiration: type: - string - 'null' format: date-time description: Expiration timestamp name: type: string description: >- Share Name (must include at least one non-whitespace character and no line breaks) passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated required: - type - access - name description: AssetShareParams variant discriminator: propertyName: type title: CreateShareParamsData CreateShareParams: type: object properties: data: $ref: '#/components/schemas/CreateShareParamsData' required: - data title: CreateShareParams ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share ShareResponse: type: object properties: data: $ref: '#/components/schemas/Share' required: - data title: ShareResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.create("66a12a7c-4405-4da2-a806-0f096db4a23d", "3b69de52-b4ac-4dc3-8d59-874ed85708c8", { data: { type: "asset", access: "public", name: "Share Name", assetIds: [ "95311975-c6a6-4598-95ec-b1caedde755b", "7edc0ee8-d308-4514-83d3-e95c8fdc227c", ], downloadingEnabled: true, expiration: new Date("2026-06-02T00:54:49.376288Z"), passphrase: "as!dfj39sd(*", }, }); } main(); ``` ```python from frameio import Frameio from frameio.shares import CreateShareParamsData_Asset import datetime client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.create( account_id="66a12a7c-4405-4da2-a806-0f096db4a23d", project_id="3b69de52-b4ac-4dc3-8d59-874ed85708c8", data=CreateShareParamsData_Asset( access="public", name="Share Name", asset_ids=[ "95311975-c6a6-4598-95ec-b1caedde755b", "7edc0ee8-d308-4514-83d3-e95c8fdc227c" ], downloading_enabled=True, expiration=datetime.datetime.fromisoformat("2026-06-02T00:54:49.376288+00:00"), passphrase="as!dfj39sd(*", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares" payload := strings.NewReader("{\n \"data\": {\n \"type\": \"asset\",\n \"access\": \"public\",\n \"name\": \"Share Name\",\n \"asset_ids\": [\n \"95311975-c6a6-4598-95ec-b1caedde755b\",\n \"7edc0ee8-d308-4514-83d3-e95c8fdc227c\"\n ],\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"type\": \"asset\",\n \"access\": \"public\",\n \"name\": \"Share Name\",\n \"asset_ids\": [\n \"95311975-c6a6-4598-95ec-b1caedde755b\",\n \"7edc0ee8-d308-4514-83d3-e95c8fdc227c\"\n ],\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"type\": \"asset\",\n \"access\": \"public\",\n \"name\": \"Share Name\",\n \"asset_ids\": [\n \"95311975-c6a6-4598-95ec-b1caedde755b\",\n \"7edc0ee8-d308-4514-83d3-e95c8fdc227c\"\n ],\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares', [ 'body' => '{ "data": { "type": "asset", "access": "public", "name": "Share Name", "asset_ids": [ "95311975-c6a6-4598-95ec-b1caedde755b", "7edc0ee8-d308-4514-83d3-e95c8fdc227c" ], "downloading_enabled": true, "expiration": "2026-06-02T00:54:49.376288Z", "passphrase": "as!dfj39sd(*" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"type\": \"asset\",\n \"access\": \"public\",\n \"name\": \"Share Name\",\n \"asset_ids\": [\n \"95311975-c6a6-4598-95ec-b1caedde755b\",\n \"7edc0ee8-d308-4514-83d3-e95c8fdc227c\"\n ],\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "type": "asset", "access": "public", "name": "Share Name", "asset_ids": ["95311975-c6a6-4598-95ec-b1caedde755b", "7edc0ee8-d308-4514-83d3-e95c8fdc227c"], "downloading_enabled": true, "expiration": "2026-06-02T00:54:49.376288Z", "passphrase": "as!dfj39sd(*" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/66a12a7c-4405-4da2-a806-0f096db4a23d/projects/3b69de52-b4ac-4dc3-8d59-874ed85708c8/shares")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete share DELETE https://api.frame.io/v4/accounts/{account_id}/shares/{share_id} Delete a share.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}: delete: operationId: delete summary: Delete share description: >- Delete a share.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.delete("30386f95-0114-47bd-a778-a00f424be0d5", "6f730605-bdea-4212-a074-7a5627330ae7"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.delete( account_id="30386f95-0114-47bd-a778-a00f424be0d5", share_id="6f730605-bdea-4212-a074-7a5627330ae7", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/30386f95-0114-47bd-a778-a00f424be0d5/shares/6f730605-bdea-4212-a074-7a5627330ae7")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List share reviewers GET https://api.frame.io/v4/accounts/{account_id}/shares/{share_id}/reviewers List share reviewers.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/list-reviewers ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}/reviewers: get: operationId: list-reviewers summary: List share reviewers description: >- List share reviewers.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: sort in: query description: Sort share reviewers by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdSharesShareIdReviewersGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ShareReviewersResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdSharesShareIdReviewersGetParametersSort: type: string enum: - name_asc - active - name_desc - inactive description: Sort by query parameter for share reviewers title: V4AccountsAccountIdSharesShareIdReviewersGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links ShareReviewersResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/User' description: Share reviewer details links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Share reviewers title: ShareReviewersResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.listReviewers("d2e75f18-2b44-4a2b-99eb-a51dcd9304db", "a4a7888a-cd35-4db8-ba9a-66527e93bff4", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.list_reviewers( account_id="d2e75f18-2b44-4a2b-99eb-a51dcd9304db", share_id="a4a7888a-cd35-4db8-ba9a-66527e93bff4", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/d2e75f18-2b44-4a2b-99eb-a51dcd9304db/shares/a4a7888a-cd35-4db8-ba9a-66527e93bff4/reviewers")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List shares GET https://api.frame.io/v4/accounts/{account_id}/projects/{project_id}/shares List shares on a project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/projects/{project_id}/shares: get: operationId: index summary: List shares description: >- List shares on a project.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: project_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: sort in: query description: Sort shares by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdProjectsProjectIdSharesGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SharesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdProjectsProjectIdSharesGetParametersSort: type: string enum: - name_asc - created_at_asc - name_desc - created_at_desc description: Sort query parameter for shares title: V4AccountsAccountIdProjectsProjectIdSharesGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links SharesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/Share' description: Shares links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Shares on a project title: SharesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.index("b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1", "9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.index( account_id="b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1", project_id="9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/b9d0ce30-8b26-4bc1-8113-8e4792f1f9f1/projects/9bc195a0-988f-4a8e-b9b3-b291d0ce4fcc/shares")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Remove asset from share DELETE https://api.frame.io/v4/accounts/{account_id}/shares/{share_id}/assets/{asset_id} Remove an asset currently in the share from that share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/remove-asset ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}/assets/{asset_id}: delete: operationId: remove-asset summary: Remove asset from share description: >- Remove an asset currently in the share from that share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: asset_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RemoveAssetResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID ShareAccess: type: string enum: - public - secure title: ShareAccess RemoveAssetResponseData: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp asset_removed: type: string format: uuid description: ID for asset added required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at - asset_removed title: RemoveAssetResponseData RemoveAssetResponse: type: object properties: data: $ref: '#/components/schemas/RemoveAssetResponseData' required: - data title: RemoveAssetResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.removeAsset("195c46ee-263a-4994-b584-feb0650d6151", "733db80d-840d-4d21-9e8a-1855c884d141", "fa45ae94-22ed-474a-ae9c-6696775cf335"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.remove_asset( account_id="195c46ee-263a-4994-b584-feb0650d6151", share_id="733db80d-840d-4d21-9e8a-1855c884d141", asset_id="fa45ae94-22ed-474a-ae9c-6696775cf335", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/195c46ee-263a-4994-b584-feb0650d6151/shares/733db80d-840d-4d21-9e8a-1855c884d141/assets/fa45ae94-22ed-474a-ae9c-6696775cf335")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Removes reviewers from secure share DELETE https://api.frame.io/v4/accounts/{account_id}/shares/{share_id}/reviewers Content-Type: application/json Removes reviewers from secure Share by three identifier types: `adobe_user_id`, `email`, and `user_id`.
A request can only include one identifier type parameter.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/remove-reviewers ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}/reviewers: delete: operationId: remove-reviewers summary: Removes reviewers from secure share description: > Removes reviewers from secure Share by three identifier types: `adobe_user_id`, `email`, and `user_id`.
A request can only include one identifier type parameter.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/RemoveReviewerParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID Email: type: string description: A valid email address. title: Email RemoveReviewerParamsDataReviewers: type: object properties: adobe_user_ids: type: array items: type: string description: List of Adobe user IDs to be removed emails: type: array items: $ref: '#/components/schemas/Email' description: Email Addresses user_ids: type: array items: $ref: '#/components/schemas/UUID' description: User IDs title: RemoveReviewerParamsDataReviewers RemoveReviewerParamsData: type: object properties: reviewers: $ref: '#/components/schemas/RemoveReviewerParamsDataReviewers' required: - reviewers title: RemoveReviewerParamsData RemoveReviewerParams: type: object properties: data: $ref: '#/components/schemas/RemoveReviewerParamsData' required: - data description: Remove reviewers from a secure share title: RemoveReviewerParams BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.removeReviewers("88923dc2-6834-461e-980c-dcc03682b3f1", "3afbcbcc-492c-405e-b580-4512cfb71dc6", { data: { reviewers: { adobeUserIds: [ "2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e", ], }, }, }); } main(); ``` ```python from frameio import Frameio from frameio.shares import RemoveReviewerParamsData, RemoveReviewerParamsDataReviewers client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.remove_reviewers( account_id="88923dc2-6834-461e-980c-dcc03682b3f1", share_id="3afbcbcc-492c-405e-b580-4512cfb71dc6", data=RemoveReviewerParamsData( reviewers=RemoveReviewerParamsDataReviewers( adobe_user_ids=[ "2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e" ], ), ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers" payload := strings.NewReader("{\n \"data\": {\n \"reviewers\": {\n \"adobe_user_ids\": [\n \"2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e\"\n ]\n }\n }\n}") req, _ := http.NewRequest("DELETE", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"reviewers\": {\n \"adobe_user_ids\": [\n \"2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e\"\n ]\n }\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"reviewers\": {\n \"adobe_user_ids\": [\n \"2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e\"\n ]\n }\n }\n}") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers', [ 'body' => '{ "data": { "reviewers": { "adobe_user_ids": [ "2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e" ] } } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"reviewers\": {\n \"adobe_user_ids\": [\n \"2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e\"\n ]\n }\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["reviewers": ["adobe_user_ids": ["2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e"]]]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/88923dc2-6834-461e-980c-dcc03682b3f1/shares/3afbcbcc-492c-405e-b580-4512cfb71dc6/reviewers")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show Share GET https://api.frame.io/v4/accounts/{account_id}/shares/{share_id} Show a single Share.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}: get: operationId: show summary: Show Share description: >- Show a single Share.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ShareResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share ShareResponse: type: object properties: data: $ref: '#/components/schemas/Share' required: - data title: ShareResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.show("bc80d8ad-e8ba-4eb2-a327-febffdadce67", "eed6b794-0bfc-435f-8b2d-d626d1e0c8ea"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.show( account_id="bc80d8ad-e8ba-4eb2-a327-febffdadce67", share_id="eed6b794-0bfc-435f-8b2d-d626d1e0c8ea", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/bc80d8ad-e8ba-4eb2-a327-febffdadce67/shares/eed6b794-0bfc-435f-8b2d-d626d1e0c8ea")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update share PATCH https://api.frame.io/v4/accounts/{account_id}/shares/{share_id} Content-Type: application/json Update share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/shares/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/shares/{share_id}: patch: operationId: update summary: Update share description: >- Update share.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_shares parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: share_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ShareResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Share params body content: application/json: schema: $ref: '#/components/schemas/UpdateShareParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID UpdateShareParamsDataAccess: type: string enum: - public - secure title: UpdateShareParamsDataAccess UpdateShareParamsData: type: object properties: access: $ref: '#/components/schemas/UpdateShareParamsDataAccess' description: type: - string - 'null' description: 'Share description - NOTE: Requires feature custom_branded_shares' downloading_enabled: type: - boolean - 'null' description: Whether downloading is enabled on the share expiration: type: - string - 'null' format: date-time description: Expiration timestamp name: type: - string - 'null' description: >- Share Name (must include at least one non-whitespace character and no line breaks) passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated title: UpdateShareParamsData UpdateShareParams: type: object properties: data: $ref: '#/components/schemas/UpdateShareParamsData' required: - data description: Share update parameters title: UpdateShareParams ShareAccess: type: string enum: - public - secure title: ShareAccess Share: type: object properties: access: $ref: '#/components/schemas/ShareAccess' collection_id: type: string format: uuid description: Collection ID commenting_enabled: type: boolean description: Whether commenting is enabled on the share created_at: type: string format: date-time description: Creation timestamp description: type: - string - 'null' description: Share description downloading_enabled: type: boolean description: Whether downloading is enabled on the share enabled: type: boolean description: Whether the share link is active expiration: type: - string - 'null' format: date-time description: Expiration timestamp id: type: string format: uuid description: Share ID last_viewed_at: type: - string - 'null' format: date-time description: Last viewed timestamp name: type: - string - 'null' description: Share name passphrase: type: - string - 'null' description: >- Passphrase to access share, if passphrase is required and not given it will be generated short_url: type: - string - 'null' description: Share URL updated_at: type: string format: date-time description: Update timestamp required: - access - collection_id - commenting_enabled - created_at - description - downloading_enabled - enabled - expiration - id - last_viewed_at - name - short_url - updated_at title: Share ShareResponse: type: object properties: data: $ref: '#/components/schemas/Share' required: - data title: ShareResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.shares.update("d59ff012-925c-4892-a975-519f49a8617b", "3957507e-f0b9-4f3e-9582-00cf40ef9729", { data: { access: "public", description: "A descriptive summary of the share", downloadingEnabled: true, expiration: new Date("2026-06-02T00:54:49.376288Z"), name: "Share Name", passphrase: "as!dfj39sd(*", }, }); } main(); ``` ```python from frameio import Frameio from frameio.shares import UpdateShareParamsData import datetime client = Frameio( token="YOUR_TOKEN_HERE", ) client.shares.update( account_id="d59ff012-925c-4892-a975-519f49a8617b", share_id="3957507e-f0b9-4f3e-9582-00cf40ef9729", data=UpdateShareParamsData( access="public", description="A descriptive summary of the share", downloading_enabled=True, expiration=datetime.datetime.fromisoformat("2026-06-02T00:54:49.376288+00:00"), name="Share Name", passphrase="as!dfj39sd(*", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729" payload := strings.NewReader("{\n \"data\": {\n \"access\": \"public\",\n \"description\": \"A descriptive summary of the share\",\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"name\": \"Share Name\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"access\": \"public\",\n \"description\": \"A descriptive summary of the share\",\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"name\": \"Share Name\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"access\": \"public\",\n \"description\": \"A descriptive summary of the share\",\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"name\": \"Share Name\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729', [ 'body' => '{ "data": { "access": "public", "description": "A descriptive summary of the share", "downloading_enabled": true, "expiration": "2026-06-02T00:54:49.376288Z", "name": "Share Name", "passphrase": "as!dfj39sd(*" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"access\": \"public\",\n \"description\": \"A descriptive summary of the share\",\n \"downloading_enabled\": true,\n \"expiration\": \"2026-06-02T00:54:49.376288Z\",\n \"name\": \"Share Name\",\n \"passphrase\": \"as!dfj39sd(*\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "access": "public", "description": "A descriptive summary of the share", "downloading_enabled": true, "expiration": "2026-06-02T00:54:49.376288Z", "name": "Share Name", "passphrase": "as!dfj39sd(*" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/d59ff012-925c-4892-a975-519f49a8617b/shares/3957507e-f0b9-4f3e-9582-00cf40ef9729")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # User details GET https://api.frame.io/v4/me Inspect details of the user associated with the bearer token.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/users/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/me: get: operationId: show summary: User details description: >- Inspect details of the user associated with the bearer token.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_users parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProfileResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: Profile: type: object properties: avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: string format: uuid description: User ID name: type: string description: User name required: - avatar_url - email - id - name description: User details title: Profile ProfileResponse: type: object properties: data: $ref: '#/components/schemas/Profile' required: - data description: User profile title: ProfileResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.users.show(); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.users.show() ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/me" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/me") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/me") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/me', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/me"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/me")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Copy version stack POST https://api.frame.io/v4/accounts/{account_id}/version_stacks/{version_stack_id}/copy Content-Type: application/json Copy version stack.
Rate Limits: 10 calls per 1.00 minute(s) per account_user

Currently, copying version stacks between Adobe storage backed projects is not supported. Copying individual files within a version stack and then restacking them is currently the supported method for copying version stacks for these projects. Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/copy ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/version_stacks/{version_stack_id}/copy: post: operationId: copy summary: Copy version stack description: > Copy version stack.
Rate Limits: 10 calls per 1.00 minute(s) per account_user

Currently, copying version stacks between Adobe storage backed projects is not supported. Copying individual files within a version stack and then restacking them is currently the supported method for copying version stacks for these projects. tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: version_stack_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: copy_metadata in: query description: Whether to copy metadata values along with the version stack required: false schema: type: boolean default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VersionStackCopyResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Version stack params content: application/json: schema: $ref: '#/components/schemas/VersionStackCopyParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId VersionStackCopyParamsData: type: object properties: parent_id: type: string description: Destination folder ID. Defaults to version stack parent ID. title: VersionStackCopyParamsData VersionStackCopyParams: type: object properties: data: $ref: '#/components/schemas/VersionStackCopyParamsData' description: Version stack copy parameters title: VersionStackCopyParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File VersionStackType: type: string enum: - file - folder - version_stack title: VersionStackType VersionStack: type: object properties: head_version: $ref: '#/components/schemas/File' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/VersionStackType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - head_version - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: VersionStack VersionStackCopyResponse: type: object properties: data: $ref: '#/components/schemas/VersionStack' required: - data title: VersionStackCopyResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.copy("964c03a4-3af9-47fd-ad85-c47b719613a2", "f948e625-dfc6-440a-8a63-b474a9ff9e1a", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.version_stacks import VersionStackCopyParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.copy( account_id="964c03a4-3af9-47fd-ad85-c47b719613a2", version_stack_id="f948e625-dfc6-440a-8a63-b474a9ff9e1a", data=VersionStackCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/964c03a4-3af9-47fd-ad85-c47b719613a2/version_stacks/f948e625-dfc6-440a-8a63-b474a9ff9e1a/copy")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create version stack POST https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/version_stacks Content-Type: application/json Create a new Version Stack under the parent folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/version_stacks: post: operationId: create summary: Create version stack description: >- Create a new Version Stack under the parent folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/VersionStackWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable Content content: application/json: schema: $ref: '#/components/schemas/JsonErrorResponse' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/VersionStackCreateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId VersionStackCreateParamsData: type: object properties: file_ids: type: array items: $ref: '#/components/schemas/FrameOrAdobeId' description: > An array of file IDs in the Version Stack.
The Version Stack will be created by "stacking" the `file_ids` argument in order from left (oldest/bottom version in the stack) to right (newest/top version in the stack).
Two file IDs are required and up to a maximum of ten. Files must exist in the parent directory identified in the path. required: - file_ids title: VersionStackCreateParamsData VersionStackCreateParams: type: object properties: data: $ref: '#/components/schemas/VersionStackCreateParamsData' required: - data description: Version stack creation parameters title: VersionStackCreateParams User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType VersionStackWithIncludes: type: object properties: head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/VersionStackWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - head_version - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: VersionStackWithIncludes VersionStackWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/VersionStackWithIncludes' required: - data title: VersionStackWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict JsonErrorResponseErrorsItemsSource: type: object properties: pointer: type: string required: - pointer title: JsonErrorResponseErrorsItemsSource JsonErrorResponseErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/JsonErrorResponseErrorsItemsSource' title: type: string required: - detail - source - title title: JsonErrorResponseErrorsItems JsonErrorResponse: type: object properties: errors: type: array items: $ref: '#/components/schemas/JsonErrorResponseErrorsItems' required: - errors title: JsonErrorResponse TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.create("cd83745b-db76-4d12-b7a2-529d8cf53e19", "f97fd21d-baa2-40bb-a3fb-e922c5987366", { data: { fileIds: [ "b1acd65b-ab44-4ddc-9d85-7143fee349f3", "b1694742-68d5-40e9-b8f3-8c0de9335a91", ], }, }); } main(); ``` ```python from frameio import Frameio from frameio.version_stacks import VersionStackCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.create( account_id="cd83745b-db76-4d12-b7a2-529d8cf53e19", folder_id="f97fd21d-baa2-40bb-a3fb-e922c5987366", data=VersionStackCreateParamsData( file_ids=[ "b1acd65b-ab44-4ddc-9d85-7143fee349f3", "b1694742-68d5-40e9-b8f3-8c0de9335a91" ], ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks" payload := strings.NewReader("{\n \"data\": {\n \"file_ids\": [\n \"b1acd65b-ab44-4ddc-9d85-7143fee349f3\",\n \"b1694742-68d5-40e9-b8f3-8c0de9335a91\"\n ]\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"file_ids\": [\n \"b1acd65b-ab44-4ddc-9d85-7143fee349f3\",\n \"b1694742-68d5-40e9-b8f3-8c0de9335a91\"\n ]\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"file_ids\": [\n \"b1acd65b-ab44-4ddc-9d85-7143fee349f3\",\n \"b1694742-68d5-40e9-b8f3-8c0de9335a91\"\n ]\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks', [ 'body' => '{ "data": { "file_ids": [ "b1acd65b-ab44-4ddc-9d85-7143fee349f3", "b1694742-68d5-40e9-b8f3-8c0de9335a91" ] } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"file_ids\": [\n \"b1acd65b-ab44-4ddc-9d85-7143fee349f3\",\n \"b1694742-68d5-40e9-b8f3-8c0de9335a91\"\n ]\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["file_ids": ["b1acd65b-ab44-4ddc-9d85-7143fee349f3", "b1694742-68d5-40e9-b8f3-8c0de9335a91"]]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/cd83745b-db76-4d12-b7a2-529d8cf53e19/folders/f97fd21d-baa2-40bb-a3fb-e922c5987366/version_stacks")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List version stack children GET https://api.frame.io/v4/accounts/{account_id}/version_stacks/{version_stack_id}/children List the children (files) in a given version stack.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/version_stacks/{version_stack_id}/children: get: operationId: index summary: List version stack children description: > List the children (files) in a given version stack.
Use the `include` query parameter to selectively include additional properties in the response.
Note: if you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's `status` is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: version_stack_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdVersionStacksVersionStackIdChildrenGetParametersInclude - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VersionStackAssetsWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdVersionStacksVersionStackIdChildrenGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: >- V4AccountsAccountIdVersionStacksVersionStackIdChildrenGetParametersInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FolderWithIncludesType: type: string enum: - file - folder - version_stack title: FolderWithIncludesType FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType AssetWithIncludes: oneOf: - type: object properties: type: $ref: '#/components/schemas/AssetCommonWithIncludesType' adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - type - created_at - id - name - parent_id - project_id - updated_at - view_url - file_size - media_type - status description: FileWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/FolderWithIncludesType' cover_file_id: type: - string - 'null' format: uuid description: Cover asset ID id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - cover_file_id - id - name - parent_id - created_at - project_id - updated_at - view_url description: FolderWithIncludes variant - type: object properties: type: $ref: '#/components/schemas/VersionStackWithIncludesType' head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - type - head_version - id - name - parent_id - created_at - project_id - updated_at - view_url description: VersionStackWithIncludes variant discriminator: propertyName: type title: AssetWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links VersionStackAssetsWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/AssetWithIncludes' description: Assets links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: VersionStackAssetsWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.index("2ad6dc91-17af-4892-b347-942d87ec4655", "3e5f9c0f-2c76-4154-91cb-8d229e5991e8", { include: "media_links.original", }); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.index( account_id="2ad6dc91-17af-4892-b347-942d87ec4655", version_stack_id="3e5f9c0f-2c76-4154-91cb-8d229e5991e8", include="media_links.original", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/2ad6dc91-17af-4892-b347-942d87ec4655/version_stacks/3e5f9c0f-2c76-4154-91cb-8d229e5991e8/children?include=media_links.original")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List version stacks GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/version_stacks List version stacks in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/list ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/folders/{folder_id}/version_stacks: get: operationId: list summary: List version stacks description: >- List version stacks in a given folder.
Rate Limits: 5 calls per 1 second(s) per account_user tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: folder_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdFoldersFolderIdVersionStacksGetParametersInclude - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VersionStacksWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdFoldersFolderIdVersionStacksGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: V4AccountsAccountIdFoldersFolderIdVersionStacksGetParametersInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType VersionStackWithIncludes: type: object properties: head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/VersionStackWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - head_version - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: VersionStackWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links VersionStacksWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/VersionStackWithIncludes' links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links title: VersionStacksWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.list("3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b", "62f19427-e0e9-4580-9545-ccad0b696796", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.list( account_id="3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b", folder_id="62f19427-e0e9-4580-9545-ccad0b696796", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3ce95802-d3cc-4b5b-9f4b-6dd5620a6a1b/folders/62f19427-e0e9-4580-9545-ccad0b696796/version_stacks")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Move version stack PATCH https://api.frame.io/v4/accounts/{account_id}/version_stacks/{version_stack_id}/move Content-Type: application/json Move version stack to a folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/move ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/version_stacks/{version_stack_id}/move: patch: operationId: move summary: Move version stack description: >- Move version stack to a folder.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: version_stack_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VersionStackResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Request body content: application/json: schema: $ref: '#/components/schemas/VersionStackMoveParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId VersionStackMoveParamsData: type: object properties: parent_id: type: string description: Destination folder ID title: VersionStackMoveParamsData VersionStackMoveParams: type: object properties: data: $ref: '#/components/schemas/VersionStackMoveParamsData' required: - data description: Version stack move parameters title: VersionStackMoveParams FileType: type: string enum: - file - folder - version_stack title: FileType FileStatus: type: string enum: - created - transcoded - uploaded title: FileStatus File: type: object properties: id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/FileType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_type: type: string description: File media type status: $ref: '#/components/schemas/FileStatus' required: - id - name - created_at - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: File VersionStackType: type: string enum: - file - folder - version_stack title: VersionStackType VersionStack: type: object properties: head_version: $ref: '#/components/schemas/File' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/VersionStackType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - head_version - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: VersionStack VersionStackResponse: type: object properties: data: $ref: '#/components/schemas/VersionStack' required: - data title: VersionStackResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.move("e037c3f1-7388-46ea-92f8-b7392efd56b6", "eb20611c-eac8-456f-ad37-cfca29f565ad", { data: { parentId: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); } main(); ``` ```python from frameio import Frameio from frameio.version_stacks import VersionStackMoveParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.move( account_id="e037c3f1-7388-46ea-92f8-b7392efd56b6", version_stack_id="eb20611c-eac8-456f-ad37-cfca29f565ad", data=VersionStackMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move" payload := strings.NewReader("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move', [ 'body' => '{ "data": { "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"parent_id\": \"2e426fe0-f965-4594-8b2b-b4dff1dc00ec\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/e037c3f1-7388-46ea-92f8-b7392efd56b6/version_stacks/eb20611c-eac8-456f-ad37-cfca29f565ad/move")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show version stack GET https://api.frame.io/v4/accounts/{account_id}/version_stacks/{version_stack_id} Show version stack details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/version-stacks/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/version_stacks/{version_stack_id}: get: operationId: show summary: Show version stack description: >- Show version stack details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_versionStacks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: version_stack_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdVersionStacksVersionStackIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VersionStackWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdVersionStacksVersionStackIdGetParametersInclude: type: string enum: - media_links.original - media_links.thumbnail - media_links.thumbnail_high_quality - media_links.video_h264_180 - media_links.high_quality - media_links.efficient - media_links.scrub_sheet - creator - project - metadata description: >- Supported include query parameter values for endpoints that return files with media links title: V4AccountsAccountIdVersionStacksVersionStackIdGetParametersInclude User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User FieldValueCommonFieldType: type: string enum: - text - long_text - select - select_multi - rating - number - toggle - users - date - users - user_multi - user_single description: Field type title: FieldValueCommonFieldType SelectOption: type: object properties: display_name: type: string description: Option display name id: type: string format: uuid description: Option ID required: - display_name - id title: SelectOption UserValueType: type: string enum: - user - account_user_group title: UserValueType UserValue: type: object properties: id: type: string format: uuid description: User Id or Account User Group Id type: $ref: '#/components/schemas/UserValueType' required: - id - type title: UserValue MultiUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: MultiUserValueMemberOptionsType SingleUserValueMemberOptionsType: type: string enum: - custom - all_project_members title: SingleUserValueMemberOptionsType MetadataField: oneOf: - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' format: datetime required: - field_type - field_definition_id - field_definition_name - mutable - value description: DateValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - number - 'null' format: double required: - field_type - field_definition_id - field_definition_name - mutable - value description: NumberValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - integer - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: IntegerValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. field_options: type: array items: $ref: '#/components/schemas/SelectOption' value: type: array items: $ref: '#/components/schemas/SelectOption' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiSelectValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - string - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: TextValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. value: type: - boolean - 'null' required: - field_type - field_definition_id - field_definition_name - mutable - value description: BooleanValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/SingleUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: SingleUserValue variant - type: object properties: field_type: $ref: '#/components/schemas/FieldValueCommonFieldType' description: Field type field_definition_id: type: string format: uuid description: Field definition ID field_definition_name: type: string description: Field definition name mutable: type: boolean description: Metadata mutability. System field values cannot be updated. custom_members: type: array items: $ref: '#/components/schemas/UserValue' description: >- Populated with custom member options only if `member_options_type` is set to 'custom'. member_options_type: $ref: '#/components/schemas/MultiUserValueMemberOptionsType' value: type: array items: $ref: '#/components/schemas/UserValue' required: - field_type - field_definition_id - field_definition_name - mutable - value description: MultiUserValue variant discriminator: propertyName: field_type title: MetadataField ProjectWithIncludesStatus: type: string enum: - active - inactive description: Project Status title: ProjectWithIncludesStatus ProjectWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: >- Adobe cloud storage directory ID associated with the project, when available. created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Project ID name: type: string description: Project Name restricted: type: boolean description: Whether the project is restricted or not root_folder_id: type: string format: uuid description: Root Folder ID status: $ref: '#/components/schemas/ProjectWithIncludesStatus' description: Project Status storage: type: integer default: 0 description: Storage Usage updated_at: type: string format: date-time description: Updated Timestamp view_url: type: string description: URL to view the project in the Frame.io web application workspace_id: type: string format: uuid description: Workspace ID description: type: - string - 'null' description: Project Description owner: $ref: '#/components/schemas/User' required: - created_at - id - name - root_folder_id - status - storage - updated_at - view_url - workspace_id - description description: Frame.io Project title: ProjectWithIncludes AssetCommonWithIncludesType: type: string enum: - file - folder - version_stack title: AssetCommonWithIncludesType MediaLinkCommon: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
required: - download_url title: MediaLinkCommon OriginalMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
inline_url: type: - string - 'null' description: > URL to view the media file in a web browser in its original resolution and media type.
HTTP response headers will include Content-Disposition = 'inline;filename='.
required: - download_url - inline_url title: OriginalMediaLink RenditionMediaLink: type: object properties: download_url: type: - string - 'null' description: > URL to download the media file.
HTTP response headers will include Content-Disposition = 'attachment;filename='.
Watermarks may be applied for transcode links as per Account settings and User permissions.
url: type: - string - 'null' description: > URL to transcoded media that won't include any Content-Disposition header in the response.
Watermarks may be applied as per Account settings and User permissions.
Media content may be streamed (e.g. when watermarks are required). Clients may issue a HEAD request to determine whether Content-Length and/or Accept-Ranges headers are present in order to determine whether the content can be downloaded in parallel chunks. required: - download_url - url title: RenditionMediaLink MediaLinksCollection: type: object properties: efficient: $ref: '#/components/schemas/MediaLinkCommon' high_quality: $ref: '#/components/schemas/MediaLinkCommon' original: $ref: '#/components/schemas/OriginalMediaLink' scrub_sheet: $ref: '#/components/schemas/RenditionMediaLink' thumbnail: $ref: '#/components/schemas/RenditionMediaLink' thumbnail_high_quality: $ref: '#/components/schemas/RenditionMediaLink' video_h264_180: $ref: '#/components/schemas/RenditionMediaLink' title: MediaLinksCollection FileWithIncludesStatus: type: string enum: - created - transcoded - uploaded title: FileWithIncludesStatus FileWithIncludes: type: object properties: adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' id: type: string format: uuid description: File ID metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes name: type: string description: File Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/AssetCommonWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application adobe_version_id: type: - string - 'null' description: >- Version identifier of the Adobe cloud storage asset associated with this file, when available. A version identifier is a string that often resembles an integer but should be treated as an opaque string. file_size: type: integer description: File size in bytes media_links: $ref: '#/components/schemas/MediaLinksCollection' media_type: type: string description: File media type status: $ref: '#/components/schemas/FileWithIncludesStatus' required: - created_at - id - name - parent_id - project_id - type - updated_at - view_url - file_size - media_type - status title: FileWithIncludes VersionStackWithIncludesType: type: string enum: - file - folder - version_stack title: VersionStackWithIncludesType VersionStackWithIncludes: type: object properties: head_version: oneOf: - $ref: '#/components/schemas/FileWithIncludes' - type: 'null' id: type: string format: uuid description: File, Folder, or Version Stack ID name: type: string description: File or Folder Name parent_id: type: - string - 'null' format: uuid description: Parent Folder or Version Stack ID adobe_id: type: - string - 'null' description: Adobe cloud storage asset identifier, when available. created_at: type: string format: date-time description: Creation timestamp creator: $ref: '#/components/schemas/User' metadata: type: array items: $ref: '#/components/schemas/MetadataField' description: File attributes project: $ref: '#/components/schemas/ProjectWithIncludes' project_id: type: string format: uuid description: Project ID type: $ref: '#/components/schemas/VersionStackWithIncludesType' updated_at: type: string format: date-time description: Update timestamp view_url: type: string description: URL to view the asset in the Frame.io web application required: - head_version - id - name - parent_id - created_at - project_id - type - updated_at - view_url title: VersionStackWithIncludes VersionStackWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/VersionStackWithIncludes' required: - data title: VersionStackWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.versionStacks.show("7232c8cf-0376-4f2f-a436-2ea59d005be9", "3135b1b8-5860-4d71-98fc-28cc989aef23", { include: "media_links.original", }); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.version_stacks.show( account_id="7232c8cf-0376-4f2f-a436-2ea59d005be9", version_stack_id="3135b1b8-5860-4d71-98fc-28cc989aef23", include="media_links.original", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/7232c8cf-0376-4f2f-a436-2ea59d005be9/version_stacks/3135b1b8-5860-4d71-98fc-28cc989aef23?include=media_links.original")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create webhook POST https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/webhooks Content-Type: application/json Creates a single webhook with secret.

Valid events:

file.created, file.deleted, file.ready, file.updated, file.upload.completed, file.versioned, file.copied, folder.created, folder.deleted, folder.updated, folder.copied, comment.completed, comment.created, comment.deleted, comment.uncompleted, comment.updated, customfield.created, customfield.updated, customfield.deleted, metadata.value.updated, project.created, project.deleted, project.updated, collection.created, collection.updated, collection.deleted, share.created, share.updated, share.deleted, share.viewed

.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/webhooks/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooks: post: operationId: create summary: Create webhook description: >- Creates a single webhook with secret.

Valid events:

file.created, file.deleted, file.ready, file.updated, file.upload.completed, file.versioned, file.copied, folder.created, folder.deleted, folder.updated, folder.copied, comment.completed, comment.created, comment.deleted, comment.uncompleted, comment.updated, customfield.created, customfield.updated, customfield.deleted, metadata.value.updated, project.created, project.deleted, project.updated, collection.created, collection.updated, collection.deleted, share.created, share.updated, share.deleted, share.viewed

.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_webhooks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/WebhookCreateResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Webhook params content: application/json: schema: $ref: '#/components/schemas/WebhookCreateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID WebhookEvents: type: array items: type: string title: WebhookEvents WebhookCreateParamsData: type: object properties: events: $ref: '#/components/schemas/WebhookEvents' name: type: string url: type: string description: URL where `event` is sent required: - events - name - url title: WebhookCreateParamsData WebhookCreateParams: type: object properties: data: $ref: '#/components/schemas/WebhookCreateParamsData' required: - data description: Webhook creation parameters title: WebhookCreateParams WebhookCreateResponseData: type: object properties: active: type: boolean description: Webhook active status created_at: type: string format: date-time events: $ref: '#/components/schemas/WebhookEvents' id: type: string format: uuid description: Webhook ID name: type: string description: Webhook Name updated_at: type: string format: date-time url: type: string workspace_id: type: - string - 'null' format: uuid description: Workspace ID secret: type: string description: >- Secret used to validate webhook requests. Make sure to store your secret. You won’t be able to see it again! required: - created_at - events - id - name - updated_at - url - secret title: WebhookCreateResponseData WebhookCreateResponse: type: object properties: data: $ref: '#/components/schemas/WebhookCreateResponseData' required: - data description: Returns a single webhook with secret. title: WebhookCreateResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.webhooks.create("3973b754-ff4a-462b-9b34-c129e2217477", "4a8d28a3-887f-451e-927a-d7366b31fedc", { data: { events: [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name: "New Webhook", url: "https://url.example.com", }, }); } main(); ``` ```python from frameio import Frameio from frameio.webhooks import WebhookCreateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.webhooks.create( account_id="3973b754-ff4a-462b-9b34-c129e2217477", workspace_id="4a8d28a3-887f-451e-927a-d7366b31fedc", data=WebhookCreateParamsData( events=[ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed" ], name="New Webhook", url="https://url.example.com", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks" payload := strings.NewReader("{\n \"data\": {\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"New Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"New Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"New Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks', [ 'body' => '{ "data": { "events": [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed" ], "name": "New Webhook", "url": "https://url.example.com" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"New Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "events": ["file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed"], "name": "New Webhook", "url": "https://url.example.com" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3973b754-ff4a-462b-9b34-c129e2217477/workspaces/4a8d28a3-887f-451e-927a-d7366b31fedc/webhooks")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete webhook DELETE https://api.frame.io/v4/accounts/{account_id}/webhooks/{webhook_id} Delete a webhook.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/webhooks/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/webhooks/{webhook_id}: delete: operationId: delete summary: Delete webhook description: >- Delete a webhook.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_webhooks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: webhook_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.webhooks.delete("f7df1a71-8f0f-4b6f-ab70-f58768d0ab63", "74e0344b-c174-495b-a805-0c2cd352b7fb"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.webhooks.delete( account_id="f7df1a71-8f0f-4b6f-ab70-f58768d0ab63", webhook_id="74e0344b-c174-495b-a805-0c2cd352b7fb", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/f7df1a71-8f0f-4b6f-ab70-f58768d0ab63/webhooks/74e0344b-c174-495b-a805-0c2cd352b7fb")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List webhooks GET https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/webhooks List webhooks for the given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/webhooks/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooks: get: operationId: index summary: List webhooks description: >- List webhooks for the given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_webhooks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdWebhooksGetParametersInclude - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhooksWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWorkspacesWorkspaceIdWebhooksGetParametersInclude: type: string enum: - creator description: Include query parameter for webhooks title: V4AccountsAccountIdWorkspacesWorkspaceIdWebhooksGetParametersInclude RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount WebhookEvents: type: array items: type: string title: WebhookEvents User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User WebhookWithIncludes: type: object properties: active: type: boolean description: Webhook active status created_at: type: string format: date-time events: $ref: '#/components/schemas/WebhookEvents' id: type: string format: uuid description: Webhook ID name: type: string description: Webhook Name updated_at: type: string format: date-time url: type: string workspace_id: type: - string - 'null' format: uuid description: Workspace ID creator: $ref: '#/components/schemas/User' required: - created_at - events - id - name - updated_at - url title: WebhookWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links WebhooksWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/WebhookWithIncludes' links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io webhooks title: WebhooksWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.webhooks.index("bb2e424e-7ae7-4120-b911-b679df690d7b", "64ea07d8-aa87-422d-b0fb-29203e17db0a", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.webhooks.index( account_id="bb2e424e-7ae7-4120-b911-b679df690d7b", workspace_id="64ea07d8-aa87-422d-b0fb-29203e17db0a", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/bb2e424e-7ae7-4120-b911-b679df690d7b/workspaces/64ea07d8-aa87-422d-b0fb-29203e17db0a/webhooks")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show webhook GET https://api.frame.io/v4/accounts/{account_id}/webhooks/{webhook_id} Show webhook details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/webhooks/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/webhooks/{webhook_id}: get: operationId: show summary: Show webhook description: >- Show webhook details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_webhooks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: webhook_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWebhooksWebhookIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhookWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWebhooksWebhookIdGetParametersInclude: type: string enum: - creator description: Include query parameter for webhooks title: V4AccountsAccountIdWebhooksWebhookIdGetParametersInclude WebhookEvents: type: array items: type: string title: WebhookEvents User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User WebhookWithIncludes: type: object properties: active: type: boolean description: Webhook active status created_at: type: string format: date-time events: $ref: '#/components/schemas/WebhookEvents' id: type: string format: uuid description: Webhook ID name: type: string description: Webhook Name updated_at: type: string format: date-time url: type: string workspace_id: type: - string - 'null' format: uuid description: Workspace ID creator: $ref: '#/components/schemas/User' required: - created_at - events - id - name - updated_at - url title: WebhookWithIncludes WebhookWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/WebhookWithIncludes' required: - data title: WebhookWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.webhooks.show("78bd205e-b674-4efa-bd72-be62f6f389c9", "8adae94f-5d2c-4124-98a7-0cab0e0e6ab1", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.webhooks.show( account_id="78bd205e-b674-4efa-bd72-be62f6f389c9", webhook_id="8adae94f-5d2c-4124-98a7-0cab0e0e6ab1", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/78bd205e-b674-4efa-bd72-be62f6f389c9/webhooks/8adae94f-5d2c-4124-98a7-0cab0e0e6ab1")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update webhook PATCH https://api.frame.io/v4/accounts/{account_id}/webhooks/{webhook_id} Content-Type: application/json Update webhook details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/webhooks/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/webhooks/{webhook_id}: patch: operationId: update summary: Update webhook description: >- Update webhook details.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_webhooks parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: webhook_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhookResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Webhook params content: application/json: schema: $ref: '#/components/schemas/WebhookUpdateParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID WebhookEvents: type: array items: type: string title: WebhookEvents WebhookUpdateParamsData: type: object properties: active: type: boolean description: Webhook active status events: $ref: '#/components/schemas/WebhookEvents' name: type: string url: type: string description: URL where `event` is sent title: WebhookUpdateParamsData WebhookUpdateParams: type: object properties: data: $ref: '#/components/schemas/WebhookUpdateParamsData' required: - data description: Webhook update parameters title: WebhookUpdateParams Webhook: type: object properties: active: type: boolean description: Webhook active status created_at: type: string format: date-time events: $ref: '#/components/schemas/WebhookEvents' id: type: string format: uuid description: Webhook ID name: type: string description: Webhook Name updated_at: type: string format: date-time url: type: string workspace_id: type: - string - 'null' format: uuid description: Workspace ID required: - created_at - events - id - name - updated_at - url title: Webhook WebhookResponse: type: object properties: data: $ref: '#/components/schemas/Webhook' required: - data title: WebhookResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.webhooks.update("3406be6f-ce27-4ea4-afec-b08acc10f5c1", "25b64837-143f-4c22-9c71-852e6ed14ee4", { data: { active: true, events: [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name: "Updated Webhook", url: "https://url.example.com", }, }); } main(); ``` ```python from frameio import Frameio from frameio.webhooks import WebhookUpdateParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.webhooks.update( account_id="3406be6f-ce27-4ea4-afec-b08acc10f5c1", webhook_id="25b64837-143f-4c22-9c71-852e6ed14ee4", data=WebhookUpdateParamsData( active=True, events=[ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed" ], name="Updated Webhook", url="https://url.example.com", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4" payload := strings.NewReader("{\n \"data\": {\n \"active\": true,\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"Updated Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"active\": true,\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"Updated Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"active\": true,\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"Updated Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4', [ 'body' => '{ "data": { "active": true, "events": [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed" ], "name": "Updated Webhook", "url": "https://url.example.com" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"active\": true,\n \"events\": [\n \"file.created\",\n \"file.deleted\",\n \"file.ready\",\n \"file.updated\",\n \"file.upload.completed\",\n \"file.versioned\",\n \"file.copied\",\n \"folder.created\",\n \"folder.deleted\",\n \"folder.updated\",\n \"folder.copied\",\n \"comment.completed\",\n \"comment.created\",\n \"comment.deleted\",\n \"comment.uncompleted\",\n \"comment.updated\",\n \"customfield.created\",\n \"customfield.updated\",\n \"customfield.deleted\",\n \"metadata.value.updated\",\n \"project.created\",\n \"project.deleted\",\n \"project.updated\",\n \"collection.created\",\n \"collection.updated\",\n \"collection.deleted\",\n \"share.created\",\n \"share.updated\",\n \"share.deleted\",\n \"share.viewed\"\n ],\n \"name\": \"Updated Webhook\",\n \"url\": \"https://url.example.com\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": [ "active": true, "events": ["file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed"], "name": "Updated Webhook", "url": "https://url.example.com" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3406be6f-ce27-4ea4-afec-b08acc10f5c1/webhooks/25b64837-143f-4c22-9c71-852e6ed14ee4")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List workspace user roles GET https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/users List user roles for a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspace-permissions/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/users: get: operationId: index summary: List workspace user roles description: >- List user roles for a given workspace.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_workspacePermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include_deactivated in: query description: >- Supports including deactivated users in the response. Default is false. required: false schema: type: boolean - name: sort in: query description: Sort users by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdUsersGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WorkspaceUserRolesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWorkspacesWorkspaceIdUsersGetParametersSort: type: string enum: - role_asc - role_desc - name_asc - name_desc - email_asc - email_desc description: Sort query parameter for users title: V4AccountsAccountIdWorkspacesWorkspaceIdUsersGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount WorkspaceUserRoleRole: type: string enum: - full_access - editor - edit_only - commenter - viewer - admin - owner - workspace_admin title: WorkspaceUserRoleRole User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User WorkspaceUserRole: type: object properties: role: $ref: '#/components/schemas/WorkspaceUserRoleRole' user: $ref: '#/components/schemas/User' required: - role - user description: Frame.io Workspace User Role title: WorkspaceUserRole Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links WorkspaceUserRolesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/WorkspaceUserRole' description: User Roles links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io workspace user role details title: WorkspaceUserRolesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspacePermissions.index("ad32b3d9-8785-4aa0-a763-eea5b48bde04", "60e6b929-5309-4d86-9b77-fe11764c9619", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspace_permissions.index( account_id="ad32b3d9-8785-4aa0-a763-eea5b48bde04", workspace_id="60e6b929-5309-4d86-9b77-fe11764c9619", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/ad32b3d9-8785-4aa0-a763-eea5b48bde04/workspaces/60e6b929-5309-4d86-9b77-fe11764c9619/users")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Remove a user from a given workspace DELETE https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/users/{user_id} Remove a user from a given workspace.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspace-permissions/workspace-user-roles-delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/users/{user_id}: delete: operationId: workspace-user-roles-delete summary: Remove a user from a given workspace description: >- Remove a user from a given workspace.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_workspacePermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspacePermissions.workspaceUserRolesDelete("e0090d59-5a60-4fa4-8d5f-cb85e4eef213", "d7dacc61-22e2-4169-b56f-3f2708c6d7b1", "89cddae9-17b9-44eb-94d3-42a11a3d87e4"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspace_permissions.workspace_user_roles_delete( account_id="e0090d59-5a60-4fa4-8d5f-cb85e4eef213", workspace_id="d7dacc61-22e2-4169-b56f-3f2708c6d7b1", user_id="89cddae9-17b9-44eb-94d3-42a11a3d87e4", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/e0090d59-5a60-4fa4-8d5f-cb85e4eef213/workspaces/d7dacc61-22e2-4169-b56f-3f2708c6d7b1/users/89cddae9-17b9-44eb-94d3-42a11a3d87e4")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update user roles for the given workspace PATCH https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id}/users/{user_id} Content-Type: application/json Update user roles for the given workspace if the user is already added to the workspace. If the user is not added to the workspace, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspace-permissions/workspace-user-roles-update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}/users/{user_id}: patch: operationId: workspace-user-roles-update summary: Update user roles for the given workspace description: >- Update user roles for the given workspace if the user is already added to the workspace. If the user is not added to the workspace, the user will be added with the given role.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_workspacePermissions parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: user_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UpdateWorkspaceRoleResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Update user roles params body content: application/json: schema: $ref: '#/components/schemas/UpdateWorkspaceRoleParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID WorkspaceRole: type: string enum: - workspace_admin - full_access - editor - edit_only - commenter - viewer description: A workspace role. title: WorkspaceRole UpdateWorkspaceRoleParamsData: type: object properties: role: $ref: '#/components/schemas/WorkspaceRole' required: - role title: UpdateWorkspaceRoleParamsData UpdateWorkspaceRoleParams: type: object properties: data: $ref: '#/components/schemas/UpdateWorkspaceRoleParamsData' required: - data description: Update workspace role params title: UpdateWorkspaceRoleParams UpdateWorkspaceRoleResponseData: type: object properties: role: $ref: '#/components/schemas/WorkspaceRole' title: UpdateWorkspaceRoleResponseData UpdateWorkspaceRoleResponse: type: object properties: data: $ref: '#/components/schemas/UpdateWorkspaceRoleResponseData' required: - data title: UpdateWorkspaceRoleResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspacePermissions.workspaceUserRolesUpdate("5c7c3a33-7df2-4103-aab6-7ed81263abfa", "d7056e96-3c5e-4a0e-8635-8721a1631c9c", "afebb798-3400-4758-b590-84894f08495c", { data: { role: "editor", }, }); } main(); ``` ```python from frameio import Frameio from frameio.workspace_permissions import UpdateWorkspaceRoleParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspace_permissions.workspace_user_roles_update( account_id="5c7c3a33-7df2-4103-aab6-7ed81263abfa", workspace_id="d7056e96-3c5e-4a0e-8635-8721a1631c9c", user_id="afebb798-3400-4758-b590-84894f08495c", data=UpdateWorkspaceRoleParamsData( role="editor", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c" payload := strings.NewReader("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"role\": \"editor\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"role\": \"editor\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c', [ 'body' => '{ "data": { "role": "editor" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"role\": \"editor\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["role": "editor"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/5c7c3a33-7df2-4103-aab6-7ed81263abfa/workspaces/d7056e96-3c5e-4a0e-8635-8721a1631c9c/users/afebb798-3400-4758-b590-84894f08495c")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create workspace POST https://api.frame.io/v4/accounts/{account_id}/workspaces Content-Type: application/json Create workspace from an account.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspaces/create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces: post: operationId: create summary: Create workspace description: >- Create workspace from an account.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_workspaces parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Workspace params content: application/json: schema: $ref: '#/components/schemas/WorkspaceParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId WorkspaceParamsData: type: object properties: name: type: string description: Workspace Name title: WorkspaceParamsData WorkspaceParams: type: object properties: data: $ref: '#/components/schemas/WorkspaceParamsData' required: - data description: Workspace params title: WorkspaceParams Workspace: type: object properties: account_id: type: string format: uuid description: Account ID created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Workspace ID name: type: string description: Workspace Name updated_at: type: string format: date-time description: Updated Timestamp required: - account_id - created_at - id - name - updated_at description: Frame.io workspace title: Workspace WorkspaceResponse: type: object properties: data: $ref: '#/components/schemas/Workspace' required: - data description: Frame.io workspace details title: WorkspaceResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspaces.create("418fca12-41b1-47a0-8c90-8531ddfe381e", { data: { name: "My Workspace", }, }); } main(); ``` ```python from frameio import Frameio, WorkspaceParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspaces.create( account_id="418fca12-41b1-47a0-8c90-8531ddfe381e", data=WorkspaceParamsData( name="My Workspace", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces', [ 'body' => '{ "data": { "name": "My Workspace" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["name": "My Workspace"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/418fca12-41b1-47a0-8c90-8531ddfe381e/workspaces")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Delete workspace DELETE https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id} Delete workspace from account.
Rate Limits: 60 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspaces/delete ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}: delete: operationId: delete summary: Delete workspace description: >- Delete workspace from account.
Rate Limits: 60 calls per 1.00 minute(s) per account_user tags: - subpackage_workspaces parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '204': description: No Content content: application/json: schema: type: object properties: {} '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspaces.delete("4f05ae7d-af46-46d9-8eeb-5f32a643743d", "7cfd1705-94d4-4921-ac40-9d130a814395"); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspaces.delete( account_id="4f05ae7d-af46-46d9-8eeb-5f32a643743d", workspace_id="7cfd1705-94d4-4921-ac40-9d130a814395", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395" req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Delete.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.delete("https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395") .header("Authorization", "Bearer ") .asString(); ``` ```php request('DELETE', 'https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395"); var request = new RestRequest(Method.DELETE); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/4f05ae7d-af46-46d9-8eeb-5f32a643743d/workspaces/7cfd1705-94d4-4921-ac40-9d130a814395")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "DELETE" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List workspaces GET https://api.frame.io/v4/accounts/{account_id}/workspaces List workspaces for a given account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspaces/index ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces: get: operationId: index summary: List workspaces description: >- List workspaces for a given account.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_workspaces parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesGetParametersInclude - name: sort in: query description: Sort workspaces by query params required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesGetParametersSort - name: after in: query description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. required: false schema: $ref: '#/components/schemas/RequestAfterOpaqueCursor' - name: page_size in: query description: '' required: false schema: $ref: '#/components/schemas/RequestPageSize' default: 50 - name: include_total_count in: query description: '' required: false schema: $ref: '#/components/schemas/IncludeTotalCount' default: false - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WorkspacesWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId V4AccountsAccountIdWorkspacesGetParametersInclude: type: string enum: - creator description: Include query parameter for workspaces title: V4AccountsAccountIdWorkspacesGetParametersInclude V4AccountsAccountIdWorkspacesGetParametersSort: type: string enum: - name_asc - created_at_asc - name_desc - created_at_desc description: Sort query parameter for workspaces title: V4AccountsAccountIdWorkspacesGetParametersSort RequestAfterOpaqueCursor: type: string description: > Opaque Cursor query param for requests returning paginated results.
NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. title: RequestAfterOpaqueCursor RequestPageSize: type: integer default: 50 description: Page size query param for requests title: RequestPageSize IncludeTotalCount: type: boolean default: false description: Page query param to include the count of all entities title: IncludeTotalCount User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User WorkspaceWithIncludes: type: object properties: account_id: type: string format: uuid description: Account ID created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Workspace ID name: type: string description: Workspace Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - account_id - created_at - id - name - updated_at description: Frame.io workspace title: WorkspaceWithIncludes Links: type: object properties: next: type: - string - 'null' description: > "Link to next page of data.
This link is the request path with the addition of the `after` query parameter to fetch the next page of results. Optional query parameters `page_size` and `include_total_count` are supported when paginating data." required: - next description: Links to paginated data title: Links WorkspacesWithIncludesResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/WorkspaceWithIncludes' description: Workspaces links: $ref: '#/components/schemas/Links' total_count: type: - integer - 'null' description: Total count required: - data - links description: Frame.io workspace details title: WorkspacesWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspaces.index("3bcf46c5-c239-4e7f-b314-9112ff64e80b", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspaces.index( account_id="3bcf46c5-c239-4e7f-b314-9112ff64e80b", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/3bcf46c5-c239-4e7f-b314-9112ff64e80b/workspaces")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Show workspace GET https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id} Show workspace details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspaces/show ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}: get: operationId: show summary: Show workspace description: >- Show workspace details.
Rate Limits: 100 calls per 1.00 minute(s) per account_user tags: - subpackage_workspaces parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: include in: query description: '' required: false schema: $ref: >- #/components/schemas/V4AccountsAccountIdWorkspacesWorkspaceIdGetParametersInclude - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WorkspaceWithIncludesResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID V4AccountsAccountIdWorkspacesWorkspaceIdGetParametersInclude: type: string enum: - creator description: Include query parameter for workspaces title: V4AccountsAccountIdWorkspacesWorkspaceIdGetParametersInclude User: type: object properties: active: type: - boolean - 'null' description: User active status adobe_user_id: type: - string - 'null' description: Adobe user ID avatar_url: type: - string - 'null' description: User avatar image url email: type: string description: User email id: type: - string - 'null' description: User ID - can be null for invited users with no frame account name: type: - string - 'null' description: User name required: - active - avatar_url - email - id - name description: User details title: User WorkspaceWithIncludes: type: object properties: account_id: type: string format: uuid description: Account ID created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Workspace ID name: type: string description: Workspace Name updated_at: type: string format: date-time description: Updated Timestamp creator: $ref: '#/components/schemas/User' required: - account_id - created_at - id - name - updated_at description: Frame.io workspace title: WorkspaceWithIncludes WorkspaceWithIncludesResponse: type: object properties: data: $ref: '#/components/schemas/WorkspaceWithIncludes' required: - data description: Frame.io workspace details with includes title: WorkspaceWithIncludesResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspaces.show("ad2b7ce5-39f3-473b-b74a-cb10f380b8db", "dd455013-657c-49ff-8bc9-1ecce97d6113", {}); } main(); ``` ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspaces.show( account_id="ad2b7ce5-39f3-473b-b74a-cb10f380b8db", workspace_id="dd455013-657c-49ff-8bc9-1ecce97d6113", ) ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/ad2b7ce5-39f3-473b-b74a-cb10f380b8db/workspaces/dd455013-657c-49ff-8bc9-1ecce97d6113")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Update workspace PATCH https://api.frame.io/v4/accounts/{account_id}/workspaces/{workspace_id} Content-Type: application/json Update a workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user Reference: https://next.developer.frame.io/platform/api-reference/workspaces/update ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v4 version: 1.0.0 paths: /v4/accounts/{account_id}/workspaces/{workspace_id}: patch: operationId: update summary: Update workspace description: >- Update a workspace.
Rate Limits: 10 calls per 1.00 minute(s) per account_user tags: - subpackage_workspaces parameters: - name: account_id in: path description: '' required: true schema: $ref: '#/components/schemas/FrameOrAdobeId' - name: workspace_id in: path description: '' required: true schema: $ref: '#/components/schemas/UUID' - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/BadRequest' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Unauthorized' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Forbidden' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/NotFound' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Conflict' '422': description: Unprocessable content content: application/json: schema: $ref: '#/components/schemas/UnprocessableContent' '429': description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequests' requestBody: description: Workspace params content: application/json: schema: $ref: '#/components/schemas/WorkspaceParams' servers: - url: https://api.frame.io components: schemas: FrameOrAdobeId: type: string description: >- A Frame.io or Adobe entity identifier. Typically a Frame.io UUID. But for accounts, projects, folders, files, and version stacks that reside in Adobe cloud storage, which is the case for Workfront-connected accounts and projects, an Adobe-assigned id may also be used interchangeably. These ids must be prefixed with `adobe:` (e.g. `adobe:` for an account, `adobe:` for a project or folder, `adobe:`adobe:|` for a file asset). title: FrameOrAdobeId UUID: type: string format: uuid description: A UUID string that uniquely identifies a Frame.io entity. title: UUID WorkspaceParamsData: type: object properties: name: type: string description: Workspace Name title: WorkspaceParamsData WorkspaceParams: type: object properties: data: $ref: '#/components/schemas/WorkspaceParamsData' required: - data description: Workspace params title: WorkspaceParams Workspace: type: object properties: account_id: type: string format: uuid description: Account ID created_at: type: string format: date-time description: Created Timestamp id: type: string format: uuid description: Workspace ID name: type: string description: Workspace Name updated_at: type: string format: date-time description: Updated Timestamp required: - account_id - created_at - id - name - updated_at description: Frame.io workspace title: Workspace WorkspaceResponse: type: object properties: data: $ref: '#/components/schemas/Workspace' required: - data description: Frame.io workspace details title: WorkspaceResponse BadRequestErrorsItemsSource: type: object properties: pointer: type: string title: BadRequestErrorsItemsSource BadRequestErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/BadRequestErrorsItemsSource' title: type: string required: - detail title: BadRequestErrorsItems BadRequest: type: object properties: errors: type: array items: $ref: '#/components/schemas/BadRequestErrorsItems' required: - errors title: BadRequest UnauthorizedErrorsItemsSource: type: object properties: pointer: type: string title: UnauthorizedErrorsItemsSource UnauthorizedErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnauthorizedErrorsItemsSource' title: type: string required: - detail title: UnauthorizedErrorsItems Unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnauthorizedErrorsItems' required: - errors title: Unauthorized ForbiddenErrorsItemsSource: type: object properties: pointer: type: string title: ForbiddenErrorsItemsSource ForbiddenErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ForbiddenErrorsItemsSource' title: type: string required: - detail title: ForbiddenErrorsItems Forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/ForbiddenErrorsItems' required: - errors title: Forbidden NotFoundErrorsItemsSource: type: object properties: pointer: type: string title: NotFoundErrorsItemsSource NotFoundErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/NotFoundErrorsItemsSource' title: type: string required: - detail title: NotFoundErrorsItems NotFound: type: object properties: errors: type: array items: $ref: '#/components/schemas/NotFoundErrorsItems' required: - errors title: NotFound ConflictErrorsItemsSource: type: object properties: pointer: type: string title: ConflictErrorsItemsSource ConflictErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/ConflictErrorsItemsSource' title: type: string required: - detail title: ConflictErrorsItems Conflict: type: object properties: errors: type: array items: $ref: '#/components/schemas/ConflictErrorsItems' required: - errors title: Conflict UnprocessableContentErrorsItemsSource: type: object properties: pointer: type: string title: UnprocessableContentErrorsItemsSource UnprocessableContentErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/UnprocessableContentErrorsItemsSource' title: type: string required: - detail title: UnprocessableContentErrorsItems UnprocessableContent: type: object properties: errors: type: array items: $ref: '#/components/schemas/UnprocessableContentErrorsItems' required: - errors title: UnprocessableContent TooManyRequestsErrorsItemsSource: type: object properties: pointer: type: string title: TooManyRequestsErrorsItemsSource TooManyRequestsErrorsItems: type: object properties: detail: type: string source: $ref: '#/components/schemas/TooManyRequestsErrorsItemsSource' title: type: string required: - detail title: TooManyRequestsErrorsItems TooManyRequests: type: object properties: errors: type: array items: $ref: '#/components/schemas/TooManyRequestsErrorsItems' required: - errors title: TooManyRequests securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript import { FrameioClient } from "frameio"; async function main() { const client = new FrameioClient({ token: "YOUR_TOKEN_HERE", }); await client.workspaces.update("5b99ae0e-7559-4e7d-95e6-3de745b4d00b", "5c9b1f8c-3f45-483b-8a79-18537780664d", { data: { name: "My Workspace", }, }); } main(); ``` ```python from frameio import Frameio, WorkspaceParamsData client = Frameio( token="YOUR_TOKEN_HERE", ) client.workspaces.update( account_id="5b99ae0e-7559-4e7d-95e6-3de745b4d00b", workspace_id="5c9b1f8c-3f45-483b-8a79-18537780664d", data=WorkspaceParamsData( name="My Workspace", ), ) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d" payload := strings.NewReader("{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}") req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.patch("https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}") .asString(); ``` ```php request('PATCH', 'https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d', [ 'body' => '{ "data": { "name": "My Workspace" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d"); var request = new RestRequest(Method.PATCH); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"data\": {\n \"name\": \"My Workspace\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["data": ["name": "My Workspace"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v4/accounts/5b99ae0e-7559-4e7d-95e6-3de745b4d00b/workspaces/5c9b1f8c-3f45-483b-8a79-18537780664d")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PATCH" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Overview > This is the overview page of the Frame.io API ### About Frame.io Frame.io provides a flexible, fast and intuitive platform that empowers creative teams and their stakeholders to organize, review and manage work in progress assets, and orchestrate the people and processes supporting them. Anchored in an all-new, powerful metadata framework, teams can now use Frame.io to customize any creative workflow centered on media assets. ### Frame.io V4 API Requirements To use the endpoints described here, you must first have a provisioned Frame.io V4 account administered via the Adobe Admin Console. If your account is on legacy version of Frame.io, please refer to our [legacy developer documentation](/). ### About Frame.io V4 Developer Platform The Frame.io developer platform has been redesigned from the ground up to make creative collaboration clear and simple. New concepts that will make your creative life easier include relationship-based access controls, custom fields to fit the way your team works, and the simplification of Shares. We designed the brand new API that you interact and build with to best suit our customer and partner needs. In these docs you'll find a comprehensive Getting Started Guide that walks you through core concepts and details the full V4 API surface area, paying special attention to any differences for those migrating from the legacy API. We've also included human and machine-readable *API Reference* documentation. Generated using the Open API specification, developers can refer to the Frame.io *API Reference* for a full list of supported endpoints with sample requests and responses, including error information. The top navigation bar of the website is where new endpoints under active development can be accessed. Developers interested in exploring these *experimental* versions can switch between versions here. Endpoints in this section should be referenced directionally only, as the routes and response bodies are subject to change before their official release under a supported version header. # Getting Started Guide ## Adobe Developer Console The first step in using an Adobe API is to create a **Project** in the Adobe Developer Console. Projects in the Developer Console correspond to an application you are building to consume the Frame.io Developer API. This is distinct from a Project within Frame.io. After creating a Project in the Developer Console, add the Frame.io API to it. ## What's New in the Frame.io V4 Developer API? Just as the Frame.io application has been completely transformed for Version 4, the V4 API has also been redesigned from the ground up. Although some key concepts remain similar to legacy versions, many have been replaced or redesigned to support more powerful collaboration workflows and integrations. The introduction of a completely new API has also provided an opportunity to drastically simplify our operations and prioritize important customer workflows. A comparison between Frame.io V4 and the legacy version is [here](https://help.frame.io/en/articles/9084073-frame-io-v4-legacy-feature-comparison). Within the V4 API, some resources, such as Workspaces (previously referred to as Teams in the legacy version of Frame.io), have been renamed in order to match Frame.io Version 4, while others, like Assets in the legacy version, have been renamed to refer to specific storage entities (Files, Folders, and Version Stacks) in order to reduce developer confusion. Still others, for example Custom Fields and Shares, are entirely new. Among other substantial changes, we have drastically pared down the amount of data returned by default for resource requests, renamed some property names in our responses to be more accurate and consistent across the entire API surface, and switched to a new, cursor-based pagination mechanism. As such, it is important to realize that, with the exception of the Camera to Cloud (C2C) API, clients that integrate with the legacy API are not compatible with the V4 API. Additionally, some features remain in-progress and are expected to follow and evolve quickly in response to real-world customer use cases and feedback. Examples include the ability to create custom actions and version stacks. If a feature that was previously available in our legacy API appears to be missing, it's quite likely that there is an alternative or that it will be available soon, but we'd like to hear from you about it. Before diving into the V4 API it is helpful to first understand the core concepts expressed in the Frame.io Version 4 application. A good place to start is the [Frame.io V4 Knowledge Base](https://help.frame.io/en/). Concepts like Accounts, Users, Workspaces, Projects, Collections, Shares, and Custom Fields (Metadata) are modeled as distinct resources in the V4 API, and understanding their relationships and capabilities in the application will aid in understanding how they work in the V4 API. ## API Overview The Frame.io V4 API is designed to follow RESTful architectural principles, and uses standard HTTP methods and response codes in conjunction with unique, resource-specific URLs. Frame.io publishes an [OpenAPI 3.0 specification](https://api.frame.io/v4/openapi.json) for our V4 API, which provides detailed information about its endpoints, request parameters, and responses. The OpenAPI spec can be consumed by a variety of third-party code-generation tools to facilitate rapid client application development. ### URL and Path Conventions URL paths published in the OpenAPI specification generally reflect resource ownership and containment relationships. As such, some request parameters (e.g. account ids, folder ids, etc.) are embedded within the resource path. While these paths are intended to be predictable and easy-to-understand, the structure of some URLs returned by API requests (e.g. pre-signed upload URLs or display links) may be subject to change, and should never be composed directly by a client application. ### Request Query Parameters Request parameters that control pagination behavior and the optional inclusion of related resources in response objects are defined as a standard set of query parameters: `include`, `page_size`, `include_total_count`. Some requests may support additional query parameters that are specific to that resource or operation. ```html GET https://api.frame.io/v4/accounts/{account_id}/folders/{folder_id}/children?&include=project&page_size=5&include_total_count=true ``` ### Request and Response Payloads Request and response payloads both are composed as JSON objects, and, as such, the content-type header of an HTTP POST, PUT, or PATCH request must specify the `application/json` media type. When creating or updating resources, the `data` property of the request must contain the resource object. Attributes of the resource being created or updated are contained within this object. Similarly, successful responses that include resources will provide these within the `data` property of the response. ### Pagination Responses that may potentially return large numbers of resource objects (e.g folder or comment listings) are paginated in order to reduce request latency as a result set grows large.. This means that the response to a request may only include a single "page" of results. As mentioned above, a client may choose a specific page size, up to a maximum of 100 elements through the `page_size` query parameter when making the request. If left unspecified, the page size will default to 50 elements. The V4 API uses a form of pagination known as *cursor-based pagination* and includes a relative link in the `links` property of the response object (see example below) that contains an opaque (clients should not attempt to construct this string themselves) cursor string in the `after` query parameter, which allows the client to retrieve the next page of results (see example response below) by making subsequent requests. At present, the V4 API only supports unidirectional pagination. ```json { "data": [ { "created_at": "2024-10-02T00:22:44.887775Z", "creator_id": "8ea72912-d40d-4b88-8d31-3762e055a2aa", "file_size": 102432, "id": "df171f3e-c95f-4454-9071-825cd924b572", "media_type": "application/pdf", "name": "sample.pdf", "parent_id": "e183c7ba-07d9-425a-9467-ebdf0223d9ce", "project": { "created_at": "2024-08-21T17:45:41.881596Z", "description": "For demonstration purposes", "id": "976dd413-a92b-4af6-b465-98aded0174a8", "name": "Demo Project", "owner_id": "8ea72912-d40d-4b88-8d31-3762e055a2aa", "root_folder_id": "e183c7ba-07d9-425a-9467-ebdf0223d9ce", "storage": 20881946, "updated_at": "2024-10-02T00:22:47.168489Z", "workspace_id": "378fcbf7-6f88-4224-8139-6a743ed940b2" }, "project_id": "976dd413-a92b-4af6-b465-98aded0174a8", "status": "created", "type": "file", "updated_at": "2024-10-02T00:22:44.927993Z" } ], "links": { "next": "/v4/accounts/6f70f1bd-7e89-4a7e-b4d3-7e576585a181/folders/e183c7ba-07d9-425a-9467-ebdf0223d9ce/children?after=g3QAAAACZAAGb2Zmc2V0YQVkAAR0eXBlZAANb2Zmc2V0X2N1cnNvcg%3D%3D" }, "total_count": 21 } ``` ### Errors In the event that an error occurs, the `errors` property in the response object will contain an array of one or more error objects that provide details about the error(s) that occurred. At present, batch operations are not supported by the V4 API so there are no cases where partial success and errors must be handled by the client. ```json { "errors": [ { "detail": "Unexpected field: foo", "source": { "pointer": "/data/foo" }, "title": "Invalid value" } ] } ``` The following table lists common status codes used by the V4 API. | Status Code | **Status** | Description | | ----------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 200 | OK | Request succeeded. | | 201 | Created | Resource was created. | | 204 | No Content | Resource was deleted. No response payload. | | 400 | Bad Request | The request was invalid, often due to a malformed or missing parameter or payload. | | 401 | Unauthorized | The Authorization token is missing or invalid. | | 403 | Forbidden | The Authorization token doesn't have sufficient permissions for this request. | | 404 | Not Found | The requested resource doesn't exist. | | 422 | Unprocessable Entity | The request payload and/or parameters are well-formed but are otherwise invalid, preventing execution of the request (largely interchangeble with 400 Bad Request). | | 429 | Too Many Requests | The request has exceeded our API rate limit for this account. See Rate Limiting section of the Getting Started guide for details. | | 5xx | Server Errors | An unexpected error was reported by our server. Clients should be wait a minimum of 30 seconds before retrying the event and any automated retries should be limited and include a randomized interval in additonal to employing exponential back-off in successive requests. | ### Authentication and Authorization The V4 API relies on OAuth 2.0 and [Adobe Identity Management Server (IMS)](https://experienceleague.adobe.com/en/docs/commerce-admin/start/admin/ims/adobe-ims-integration-overview) to authenticate a user (AuthN) and generate access tokens on behalf of that user. An access token must be provided with each API request via the HTTP Authorization header (i.e. Bearer token authentication). [Token scopes](https://developer.adobe.com/developer-console/docs/guides/authentication/UserAuthentication/IMS/#scopes) generated by IMS are static, and that authorization (AuthZ), which determines what the user is allowed to do (and what operations can be performed by the API on behalf of that user), is determined by the roles and permissions granted to the user within Frame.io. See Getting Started with the Developer Console and Authentication Setup (under Start Developing with Postman) sections for more detail about generating and requesting access tokens. ### Versions and Backward-Compatibility The Frame.io V4 API is *not* backward-compatible with earlier versions of Frame.io APIs and, generally, cannot be used to access or update resources contained within legacy accounts as there have been significant changes to the V4 concepts and data model. As such, the URIs associated with the V4 API all include a `/v4` path prefix. However, the V4 API is still evolving quickly and it is possible that new features may occasionally warrant breaking changes. More commonly, Frame.io will release new *additions* to the API that we consider to be experimental for some period of time, allowing us to receive and respond to customer feedback and usage metrics. Recognizing that backward-compatibility is a major concern for customers managing production-quality integrations with high uptime requirements, we are designing the V4 API to support an additional level of versioning via a custom HTTP header in order to allow clients to opt into using experimental endpoints, avoid breaking changes, and provide backward-compatibility guarantees within the V4 namespace. More details are forthcoming, but for now it is safe to assume that the initial release of the V4 API is considered to be stable and that it will be some time before we contemplate introducing breaking changes. ### Rate Limiting All V4 API calls are rate-limited, and each API resource and operation is configured with its own limit, The limits range from as low as 10 requests per minute to as high as 100 requests per second. At present, each limit is enforced by *user,* but the policies and limits themselves are subject to change. The V4 API uses a "[leaky bucket](https://wikipedia.org/wiki/Leaky_bucket)" algorithm of progressive rate limiting, in which limits refresh gradually during their allotted time window. In other words, there is not a concept of any hard cutoff after which limits refresh for a particular resource (i.e. "fixed" and "sliding window" enforcement strategies). Rather, remaining limits are constantly refreshing at a pace relative to a resource's limit and time window. Requests that exceed the rate limit for a particular endpoint will fail with a 429 HTTP error. Our recommended strategy for responding to 429 errors is usually referred to as "exponential back-off." In short: * When receiving a `429`, pause for a period (at least one second) before retrying the request * If another `429` is received, exponentially increase, or at least double, the previous wait period until normal function resumes In order to determine the rate limits that apply to a particular request, clients may inspect the the following HTTP headers returned in the response: | Header | Value Description | | ----------------------- | ------------------------------------------------------------------------------- | | `x-ratelimit-limit` | The rate limit for this resource path, measured in requests. | | `x-ratelimit-remaining` | The number of requests remaining in the current time window. | | `x-ratelimit-window` | The time window for this resource path's limits, measured in milliseconds (ms). | ## API Details The definitive documentation to the V4 API is our [API Reference Guide](../api/current/), but understanding the resource hierarchy as modeled by the V4 API will be helpful before issuing your first requests. ### Resource Hierarchy An [Account](https://help.frame.io/en/collections/8779087-account-settings) is typically associated with an organization and represents the fundamental resource that determines a subscription plan, content ownership, user roles / permissions, and Workspace organization. As such, the URL path to almost all of the endpoints in the V4 API include a prefix that identifies the Account in which the resource resides. Workspaces (previously called Teams in the legacy version of Frame.io) and [Projects](https://help.frame.io/en/articles/9101006-project-settings) are used to organize both content and users, including who has access to what content. The basic hierarchy of content resources within Frame.io is as follows: **Account → Workspace → Project → Folder → Folder / Version Stack / File** Every asset uploaded to Frame.io is ultimately represented as a [File](https://help.frame.io/en/articles/9436564-supported-file-types-on-frame-io), while [Folders](https://help.frame.io/en/articles/9101044-creating-folders) and [Version Stacks](https://help.frame.io/en/articles/9101068-version-stacking) are storage resources that act as containers and provide the foundation for a hierarchical storage model that supports versioned assets. Most users are already familiar with the basic concept of a Folder in Frame.io: it simply serves as unordered container of other storage resources (modeled as its `children`) and represents a node within the folder tree. Every Project has a unique root folder (identified by the `root_folder_id` key), which serves as the root of the folder tree in which all of a Project's assets reside. A Version Stack is an ordered container of Files. Its ordering is strictly linear and determines a version number for each of its children, but clients may reorder the Files within the version stack as they see fit. A File will always be a child of (contained within) exactly one Folder *or* Version Stack at any given time. Similarly, a Folder or Version Stack will always be a child of exactly one Folder (excluding the Project's root folder). See the [API Reference Guide](../api/current/) for more detail about performing basic CRUD operations on Files and Folders stored within Frame.io. At present the V4 API only supports Version Stacks when listing the contents of a Folder, but endpoints for creating and updating Version Stacks are coming soon. ## SDKs SDKs are available for TypeScript and Python. You can install them using the commands below. The SDK Reference section of the documentation has full references for the [Python](/platform/docs/sdk-reference/python-sdk-reference) and [TypeScript](/platform/docs/sdk-reference/typescript-sdk-reference) SDKs. ### TypeScript ```bash npm i -s frameio ``` View on [npm](https://www.npmjs.com/package/frameio) ### Python ```bash pip install frameio ``` View on [PyPi](https://pypi.org/project/frameio/) # Quick Start This guide covers the fastest path to your first successful Frame.io V4 API call. You’ll create a project in the Adobe Developer Console, generate credentials, and make your first API request. *** ## Step 1: Create a Project in Your Adobe Developer Console + Add the Frame.io V4 API From the [Adobe Developer Console](https://developer.adobe.com/developer-console/), create a new project, and add the Frame.io V4 API. *** This guide uses OAuth 2.0 Web App for authentication. For information on other authentication methods, see the **[Authentication Guide](guides/authentication/overview)** ## Step 2: Configure Your Application Select OAuth Web App as your application type, and set your redirect fields. | | | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Redirect URI** | A route in your application that receives the OAuth response from Adobe IMS. After a user signs in and approves access, Adobe IMS redirects them to this URL with an authorization code in the query string, which your app then exchanges for an access token | | **Redirect URI pattern** | Patterns that match additional redirect URLs beyond the default redirect URI. This is useful if your app runs in multiple environments or uses dynamic routing. Multiple patterns should be provided as a comma-separated list | *** ## Step 3: Authentication Start the OAuth flow by redirecting the user to the Adobe IMS authorization endpoint: ``` https://ims-na1.adobelogin.com/ims/authorize/v2 ?client_id={CLIENT_ID} &redirect_uri={REDIRECT_URI} &scope=offline_access,openid,email,profile,additional_info.roles &response_type=code ``` After the user signs in and approves access, Adobe IMS redirects them back to your configured redirect URI with an authorization code in the query string. Exchange that code for an access token by sending a POST request to the IMS token endpoint.
Here is a list of parameter definitions along with an example request and response: | Parameter | Mandatory | Description | | ----------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **code** | Yes | The value of the code query string returned to your `redirect_uri` when a user authenticates with your application | | **grant\_type** | Yes | Value should always be `authorization_code` | | **authorization** | Required for confidential clients | The `Basic` auth header string. It is the literal word `Basic` followed by the Base64-encoded string of your `clientID:clientSecret` | **Example Request** ``` curl -X POST 'https://ims-na1.adobelogin.com/ims/token/v3' \ -H 'Authorization: Basic {AUTHORIZATION}' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'code={CODE}&grant_type=authorization_code' ``` **Example Response** ``` { "access_token": "{ACCESS_TOKEN}", "refresh_token": "{REFRESH_TOKEN}", "sub": "B0DC108C5CD449CA0A494133@c62f24cc5b5b7e0e0a494004", "id_token": "{ID_TOKEN}", "token_type": "bearer", "expires_in": 86399 } ``` Both the Python and TypeScript SDKs include authentication modules that handle the OAuth handshake, token exchange, and automatic token refresh. You can find more on each here: [**Python**](/platform/docs/sdk-reference/python-sdk-reference) | [**TypeScript**](/platform/docs/sdk-reference/type-script-sdk-reference) *** ## Step 4: Make Your First API Requests With your access token, start by calling the [`/v4/me`](/platform/api-reference/users/show) endpoint: ``` curl https://api.frame.io/v4/me \ -H "Authorization: Bearer " ``` This request calls the **Adobe IMS API** to verify your token and user information. A successful request returns details about the authenticated user, including `user_id`, name, and email. Use this to confirm that your authentication flow is working as expected. Most V4 API endpoints require an `account_id`, which is not returned by `/v4/me`. To get your `account_id`, make a request to [`/v4/accounts`](/platform/api-reference/accounts/index): ``` curl https://api.frame.io/v4/accounts \ -H "Authorization: Bearer " ``` This returns the list of accounts available to the authenticated user. Use the `account_id` from this response in subsequent API requests. Your **`user_id`** identifies you as an individual, and your **`account_id`** represents the organization you belong to. Most V4 endpoints operate at the account level. *** ## Next Steps With authentication in place and your `account_id`, you’re ready to start working with the Frame.io API. These resources can help you get started:
  • [Authentication Guide](/platform/docs/guides/authentication/overview)
  • [Accounts, Projects, and Workspaces](/platform/v4/docs/guides/accounts-projects-and-workspaces)
  • [API Reference](/platform/v4/api-reference/account-permissions/index)
  • [Postman Collection](/platform/docs/guides/postman-collection)
# Authentication The Frame.io V4 API uses [Adobe Identity Management Service (IMS)](https://developer.adobe.com/developer-console/docs/guides/authentication/), Adobe's OAuth 2.0 identity platform. There are two categories of authentication: Lets technical or service account users take action without user interaction. Only available to Frame.io V4 accounts administered via the [Adobe Admin Console](https://adminconsole.adobe.com). Acts as the user whose token it is. Available to all Frame.io V4 accounts administered via the Adobe Admin Console, as well as Frame-managed accounts that have [switched to Adobe Authentication](https://help.frame.io/en/articles/11758018-connecting-to-adobe-authentication). *** ## SDK Authentication Guides The Frame.io SDKs handle the full OAuth lifecycle for you — authorization URLs, token exchange, automatic refresh, and revocation. Choose your language to get started: `ServerToServerAuth`, `WebAppAuth`, and `SPAAuth` with sync and async support. `ServerToServerAuth`, `WebAppAuth`, `SPAAuth`, and `NativeApp` authentication for Node.js and browser environments. If you're building a backend service or automation, start with **Server-to-Server**. If your app has users who sign in, choose **Web App** (if you can store a client secret) or **SPA** (if you can't). *** ## User Authentication User authentication credentials are created in the [Adobe Developer Console](https://developer.adobe.com/console). Adobe supports three credential types — choose the one that matches your application architecture: For server-side applications that can securely store a client secret (Flask, Django, FastAPI, Express, etc.). For browser-based applications, CLIs, or desktop apps that cannot store a client secret. Uses PKCE. For native mobile or desktop apps that use custom URI scheme redirects. The Frame.io Python SDK does not include a Native App credential class, since Python has no standard way to register custom URI scheme handlers. Use **Web App** with a local callback server instead. The TypeScript SDK supports all three credential types. *** ## Server-to-Server Authentication Server-to-server authentication lets your application act as a **service account user** — no human in the loop. Your app authenticates with client credentials and receives an access token directly. Service account actions are visible in Frame.io under the service account's name. Service account access is managed through the [Adobe Admin Console](https://adminconsole.adobe.com/) and [Developer Console](https://developer.adobe.com/console). The service account name is currently not able to be adjusted. See the SDK-specific guides above for implementation details. See [Automate your setup using Frame.io server to server support](https://helpx.adobe.com/enterprise/using/automate-using-frame-io.html) for more on service account setup. *** ## How Adobe IMS Authentication Works Adobe Identity Management Service (IMS) is Adobe's OAuth 2.0-based identity management feature that supports authentication. There are two steps required for generating the access token: First, the user authorizes the application before a token is generated. Details are [here](https://developer.adobe.com/developer-console/docs/guides/authentication/UserAuthentication/ims/#authorize-request). Next, fetch the access token. The above step returns a code in the response body needed in this step. See the exact endpoints to access, and the parameters to use, [here](https://developer.adobe.com/developer-console/docs/guides/authentication/UserAuthentication/ims/#fetching-access-tokens). The above steps are required for all three types of app credentials. There are differences in the way the IMS endpoints `/authorize/v2` and `/token/v3` are accessed to get the token. After you have the access token, you can use it to interact with the Frame.io V4 API. For **Server-to-Server** authentication, there is no user authorization step — the application uses client credentials directly to obtain an access token via the `client_credentials` grant. ### Using the Access Token Once you have an access token, include it in the `Authorization` header of every API request: ``` Authorization: Bearer ``` The Frame.io SDKs handle this for you — just pass the token (or a token-supplying callable) when creating the client. ### Token TTL Access tokens are **short-lived** — they typically expire in 1 hour. For user authentication flows (Web App, SPA, Native App), Adobe IMS also returns a **refresh token** that can be used to obtain a new access token without requiring the user to sign in again. Refresh tokens are longer-lived but will eventually expire as well. For Server-to-Server authentication, there are no refresh tokens. The client credentials themselves never expire (unless manually rotated), so the application can always request a new access token. The Frame.io SDKs handle token refresh automatically — see the [SDK-specific guides](#sdk-authentication-guides) for details. ### Scopes When creating credentials in the [Adobe Developer Console](https://developer.adobe.com/console), you'll configure OAuth scopes that determine what your application can access. The Frame.io SDKs use the following default scopes: | Flow | Default Scopes | | -------------------------------------------------- | ----------------------------------------------------------- | | **Server-to-Server** | `openid AdobeID frame.s2s.all` | | **User Authentication** (Web App, SPA, Native App) | `openid email profile offline_access additional_info.roles` | The `offline_access` scope is required for user authentication flows to receive a refresh token. Without it, you'll only get an access token and users will need to re-authenticate when it expires. *** ## Legacy Developer Tokens For V4-migrated accounts that are **not yet administered via the [Adobe Admin Console](https://adminconsole.adobe.com/)**, you can continue to use Legacy Developer Tokens managed in the [Frame.io developer site](https://developer.frame.io/app/tokens). Pass the token directly to the SDK: ```python from frameio import Frameio client = Frameio( token="YOUR_LEGACY_DEVELOPER_TOKEN", headers={"x-frameio-legacy-token-auth": "true"}, ) ``` When using a legacy developer token with the V4 API, you must add the `x-frameio-legacy-token-auth` header with a value of `true` to all API requests. If you're using the SDK, set it via the client's request options. Legacy developer tokens do not expire, but they are a transitional mechanism. For new integrations and production workloads, we recommend using one of the OAuth 2.0 flows below. See the [Migration Guide](/platform/docs/resources/migration#authentication) for details. If you are an Enterprise customer migrating from Frame.io Legacy to V4, please reach out to your CSM for help in getting set up with the legecy developer token & V4 See the [Migration Guide](/platform/docs/resources/migration#authentication) for details on transitioning from legacy tokens to Adobe IMS authentication. # Frame.io Python SDK — Authentication Guide This guide explains how to authenticate with the Frame.io API using the **Frame.io Python SDK** (`frameio`). The Frame.io V4 API uses [Adobe Identity Management Service (IMS)](https://developer.adobe.com/developer-console/docs/guides/authentication/), Adobe's OAuth 2.0 identity platform. This is a standalone reference for Python developers. All code examples and flows below are for the `frameio` package only. *** ## Authentication Types in the Python SDK The Python SDK supports four authentication options: | Method | Use case | User interaction? | Requires client secret? | | -------------------- | -------------------------------------------------------- | ----------------- | ----------------------- | | **Static token** | Quick scripts, testing, or you already have a token | No | No | | **Server-to-Server** | Backend services, cron jobs, automation | No | Yes | | **Web App** | Server-side apps (Flask, Django, FastAPI) | Yes | Yes | | **SPA (PKCE)** | Browser apps, CLIs, or any app that can't store a secret | Yes | No | **Server-to-Server** lets your app act as a service account with no user interaction. It's only available to Frame.io V4 accounts administered via the [Adobe Admin Console](https://adminconsole.adobe.com/). **Web App** and **SPA** let your app act as a specific user. Both use Adobe IMS under the hood: the user authorizes your app, and the SDK exchanges the resulting code for tokens. The Python SDK handles the IMS `/authorize/v2` and `/token/v3` flow for you. For Web App you need a client secret; for SPA you use [PKCE](https://datatracker.ietf.org/doc/html/rfc7636) instead. Adobe's [Native App credential](https://developer.adobe.com/developer-console/docs/guides/authentication/UserAuthentication/implementation/#oauth-native-app-credential) requires custom URI scheme handlers (e.g. `adobe+://…`) that intercept redirects at the OS level. Python has no standard way to register such handlers, so the Python SDK does not offer a `NativeAppAuth` class. For user-interactive Python apps, use `WebAppAuth` with a local callback server (e.g. Flask or FastAPI). For non-interactive workloads, use `ServerToServerAuth`. *** ## Service Account Users When you use Server-to-Server authentication, your application acts as a **service account user**, a distinct account type that can perform actions on behalf of the service. These are visible to other users in Frame.io: when a service account takes an action, its name is displayed in the UI. You can grant and revoke service account access through the [Adobe Admin Console](https://adminconsole.adobe.com/) and [Developer Console](https://developer.adobe.com/console). Service account names are managed from the Frame.io UI. By default, your first S2S connection is named **Service Account User**, the second **Service Account User 2**, and so on. See [Automate your setup using Frame.io server to server support](https://helpx.adobe.com/enterprise/using/automate-using-frame-io.html) for more information. *** ## Quick Start ### Prerequisites 1. **Credentials** from the [Adobe Developer Console](https://developer.adobe.com/console): * **Client ID** — required for all OAuth flows * **Client Secret** — required for Server-to-Server and Web App flows * **Redirect URI** — required for Web App and SPA flows; must be registered in your Adobe project 2. **Install the SDK:** ```bash pip install frameio ``` ### Choosing a method * **No user involved?** Use **Server-to-Server** (`ServerToServerAuth`). * **User involved and you can store a secret?** Use **Web App** (`WebAppAuth`). * **User involved but you can't store a secret?** Use **SPA** (`SPAAuth`). *** ## Access Token If you already have an access token (from another OAuth system or a prior exchange, e.g. via our [API Explorer](/platform/api-reference/accounts/index?explorer=true)) you can pass it directly: ```python from frameio import Frameio client = Frameio(token="YOUR_ACCESS_TOKEN") ``` This is the simplest approach, but the token will eventually expire and the SDK won't refresh it for you. ### Legacy Developer Tokens For V4-migrated accounts not yet administered via the [Adobe Admin Console](https://adminconsole.adobe.com/), you can continue to use Legacy Developer Tokens from the [Frame.io developer site](https://developer.frame.io/app/tokens). You must include the `x-frameio-legacy-token-auth` header and set it to `true`: ```python from frameio import Frameio client = Frameio( token="YOUR_LEGACY_DEVELOPER_TOKEN", headers={"x-frameio-legacy-token-auth": "true"}, ) ``` Legacy developer tokens do not expire, but they are a transitional mechanism. For new integrations and production workloads, we recommend using one of the OAuth 2.0 flows below. See the [Migration Guide](/platform/docs/resources/migration#authentication) for details. *** ## Server-to-Server (Client Credentials) Use this for backend services and scripts that need Frame.io access without user interaction. This flow is only available to Frame.io V4 accounts administered via the [Adobe Admin Console](https://adminconsole.adobe.com/). Your application authenticates as a [service account user](#service-account-users) with no human in the loop. ```python from frameio import Frameio from frameio.auth import ServerToServerAuth auth = ServerToServerAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", ) client = Frameio(token=auth.get_token) ``` ```python from frameio import AsyncFrameio from frameio.auth import AsyncServerToServerAuth auth = AsyncServerToServerAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", ) client = AsyncFrameio(token=auth.get_token) ``` That's it. `auth.get_token` is a callable that the SDK invokes on every request. If the current token is still valid, it returns immediately. If it's about to expire, it fetches a new one first, completely transparently. ### How it works Your client credentials (client ID + secret) **never expire**. You only rotate them manually for security hygiene. S2S gives you effectively permanent, uninterrupted API access with zero manual intervention. Under the hood: 1. On the first API call, `get_token` requests a new access token from Adobe IMS using the `client_credentials` grant. 2. The token is cached in memory. Individual access tokens expire (typically 24 hours), but this is handled for you. 3. When a cached token is within the refresh buffer (default: 60 seconds before expiry), the SDK fetches a fresh one automatically using the same client credentials. 4. No refresh tokens are involved. The client credentials themselves are the long-lived secret, and they can always be used to mint a new access token. ### Explicit authentication If you want to fetch the token eagerly (for example, to fail fast on bad credentials at startup): ```python auth = ServerToServerAuth(client_id="...", client_secret="...") auth.authenticate() # raises AuthenticationError if credentials are invalid client = Frameio(token=auth.get_token) ``` *** ## Web App (Authorization Code) Use this for server-side applications where users sign in with their Adobe ID. This flow requires a client secret, which must be stored securely on your server. ```python from frameio.auth import WebAppAuth auth = WebAppAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", redirect_uri="https://yourapp.com/callback", ) # Generate a cryptographically random state value to prevent CSRF attacks import secrets state = secrets.token_urlsafe(32) authorization_url = auth.get_authorization_url(state=state) # Store `state` in the user's session, then redirect them to `authorization_url` ``` ```python from frameio.auth import AsyncWebAppAuth auth = AsyncWebAppAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", redirect_uri="https://yourapp.com/callback", ) # get_authorization_url is synchronous (no I/O needed) import secrets state = secrets.token_urlsafe(32) authorization_url = auth.get_authorization_url(state=state) ``` When Adobe IMS redirects the user back to your `redirect_uri`, extract the `code` and `state` parameters. Verify the state matches what you stored, then exchange the code for tokens: ```python # In your callback handler (e.g. a Flask/FastAPI route): auth.exchange_code(code=request.args["code"]) ``` ```python # In your async callback handler (e.g. a FastAPI route): await auth.exchange_code(code=request.query_params["code"]) ``` This exchanges the authorization code for an access token and a refresh token, storing both internally. ```python from frameio import Frameio client = Frameio(token=auth.get_token) ``` ```python from frameio import AsyncFrameio client = AsyncFrameio(token=auth.get_token) ``` That's it. From this point on, `get_token` manages the token lifecycle automatically. When the access token approaches expiry, the SDK uses the refresh token to obtain a new one. No user interaction required. ### Full Flask example ```python import secrets from flask import Flask, redirect, request, session from frameio import Frameio from frameio.auth import WebAppAuth app = Flask(__name__) app.secret_key = secrets.token_bytes(32) auth = WebAppAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", redirect_uri="http://localhost:5000/callback", ) @app.route("/login") def login(): state = secrets.token_urlsafe(32) session["oauth_state"] = state return redirect(auth.get_authorization_url(state=state)) @app.route("/callback") def callback(): if request.args.get("state") != session.pop("oauth_state", None): return "Invalid state parameter", 403 auth.exchange_code(code=request.args["code"]) client = Frameio(token=auth.get_token) accounts = client.accounts.index() return f"Authenticated — {len(accounts.data)} account(s) accessible." ``` *** ## Single Page App / PKCE (Authorization Code + PKCE) Use this for browser-based applications, desktop apps, or CLI tools that cannot securely store a client secret. This flow uses [PKCE (RFC 7636)](https://datatracker.ietf.org/doc/html/rfc7636) to protect the authorization code exchange. ```python from frameio.auth import SPAAuth auth = SPAAuth( client_id="YOUR_CLIENT_ID", redirect_uri="https://yourapp.com/callback", ) import secrets state = secrets.token_urlsafe(32) result = auth.get_authorization_url(state=state) # result.url -> redirect the user here # result.code_verifier -> store this securely until the callback ``` ```python from frameio.auth import AsyncSPAAuth auth = AsyncSPAAuth( client_id="YOUR_CLIENT_ID", redirect_uri="https://yourapp.com/callback", ) # get_authorization_url is synchronous (no I/O needed) import secrets state = secrets.token_urlsafe(32) result = auth.get_authorization_url(state=state) ``` `get_authorization_url` returns an `AuthorizationUrlResult` containing the full URL (with the PKCE `code_challenge` embedded) and the `code_verifier` you'll need in the next step. When the user is redirected back: ```python auth.exchange_code( code="CODE_FROM_CALLBACK", code_verifier=result.code_verifier, ) ``` ```python await auth.exchange_code( code="CODE_FROM_CALLBACK", code_verifier=result.code_verifier, ) ``` ```python from frameio import Frameio client = Frameio(token=auth.get_token) ``` ```python from frameio import AsyncFrameio client = AsyncFrameio(token=auth.get_token) ``` That's it. Refresh works the same as Web App — the SDK uses the refresh token automatically. The difference is that no client secret is sent during refresh, since the SPA flow is designed for public clients. *** ## Async Usage Every auth class has an async counterpart prefixed with `Async`. The code examples above include **Sync** and **Async** tabs where applicable. | Sync | Async | | -------------------- | ------------------------- | | `ServerToServerAuth` | `AsyncServerToServerAuth` | | `WebAppAuth` | `AsyncWebAppAuth` | | `SPAAuth` | `AsyncSPAAuth` | The API is identical. `get_authorization_url` remains synchronous (no I/O), while `exchange_code`, `refresh`, `revoke`, and `get_token` are all `async`. Use the async classes with `AsyncFrameio`. ### Manual token refresh For Web App and SPA flows, the SDK refreshes tokens automatically via `get_token`. If you need explicit control, you can call `refresh()` directly: ```python auth.refresh() # fetches a new access token using the refresh token ``` ```python await auth.refresh() ``` This is useful when you want to force a refresh ahead of a critical operation rather than relying on the automatic refresh buffer. *** ## Token Persistence All auth classes support `export_tokens()` and `import_tokens()` for persisting token state across restarts. For Web App and SPA flows this is especially important, since the access and refresh tokens live in memory by default — if your application restarts, users would need to re-authenticate unless you persist them. For Server-to-Server, persistence is optional (the client credentials can always mint a new token), but importing a cached token avoids an extra round-trip on startup. ### Export and import ```python # After exchange_code(), save the token state token_data = auth.export_tokens() # token_data is a dict: {"access_token": "...", "refresh_token": "...", "expires_at": 1234567890.0} # Save it to your database, file, or secret store # On next startup, restore it auth.import_tokens(token_data) client = Frameio(token=auth.get_token) # The SDK will automatically refresh if the token is near expiry ``` ### Automatic persistence with `on_token_refreshed` To persist tokens automatically every time they're refreshed, use the `on_token_refreshed` callback: ```python import json from pathlib import Path TOKEN_FILE = Path("tokens.json") def save_tokens(tokens: dict): TOKEN_FILE.write_text(json.dumps(tokens)) auth = WebAppAuth( client_id="...", client_secret="...", redirect_uri="...", on_token_refreshed=save_tokens, ) # On startup, restore if available if TOKEN_FILE.exists(): auth.import_tokens(json.loads(TOKEN_FILE.read_text())) ``` The callback receives the same dict shape as `export_tokens()` and fires after every successful token refresh. For the async classes, `on_token_refreshed` can be either a regular function or an `async` function. Both are supported. *** ## Revoking Tokens To sign out a user and invalidate their tokens with Adobe IMS: ```python auth.revoke() ``` This makes a best-effort revocation request to Adobe IMS for both the access token and the refresh token, then clears all local token state. After revoking, the user will need to re-authenticate. For the async classes, use `await auth.revoke()`. *** ## Error Handling All auth errors inherit from `FrameioAuthError`, so you can catch them broadly or handle specific cases: ```python from frameio.auth import ( FrameioAuthError, AuthenticationError, TokenExpiredError, ConfigurationError, NetworkError, RateLimitError, ) try: auth.exchange_code(code="...") except TokenExpiredError: # The refresh token has expired; redirect the user to sign in again pass except AuthenticationError as e: # Token exchange failed print(f"Error: {e.error_code} - {e.error_description}") except NetworkError: # Timeout or connection failure (after retries) pass except RateLimitError as e: # 429 from Adobe IMS; retry after e.retry_after seconds pass except FrameioAuthError: # Catch-all for any other auth error pass ``` ### Error reference | Exception | When it's raised | | --------------------- | -------------------------------------------------------------------------------------------- | | `ConfigurationError` | Missing or invalid configuration (e.g. empty `client_id`, non-HTTPS redirect URI) | | `AuthenticationError` | Token exchange or refresh rejected by Adobe IMS (has `.error_code` and `.error_description`) | | `TokenExpiredError` | Refresh token itself is expired; user must re-authenticate | | `NetworkError` | HTTP timeout or connection failure after all retries | | `RateLimitError` | Adobe IMS returned 429; check `.retry_after` for backoff guidance | | `PKCEError` | PKCE verification failed (SPA flow) | ### Handling expired refresh tokens in production For Web App and SPA flows, the refresh token will eventually expire. When that happens, `get_token` raises `TokenExpiredError`. You should catch this and redirect the user through the authorization flow again. ```python from frameio.auth import TokenExpiredError try: client = Frameio(token=auth.get_token) assets = client.files.list(project_id="...") except TokenExpiredError: # Clear persisted tokens and redirect user to login auth.revoke() return redirect("/login") ``` *** ## Configuration Reference All auth classes accept these optional parameters: | Parameter | Default | Description | | -------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `scopes` | Flow-specific defaults | Space-separated OAuth scopes. S2S defaults to `openid AdobeID frame.s2s.all`; user-facing flows default to `openid email profile offline_access additional_info.roles`. | | `ims_base_url` | `https://ims-na1.adobelogin.com` | Adobe IMS base URL. Override for staging or non-production environments. | | `http_client` | `None` | Custom `httpx.Client` (or `httpx.AsyncClient`) for proxy, mTLS, or connection pooling. | | `timeout` | `30` | HTTP request timeout in seconds for token endpoint calls. | | `max_retries` | `2` | Maximum retries for transient failures (5xx, timeouts). Rate-limit retries (429) are tracked separately. | | `refresh_buffer` | `60` | Seconds before token expiry to trigger proactive refresh. | | `on_token_refreshed` | `None` | Callback fired after every successful token refresh. Receives a dict with `access_token`, `refresh_token`, and `expires_at`. | ### Staging environments Point at a staging Adobe IMS instance by overriding `ims_base_url`. The SDK also exports `DEFAULT_IMS_BASE_URL` (`https://ims-na1.adobelogin.com`) if you need to reference the production value programmatically. ```python auth = ServerToServerAuth( client_id="...", client_secret="...", ims_base_url="https://ims-na1-stg1.adobelogin.com", ) ``` ### Custom HTTP client For proxy support or custom TLS configuration: ```python import httpx http_client = httpx.Client( proxy="http://corporate-proxy:8080", verify="/path/to/custom-ca-bundle.pem", ) auth = ServerToServerAuth( client_id="...", client_secret="...", http_client=http_client, ) ``` *** ## Thread Safety The sync auth classes are fully thread-safe. When multiple threads call `get_token` simultaneously and a refresh is needed, only one thread performs the refresh. The others wait and receive the same result. No external locking is required. The async classes provide the same guarantee using `asyncio.Lock`, safe for concurrent coroutines within a single event loop. # Frame.io TypeScript SDK — Authentication Guide This guide explains how to authenticate with the Frame.io API using the **Frame.io TypeScript SDK** (`frameio`). The Frame.io V4 API uses [Adobe Identity Management Service (IMS)](https://developer.adobe.com/developer-console/docs/guides/authentication/), Adobe's OAuth 2.0 identity platform. This is a standalone reference for TypeScript/JavaScript developers. All code examples and flows below are for the `frameio` package only. *** ## Authentication Types in the TypeScript SDK The TypeScript SDK supports four OAuth authentication classes, plus direct token usage: | Method | Use case | User interaction? | Requires client secret? | | --------------------- | ---------------------------------------------------- | ----------------- | ----------------------- | | **Static token** | Quick scripts, testing, or you already have a token | No | No | | **Server-to-Server** | Backend services, cron jobs, automation | No | Yes | | **Web App** | Server-side apps (Express, Fastify, Next.js) | Yes | Yes | | **SPA (PKCE)** | Browser apps that can't store a secret | Yes | No | | **Native App (PKCE)** | Desktop/mobile apps with custom URI scheme redirects | Yes | No | **Server-to-Server** lets your app act as a service account with no user interaction. It's only available to Frame.io V4 accounts administered via the [Adobe Admin Console](https://adminconsole.adobe.com/). **Web App** and **SPA** let your app act as a specific user. Both use Adobe IMS under the hood: the user authorizes your app, and the SDK exchanges the resulting code for tokens. The TypeScript SDK handles the IMS `/authorize/v2` and `/token/v3` flow for you. For Web App you need a client secret; for SPA you use [PKCE](https://datatracker.ietf.org/doc/html/rfc7636) instead. **Native App** follows the same PKCE flow as SPA but uses the `adobe+://callback` redirect URI that Adobe assigns to your Native App credential. This lets your application intercept the redirect at the OS level after authorization. *** ## Service Account Users When you use Server-to-Server authentication, your application acts as a **service account user**, a distinct account type that can perform actions on behalf of the service. These are visible to other users in Frame.io: when a service account takes an action, its name is displayed in the UI. You can grant and revoke service account access through the [Adobe Admin Console](https://adminconsole.adobe.com/) and [Developer Console](https://developer.adobe.com/console). Service account names are managed from the Frame.io UI. By default, your first S2S connection is named **Service Account User**, the second **Service Account User 2**, and so on. See [Automate your setup using Frame.io server to server support](https://helpx.adobe.com/enterprise/using/automate-using-frame-io.html) for more information. *** ## Quick Start ### Prerequisites 1. **Credentials** from the [Adobe Developer Console](https://developer.adobe.com/console): * **Client ID** — required for all OAuth flows * **Client Secret** — required for Server-to-Server and Web App flows * **Redirect URI** — required for Web App, SPA, and Native App flows; must be registered in your Adobe project 2. **Install the SDK:** ```bash npm install frameio ``` ### Choosing a method * **No user involved?** Use **Server-to-Server** (`ServerToServerAuth`). * **User involved and you can store a secret?** Use **Web App** (`WebAppAuth`). * **User involved but you can't store a secret?** Use **SPA** (`SPAAuth`) for browser apps, or **Native App** (`NativeAppAuth`) for desktop/mobile apps. *** ## Access Token If you already have an access token (from another OAuth system or a prior exchange, e.g. via our [API Explorer](/platform/api-reference/accounts/index?explorer=true)) you can pass it directly: ```typescript import { FrameioClient } from "frameio"; const client = new FrameioClient({ token: "YOUR_ACCESS_TOKEN" }); ``` This is the simplest approach, but the token will eventually expire and the SDK won't refresh it for you. ### Legacy Developer Tokens For V4-migrated accounts not yet administered via the [Adobe Admin Console](https://adminconsole.adobe.com/), you can continue to use Legacy Developer Tokens from the [Frame.io developer site](https://developer.frame.io/app/tokens). You must include the `x-frameio-legacy-token-auth` header and set it to `true`: ```typescript import { FrameioClient } from "frameio"; const client = new FrameioClient({ token: "YOUR_LEGACY_DEVELOPER_TOKEN", headers: { "x-frameio-legacy-token-auth": "true" }, }); ``` Legacy developer tokens do not expire, but they are a transitional mechanism. For new integrations and production workloads, we recommend using one of the OAuth 2.0 flows below. See the [Migration Guide](/platform/docs/resources/migration#authentication) for details. *** ## Server-to-Server (Client Credentials) Use this for backend services and scripts that need Frame.io access without user interaction. This flow is only available to Frame.io V4 accounts administered via the [Adobe Admin Console](https://adminconsole.adobe.com/). Your application authenticates as a [service account user](#service-account-users) with no human in the loop. ```typescript import { FrameioClient, ServerToServerAuth } from "frameio"; const auth = new ServerToServerAuth({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", }); const client = new FrameioClient({ token: () => auth.getToken() }); ``` That's it. `auth.getToken()` is an async function that the SDK invokes on every request. If the current token is still valid, it returns immediately. If it's about to expire, it fetches a new one first, completely transparently. ### How it works Your client credentials (client ID + secret) **never expire**. You only rotate them manually for security hygiene. S2S gives you effectively permanent, uninterrupted API access with zero manual intervention. Under the hood: 1. On the first API call, `getToken()` requests a new access token from Adobe IMS using the `client_credentials` grant. 2. The token is cached in memory. Individual access tokens expire (typically 24 hours), but this is handled for you. 3. When a cached token is within the refresh buffer (default: 60 seconds before expiry), the SDK fetches a fresh one automatically using the same client credentials. 4. No refresh tokens are involved. The client credentials themselves are the long-lived secret, and they can always be used to mint a new access token. ### Explicit authentication If you want to fetch the token eagerly (for example, to fail fast on bad credentials at startup): ```typescript const auth = new ServerToServerAuth({ clientId: "...", clientSecret: "..." }); await auth.authenticate(); // throws AuthenticationError if credentials are invalid const client = new FrameioClient({ token: () => auth.getToken() }); ``` *** ## Web App (Authorization Code) Use this for server-side applications where users sign in with their Adobe ID. This flow requires a client secret, which must be stored securely on your server. ```typescript import { WebAppAuth } from "frameio"; import crypto from "crypto"; const auth = new WebAppAuth({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", redirectUri: "https://yourapp.com/callback", }); // Generate a cryptographically random state value to prevent CSRF attacks const state = crypto.randomBytes(32).toString("hex"); const authorizationUrl = auth.getAuthorizationUrl({ state }); // Store `state` in the user's session, then redirect them to `authorizationUrl` ``` When Adobe IMS redirects the user back to your `redirectUri`, extract the `code` and `state` parameters. Verify the state matches what you stored, then exchange the code for tokens: ```typescript // In your callback handler (e.g. an Express route): await auth.exchangeCode(req.query.code as string); ``` This exchanges the authorization code for an access token and a refresh token, storing both internally. ```typescript import { FrameioClient } from "frameio"; const client = new FrameioClient({ token: () => auth.getToken() }); ``` That's it. From this point on, `getToken()` manages the token lifecycle automatically. When the access token approaches expiry, the SDK uses the refresh token to obtain a new one. No user interaction required. ### Full Express example ```typescript import crypto from "crypto"; import express from "express"; import session from "express-session"; import { FrameioClient, WebAppAuth } from "frameio"; const auth = new WebAppAuth({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", redirectUri: "http://localhost:3000/callback", }); const app = express(); app.use(session({ secret: crypto.randomBytes(32).toString("hex"), resave: false, saveUninitialized: false })); app.get("/login", (req, res) => { const state = crypto.randomBytes(32).toString("hex"); (req.session as any).oauthState = state; res.redirect(auth.getAuthorizationUrl({ state })); }); app.get("/callback", async (req, res) => { if (req.query.state !== (req.session as any).oauthState) { return res.status(403).send("Invalid state parameter"); } await auth.exchangeCode(req.query.code as string); const client = new FrameioClient({ token: () => auth.getToken() }); const accounts = await client.accounts.index(); res.json(accounts); }); app.listen(3000); ``` *** ## Single Page App / PKCE (Authorization Code + PKCE) Use this for browser-based applications, desktop apps, or CLI tools that cannot securely store a client secret. This flow uses [PKCE (RFC 7636)](https://datatracker.ietf.org/doc/html/rfc7636) to protect the authorization code exchange. ```typescript import { SPAAuth } from "frameio"; const auth = new SPAAuth({ clientId: "YOUR_CLIENT_ID", redirectUri: "https://yourapp.com/callback", }); const state = crypto.randomUUID(); const result = await auth.getAuthorizationUrl({ state }); // result.url -> redirect the user here // result.codeVerifier -> store this securely until the callback ``` `getAuthorizationUrl` returns an `AuthorizationUrlResult` containing the full URL (with the PKCE `code_challenge` embedded) and the `codeVerifier` you'll need in the next step. When the user is redirected back: ```typescript await auth.exchangeCode({ code: "CODE_FROM_CALLBACK", codeVerifier: result.codeVerifier, }); ``` ```typescript import { FrameioClient } from "frameio"; const client = new FrameioClient({ token: () => auth.getToken() }); ``` That's it. Refresh works the same as Web App — the SDK uses the refresh token automatically. The difference is that no client secret is sent during refresh, since the SPA flow is designed for public clients. The `codeVerifier` must be stored securely on the client side between the authorization request and the code exchange. Use `sessionStorage` or equivalent in browser apps. *** ## Native App (Authorization Code + PKCE) Use this for desktop and mobile applications. When you create a Native App credential in the [Adobe Developer Console](https://developer.adobe.com/console), Adobe assigns you a redirect URI of the form `adobe+://callback` — you register your application to handle that custom URI scheme at the OS level. Loopback redirects (`http://127.0.0.1:/callback`) are also supported for local development. The flow is identical to SPA — it uses PKCE with no client secret. ```typescript import { NativeAppAuth } from "frameio"; const auth = new NativeAppAuth({ clientId: "YOUR_CLIENT_ID", redirectUri: "adobe+abc123def456://callback", // from your Adobe Developer Console Native App credential // Also supports loopback: "http://127.0.0.1:8080/callback" }); const { url, codeVerifier } = await auth.getAuthorizationUrl({ state: crypto.randomUUID(), }); // Open system browser to `url` // Listen for redirect on your custom URI scheme or loopback server await auth.exchangeCode({ code: "CODE_FROM_REDIRECT", codeVerifier }); const client = new FrameioClient({ token: () => auth.getToken() }); ``` ### Redirect URI rules Adobe enforces redirect URI rules at two points: when you register the credential in the [Adobe Developer Console](https://developer.adobe.com/console), and when the `redirect_uri` parameter hits the `/authorize/v2` endpoint. The value you pass to `redirectUri` in this SDK must match one of the "Redirect URI patterns" you registered on the credential — otherwise Adobe redirects to the Default Redirect URI on the credential instead. * **Web App** and **SPA** credentials require HTTPS. * **Native App** credentials use a non-HTTPS redirect — typically the `adobe+://callback` URI shown in the Developer Console for the credential. See the [Adobe Developer Console](https://developer.adobe.com/console) for the exact patterns accepted for your credential. The Python SDK does not include a Native App credential class, since Python has no standard way to register custom URI scheme handlers. The TypeScript SDK supports all four credential types including Native App. *** ## Manual Token Refresh For Web App, SPA, and Native App flows, the SDK refreshes tokens automatically via `getToken()`. If you need explicit control, you can call `refresh()` directly: ```typescript await auth.refresh(); // fetches a new access token using the refresh token ``` This is useful when you want to force a refresh ahead of a critical operation rather than relying on the automatic refresh buffer. `refresh()` is available on `WebAppAuth`, `SPAAuth`, and `NativeAppAuth`. It throws `ConfigurationError` if no refresh token is available (i.e. you must call `exchangeCode()` first). `ServerToServerAuth` does not have a `refresh()` method — it uses `authenticate()` to fetch a new token via client credentials instead. *** ## Token Persistence All auth classes support `exportTokens()` and `importTokens()` for persisting token state across restarts. For Web App, SPA, and Native App flows this is especially important, since the access and refresh tokens live in memory by default — if your application restarts, users would need to re-authenticate unless you persist them. For Server-to-Server, persistence is optional (the client credentials can always mint a new token), but importing a cached token avoids an extra round-trip on startup. ### Export and import ```typescript // After exchangeCode(), save the token state const tokenData = auth.exportTokens(); // tokenData is: { access_token: "...", refresh_token: "...", expires_at: 1234567890.0 } // Save it to your database, file, or secret store // On next startup, restore it auth.importTokens(tokenData); const client = new FrameioClient({ token: () => auth.getToken() }); // The SDK will automatically refresh if the token is near expiry ``` Store exported tokens securely. They contain access and refresh tokens that grant API access. Avoid writing tokens to plaintext files in production. ### Automatic persistence with `onTokenRefreshed` To persist tokens automatically every time they're refreshed, use the `onTokenRefreshed` callback: ```typescript import fs from "fs/promises"; const TOKEN_FILE = "tokens.json"; const auth = new WebAppAuth({ clientId: "...", clientSecret: "...", redirectUri: "...", onTokenRefreshed: (tokens) => { fs.writeFile(TOKEN_FILE, JSON.stringify(tokens)); }, }); // On startup, restore if available try { const saved = JSON.parse(await fs.readFile(TOKEN_FILE, "utf-8")); auth.importTokens(saved); } catch { // No saved tokens — user will need to authenticate } ``` The callback receives the same shape as `exportTokens()` and fires after every successful token refresh. *** ## Revoking Tokens To sign out a user and invalidate their tokens with Adobe IMS: ```typescript await auth.revoke(); ``` This makes two best-effort revocation requests to Adobe IMS — one for the access token and one for the refresh token, in parallel — and clears all local token state. For confidential clients (`WebAppAuth`), revocation requests use HTTP Basic Auth; for public clients (`SPAAuth`, `NativeAppAuth`), the `client_id` is sent as a query parameter. Revocation errors are logged but not thrown. After revoking, the user will need to re-authenticate. *** ## Error Handling All auth errors inherit from `FrameioAuthError`, so you can catch them broadly or handle specific cases: ```typescript import { FrameioAuthError, AuthenticationError, TokenExpiredError, ConfigurationError, NetworkError, RateLimitError, } from "frameio"; try { await auth.exchangeCode("..."); } catch (error) { if (error instanceof TokenExpiredError) { // The refresh token has expired; redirect the user to sign in again } else if (error instanceof AuthenticationError) { // Token exchange failed console.error(`Error: ${error.errorCode} - ${error.errorDescription}`); } else if (error instanceof NetworkError) { // Timeout or connection failure (after retries) } else if (error instanceof RateLimitError) { // 429 from Adobe IMS; retry after error.retryAfter seconds } else if (error instanceof FrameioAuthError) { // Catch-all for any other auth error } } ``` ### Error reference | Exception | When it's raised | | --------------------- | -------------------------------------------------------------------------------------------------------- | | `ConfigurationError` | Missing or invalid configuration (e.g. empty `clientId`, non-HTTPS redirect URI, non-HTTPS `imsBaseUrl`) | | `AuthenticationError` | Token exchange or refresh rejected by Adobe IMS (has `.errorCode` and `.errorDescription`) | | `TokenExpiredError` | Refresh token itself is expired; user must re-authenticate | | `NetworkError` | HTTP timeout or connection failure after all retries | | `RateLimitError` | Adobe IMS returned 429; check `.retryAfter` for backoff guidance | | `PKCEError` | Available for consumer use in PKCE flows; not thrown internally by the SDK | ### Handling expired refresh tokens in production For Web App, SPA, and Native App flows, the refresh token will eventually expire. When that happens, `getToken()` raises `TokenExpiredError`. You should catch this and redirect the user through the authorization flow again. ```typescript import { TokenExpiredError } from "frameio"; try { const client = new FrameioClient({ token: () => auth.getToken() }); const assets = await client.files.list({ projectId: "..." }); } catch (error) { if (error instanceof TokenExpiredError) { // Clear persisted tokens and redirect user to login await auth.revoke(); return res.redirect("/login"); } } ``` *** ## Configuration Reference These parameters have sensible defaults and rarely need to be set. If you do need to customize behavior — pointing at a staging IMS, injecting a custom `fetch`, tuning timeouts, or wiring up a logger — pass any of them as optional parameters when constructing the auth class: | Parameter | Default | Description | | ------------------ | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `scopes` | Flow-specific defaults | Space-separated OAuth scopes. S2S defaults to `openid AdobeID frame.s2s.all`; user-facing flows default to `openid email profile offline_access additional_info.roles`. | | `imsBaseUrl` | `https://ims-na1.adobelogin.com` | Adobe IMS base URL. Override for staging or non-production environments. Must use HTTPS. | | `fetch` | `globalThis.fetch` | Custom `fetch` implementation for proxy, mTLS, or custom HTTP handling. | | `timeout` | `30000` | HTTP request timeout in milliseconds for token endpoint calls. | | `maxRetries` | `2` | Maximum retries for transient failures (5xx, timeouts). Rate-limit retries (429) are tracked separately. | | `refreshBuffer` | `60` | Seconds before token expiry to trigger proactive refresh. | | `onTokenRefreshed` | `undefined` | Callback fired after every successful token refresh. Receives an object with `access_token`, `refresh_token`, and `expires_at`. | | `logger` | No-op (silent) | Logger instance with `debug`, `info`, `warn`, `error` methods (e.g. `console`, `pino`, `winston`). | ### Staging environments Point at a staging Adobe IMS instance by overriding `imsBaseUrl`. The SDK also exports `DEFAULT_IMS_BASE_URL` (`https://ims-na1.adobelogin.com`) if you need to reference the production value programmatically. ```typescript const auth = new ServerToServerAuth({ clientId: "...", clientSecret: "...", imsBaseUrl: "https://ims-na1-stg1.adobelogin.com", }); ``` ### Custom fetch For proxy support or custom TLS configuration: ```typescript import { ProxyAgent } from "undici"; const proxyAgent = new ProxyAgent("http://corporate-proxy:8080"); const auth = new ServerToServerAuth({ clientId: "...", clientSecret: "...", fetch: (url, init) => fetch(url, { ...init, dispatcher: proxyAgent }), }); ``` *** ## Concurrency Safety The TypeScript SDK is safe for concurrent use. When multiple `getToken()` calls happen simultaneously and a refresh is needed, only one refresh request fires. The others await the same promise and receive the same result. No external locking is required. This deduplication uses JavaScript's single-threaded event loop and a shared `Promise` — if a refresh is already in flight, concurrent callers join it instead of starting a second request. If `revoke()` is called while a refresh is in flight, the refresh is rejected with an `AuthenticationError` and tokens remain cleared — the revocation always wins. # Accounts, Projects, and Workspaces ## All Account Access All Frame V4 accounts—not just those managed via the Adobe Admin Console—can create tokens and access the V4 API. Customers and partners can test, build, and refine their workflows using our newest API features. Visit Adobe developer console to create a user authentication token. The user must use the same Adobe ID as their Frame login to validate API token access. Once you have access to the APIs, the next step is to create API credentials, or an API token, to communicate with Frame. Create your API credentials at developer.adobe.com. ![Account Access](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/706a4eb9324bc24a3465388a838455baf58384f128882a185dad2d1900f728a3/docs/pages/v4/guides/image_11.png) All V4 accounts, whether Frame-managed (V4F) or Adobe-managed (V4A) have access to create a Project in the Adobe Developer Console, and then create credentials. Once you have a set of credentials (OAuth Client ID/Client Secret), you can integrate with the Adobe Developer Platform's three-legged OAuth flow. Sign in to your Adobe Identity to receive a valid auth and refresh token to make requests to the Frame.io V4 Developer API! ## Projects and Workspaces ### Workspace Updates The Frame.io landing page is new and named the Workspace page. Users can browse Workspaces and Projects they have access to in an account. Thanks to this new design, it's easier to see who belongs to a given Workspace and quickly invite new people. In Frame V3 Workspaces were known as Teams. Workspaces are set to Invite Only in V4, so users will only see Workspaces they have been explicitly invited to. Furthermore, there is no Team Directory page in account settings. To manage permissions and related operations, use the Create, List, Delete, and Update Workspace endpoints. * List user roles for a given Workspace. * Remove a user from a given Workspace. * Update user roles for the given workspace if the user is already added to the workspace. If the user is not added to the workspace, the user will be added with the given role. ### Project Updates The Project creation flow has changed in V4. Now, when you start a new Project, you choose between a blank Project or a Project Template. There are twelve templates to choose from, designed for common creative workflows. You can also choose to include the template's demo assets, or start with just the template structure. Choosing a Project Template immediately creates a new Project in your Workspace. To manage permissions and related operations, use the Create, List, Delete, and Update Project endpoints. * List user roles for a given project. * Remove a user from a given project. * Update User Roles for the given project if the user is already added to the project. If the user is not added to the project, the user will be added with the given role. # How Local & Remote Uploads Work This guide details the full flow to upload files using the Frame.io V4 API. It covers the raw API requests and responses for both local and remote uploads. **Looking for SDK-specific guides?** For upload implementations with built-in chunking, retries, and progress tracking, see the [Python SDK Upload Guide](./python-sdk-upload-guide). ## Prerequisites Before you begin uploading files, ensure you have completed these setup steps: You have a Frame.io V4 account administered via the [Adobe Admin Console](https://adminconsole.adobe.com/), OR you have [switched to Adobe authentication](https://help.frame.io/en/articles/11758018-connecting-to-adobe-authentication) for your account user You have logged into the [Adobe Developer Console](https://developer.adobe.com/console) and have added the Frame.io API to a new or existing project You have generated the [appropriate Authentication credentials](https://developer.adobe.com/frameio/guides/Authentication/) for your project You have successfully used those credentials to generate an access token ## Choosing your upload method There are two ways to upload a file using the Frame.io API: `Create File (local upload)` and `Create File (remote upload)`. Use when the media is locally accessible to your application, similar to dragging a file from your desktop Use when the media is accessed over the network, such as through an integration with another service In this guide we'll start with the simpler case of completing a remote upload. ## Remote Upload To create a file through remote upload, select the **Create File (remote upload)** endpoint. The request body requires the file name and its source url. Remote upload currently has a **50 GB file size limit**. For files larger than 50 GB, use [local upload](#local-upload) instead. ### Request Example ```json { "data": { "name": "my_file.jpg", "source_url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.jpg" } } ``` ### Response Example A successful request will yield a response like the one below: ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "my_file.jpg", "status": "created", "type": "file", "file_size": 518, "updated_at": "2025-06-26T20:14:33.796116Z", "media_type": "image/jpeg", "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", "project_id": "7e46e495-4444-4555-8649-bee4d391a997", "created_at": "2025-06-26T20:14:33.159489Z", "view_url": "https://next.frame.io/project/7e46e495-4444-4555-8649-bee4d391a997/view/93e4079d-0a8a-4bf3-96cd-e6a03c465e5e" }, "links": { "status": "/v4/accounts/6f70f1bd-7e89-4a7e-b4d3-7e576585a181/files/93e4079d-0a8a-4bf3-96cd-e6a03c465e5e/status" } } ``` ## Local Upload To create a file through local upload, select the **Create File (local upload)** endpoint. The request body requires the file name and its file size specified in bytes. ### Request Example ```json { "data": { "name": "my_file.jpg", "file_size": 50645990 } } ``` ### Response Example If the request is successful, a placeholder file resource is created without any content. Depending on the file size, the response body will include one or more `upload_urls`. Given this example, we will need to manage this upload in multiple parts. ```json { "data": { "id": "fa18ba7b-b3ee-4dd6-9b31-bd07e554241d", "name": "my_file.jpg", "status": "created", "type": "file", "file_size": 50645990, "updated_at": "2025-06-26T20:08:06.823170Z", "media_type": "image/jpeg", "parent_id": "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", "project_id": "7e46e495-4444-4555-8649-bee4d391a997", "created_at": "2025-06-26T20:08:06.751313Z", "upload_urls": [ { "size": 16881997, "url": "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_1?..." }, { "size": 16881997, "url": "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_2?..." }, { "size": 16881996, "url": "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_3?..." } ], "view_url": "https://next.frame.io/project/7e46e495-4444-4555-8649-bee4d391a997/view/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d" } } ``` **Important Upload Requirements:** These are important details to keep in mind when sending the subsequent upload request(s): * The HTTP request method must be `PUT` * The `x-amz-acl` header must be included and be set to private * The `Content-Type` header must match the `media_type` specified in the original **Create File (local upload)** request. This is true even when uploading the file as separate parts. In the example above, the value for `media_type` is `image/jpeg`. Therefore, the value for `Content-Type` must also be `image/jpeg`. ## Multi-part Upload When a given file results in more than one upload url, you will need to split the source file into chunks and issue a PUT request for each one. **Recommended:** The [Python SDK Upload Guide](./python-sdk-upload-guide) covers multi-part upload using `FrameioUploader`, which handles chunking, parallel uploads, retries, and progress tracking out of the box. If you need to implement the upload manually — for example, in a language without an SDK or for full control over the process — the script below shows how to split a file into chunks and upload each one using the presigned URLs. ### Python Implementation Example ```python title="Multi-part Upload Script" import requests import math from typing import List from tqdm import tqdm # For progress bar def upload_file_in_chunks(file_path: str, upload_urls: list[str], content_type: str | None = None, chunk_size: int | None = None) -> bool: """ Upload a file in chunks using presigned URLs. """ try: # Auto-detect content type based on file extension if content_type is None: detected_content_type, _ = mimetypes.guess_type(file_path) content_type = detected_content_type # Default fallback print(f"Detected content type: {content_type}") # Get file size with open(file_path, 'rb') as f: f.seek(0, 2) # Seek to end of file file_size = f.tell() # Calculate chunk size if not provided if chunk_size is None: chunk_size = math.ceil(file_size / len(upload_urls)) print(f"File size: {file_size} bytes") print(f"Chunk size: {chunk_size} bytes") print(f"Number of chunks: {len(upload_urls)}") # Upload each chunk with open(file_path, 'rb') as f: with tqdm(total=len(upload_urls), desc="Uploading chunks") as pbar: for i, url in enumerate(upload_urls): start_byte = i * chunk_size end_byte = min(start_byte + chunk_size, file_size) # Read chunk from file f.seek(start_byte) chunk = f.read(end_byte - start_byte) print(f"Uploading chunk {i+1}: {len(chunk)} bytes") # Upload chunk with minimal headers matching the signature response = requests.put( url, data=chunk, headers={ 'content-type': content_type, 'x-amz-acl': 'private' } ) if response.status_code != 200: print(f"Failed to upload chunk {i+1}. Status code: {response.status_code}") print(f"Response text: {response.text}") print(f"Response headers: {dict(response.headers)}") return False else: print(f"Chunk {i+1} uploaded successfully!") pbar.update(1) return True except Exception as e: print(f"Error during upload: {str(e)}") return False # Example usage if __name__ == "__main__": # Replace these with your actual values file_path = "/Users/MyComputer/local_upload/sample.jpg" # Path to your file upload_urls = [ "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_1?...", "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_2?...", "https://frameio-uploads-development.s3-accelerate.amazonaws.com/parts/fa18ba7b-b3ee-4dd6-9b31-bd07e554241d/part_3?..." ] content_type = "image/jpeg" print("Starting file upload...") success = upload_file_in_chunks(file_path, upload_urls, content_type) if success: print("File upload completed successfully!") else: print("File upload failed!") ``` ## Upload Flow Summary Decide between remote upload (file accessible via URL) or local upload (file on your system) Make the initial request to create the file resource with required metadata For local uploads, process the returned upload\_urls (single or multiple parts) Use PUT requests with proper headers to upload file content to the provided URLs Check the file status to confirm successful upload and processing **Next Steps**: Once your file is uploaded, you can use the returned file ID to add comments, create shares, or perform other operations using the Frame.io V4 API. # Frame.io Python SDK — Upload Guide This guide explains how to upload files to Frame.io using the **Frame.io Python SDK** (`frameio`). The SDK handles chunked multi-part uploads to S3 via pre-signed URLs, with parallel workers, automatic retries, and optional progress tracking. For the general upload API concepts (upload URLs, headers, chunking), see [How Local & Remote Uploads Work](./how-local-remote-uploads-work). *** ## Prerequisites You have a working `Frameio` client. See the [Authentication Guide](/platform/docs/guides/authentication/python-sdk) for setup. ```bash pip install frameio ``` You need the `account_id` and `folder_id` where the file should be uploaded. Use the SDK to find them: ```python # List your accounts accounts = client.accounts.index() account_id = accounts.data[0].id # List workspaces in the account workspaces = client.workspaces.index(account_id=account_id) workspace_id = workspaces.data[0].id # List projects in the workspace projects = client.projects.index(account_id=account_id, workspace_id=workspace_id) project = projects.data[0] # The project's root folder is the top-level upload target folder_id = project.root_folder_id # Or list subfolders to upload into a specific one folders = client.folders.list(account_id=account_id, folder_id=folder_id) ``` *** ## Quick Start ```python import os from frameio import Frameio from frameio.files import FileCreateLocalUploadParamsData from frameio.upload import FrameioUploader client = Frameio(token="YOUR_TOKEN") file_path = "/path/to/video.mp4" file_size = os.path.getsize(file_path) # 1. Create the file resource and get pre-signed upload URLs response = client.files.create_local_upload( account_id="YOUR_ACCOUNT_ID", folder_id="YOUR_FOLDER_ID", data=FileCreateLocalUploadParamsData( name="video.mp4", file_size=file_size, ), ) # 2. Upload the file to S3 with open(file_path, "rb") as f: FrameioUploader(response.data, f).upload() ``` That's it. The SDK splits the file into chunks based on the upload URLs returned by the API, uploads them in parallel, and handles retries automatically. *** ## How It Works Local upload is a two-step process: Call `client.files.create_local_upload()` with the file name and size. The API creates a placeholder file and returns pre-signed S3 PUT URLs — one per chunk. The number of URLs (and therefore chunks) depends on the file size. `FrameioUploader` reads the upload URLs from the response, splits your file into matching chunks, and PUTs each chunk to its URL in parallel using a thread pool. Each request includes the required `x-amz-acl: private` and `Content-Type` headers. The upload goes directly from your application to S3 — it does not pass through the Frame.io API servers. This is the same pattern used by services like YouTube, Vimeo, and Dropbox for large file uploads. *** ## Using `FrameioUploader` `FrameioUploader` is the recommended way to upload files. It wraps the lower-level chunked uploader and handles all the details — extracting upload URLs from the API response, setting required headers, chunking the file, and uploading in parallel. ### Progress Tracking Use the `on_progress` callback to track upload progress: ```python def on_progress(bytes_uploaded: int, total_bytes: int) -> None: pct = bytes_uploaded / total_bytes * 100 print(f"\r{pct:.1f}% ({bytes_uploaded:,} / {total_bytes:,} bytes)", end="", flush=True) with open(file_path, "rb") as f: FrameioUploader(response.data, f, on_progress=on_progress).upload() print("\nUpload complete!") ``` The callback is invoked once after each chunk completes, with the cumulative bytes uploaded so far and the total file size. #### Rich progress bar For a polished terminal experience, use [Rich](https://github.com/Textualize/rich): ```python from rich.progress import Progress, BarColumn, DownloadColumn, TransferSpeedColumn, TimeRemainingColumn with Progress( "[progress.description]{task.description}", BarColumn(), DownloadColumn(), TransferSpeedColumn(), TimeRemainingColumn(), ) as progress: task = progress.add_task("Uploading...", total=file_size) with open(file_path, "rb") as f: FrameioUploader( response.data, f, on_progress=lambda done, total: progress.update(task, completed=done), ).upload() ``` ### Configuration `FrameioUploader` accepts several optional parameters: | Parameter | Default | Description | | ------------- | -------------------------- | ------------------------------------------------------------------------------------ | | `max_workers` | `5` | Number of concurrent upload threads | | `headers` | `{"x-amz-acl": "private"}` | Headers sent with every S3 PUT request. Custom headers are merged with the defaults. | | `max_retries` | `3` | Retry attempts per chunk (exponential backoff: 1s, 2s, 4s, ...) | | `on_progress` | `None` | Callback `(bytes_uploaded, total_bytes)` fired after each chunk | ```python with open(file_path, "rb") as f: FrameioUploader( response.data, f, max_workers=10, # more parallelism for high-bandwidth connections max_retries=5, # more resilient on flaky networks on_progress=on_progress, ).upload() ``` ### Full Example A complete example with authentication, upload, and progress tracking: ```python import os from frameio import Frameio from frameio.auth import ServerToServerAuth from frameio.files import FileCreateLocalUploadParamsData from frameio.upload import FrameioUploader # Authenticate auth = ServerToServerAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", ) client = Frameio(token=auth.get_token) # Prepare the file file_path = "/path/to/video.mp4" file_name = os.path.basename(file_path) file_size = os.path.getsize(file_path) # Create the file resource response = client.files.create_local_upload( account_id="YOUR_ACCOUNT_ID", folder_id="YOUR_FOLDER_ID", data=FileCreateLocalUploadParamsData( name=file_name, file_size=file_size, ), ) print(f"Uploading {file_name} ({file_size:,} bytes) in {len(response.data.upload_urls)} chunks...") # Upload with progress def on_progress(uploaded: int, total: int) -> None: print(f"\r{uploaded / total:.0%}", end="", flush=True) with open(file_path, "rb") as f: FrameioUploader(response.data, f, on_progress=on_progress).upload() print(f"\nDone! View at: {response.data.view_url}") ``` *** If you need full control over the upload process — for example, to handle chunking manually, integrate with an async pipeline, or customize retry logic — see [How Local & Remote Uploads Work](./how-local-remote-uploads-work) for the raw API flow and a standalone Python script example. *** ## Remote Upload If your file is already accessible via a public URL, use remote upload instead. No chunking is needed — Frame.io fetches the file directly: ```python from frameio.files import FileCreateRemoteUploadParamsData response = client.files.create_remote_upload( account_id="YOUR_ACCOUNT_ID", folder_id="YOUR_FOLDER_ID", data=FileCreateRemoteUploadParamsData( name="video.mp4", source_url="https://example.com/video.mp4", ), ) print(f"File created: {response.data.id}") ``` Remote upload currently has a **50 GB file size limit**. For files larger than 50 GB, use [local upload](#quick-start) instead. *** ## Checking Upload Status After uploading, you can verify the file was received: ```python status = client.files.show_file_upload_status( account_id="YOUR_ACCOUNT_ID", file_id=response.data.id, ) print(f"Upload complete: {status.data.upload_complete}") ``` # Media Links Frame.io stores and processes files uploaded to your projects — images, videos, PDFs, and more. When you retrieve a file via the API, the base response includes core metadata like the file name, status, and a `view_url` for opening it in the Frame.io app. To access the actual file content — the original, a preview, or different quality renditions — you use **includes**. This guide explains the media link includes available on the **List Files** and **Get File** endpoints, what each one returns, and when to use each. ## What are includes? Includes are optional fields you can request alongside a file response. By default the API returns only core file metadata — name, status, type, timestamps, and `view_url`. Includes let you opt in to additional data, keeping responses lean when you don't need everything. ### How to add includes Pass a comma-separated list of include names as the `include` query parameter on any **Get File** or **List Files** request: ```bash title="Single include" GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.thumbnail ``` ```bash title="Multiple includes" GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.thumbnail,media_links.original ``` ```bash title="Includes on List Files" GET /v4/accounts/{account_id}/folders/{folder_id}/files?include=media_links.thumbnail ``` Includes work the same way on both the single-file and list endpoints. When used on List Files, the includes are resolved for every file in the response. ### SDK examples ```python title="Python SDK" import frameio client = frameio.Frameio(auth="") file = client.files.get( file_id="93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", include=["media_links.thumbnail", "media_links.original"] ) print(file.media_links.thumbnail.url) ``` ```typescript title="TypeScript SDK" import Frameio from "frameio"; const client = new Frameio({ auth: "" }); const file = await client.files.get("93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", { include: ["media_links.thumbnail", "media_links.original"], }); console.log(file.media_links?.thumbnail?.url); ``` Includes that aren't requested are omitted from the response entirely. ## Media link includes overview The original uploaded file, exactly as it was uploaded A PNG preview image for display purposes The best available processed rendition The smallest available rendition for low-bandwidth use cases A low-resolution 180p H264 video transcode for streaming and playback A WebP sprite sheet of video frame thumbnails for building scrubbing UI ## media\_links.original Returns signed URLs pointing to the **original file exactly as it was uploaded** — no processing, no conversion. ### Fields | Field | Type | Description | | -------------- | -------------- | ------------------------------------------------------------------------------------------------------- | | `download_url` | string \| null | Signed URL that forces a file download (`Content-Disposition: attachment`) | | `inline_url` | string \| null | Signed URL that opens the file directly in the browser (`Content-Disposition: inline; filename=`) | ### When to use Use `media_links.original` when you need the source file — for example, to let a user download the original MOV, MP4, MXF, AVI, PSD, PNG, or TIFF, or to pass the original bytes to another system. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.original ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "hero-banner.png", "type": "file", "media_links": { "original": { "download_url": "https://s3.amazonaws.com/...", "inline_url": "https://s3.amazonaws.com/..." } } } } ``` These URLs are **temporary signed S3 URLs** — they expire. Do not cache or store them; request a fresh URL each time you need one. ## media\_links.thumbnail Returns a **PNG preview image** of the asset, capped at 540px tall. This is a processed rendition — not the original file — and watermarks may be applied depending on your account settings. ### Fields | Field | Type | Description | | -------------- | -------------- | ------------------------------------------------------------------------------------ | | `download_url` | string \| null | Signed URL that forces a download of the PNG thumbnail | | `url` | string \| null | Signed URL that serves the PNG thumbnail inline with no `Content-Disposition` header | ### When to use Use `media_links.thumbnail` when you need to **display a visual preview** of the asset — for example in a grid view, a gallery, or a file picker. It loads faster than the original and is always a web-safe PNG format. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.thumbnail ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "hero-banner.png", "type": "file", "media_links": { "thumbnail": { "download_url": "https://s3.amazonaws.com/...", "url": "https://s3.amazonaws.com/..." } } } } ``` ## media\_links.high\_quality Returns a download URL for the **best available processed rendition** of the asset. Frame.io processes uploads through a resolution ladder that maxes out at 2160p. The API returns the highest rendition available **at the time of the request** — so if only a 540p rendition has finished processing when you make the request, the API returns 540p until higher renditions are ready. ### Fields | Field | Type | Description | | -------------- | -------------- | ---------------------------------------------------------------------- | | `download_url` | string \| null | Signed URL for the highest quality rendition available at request time | ### When to use Use `media_links.high_quality` when you want the **best quality version without needing the original** — for example, exporting a high-res rendition for downstream processing, or presenting a full-resolution preview. If you need the highest possible quality, check the file `status` field and request this include once the file is `ready` to ensure the full resolution ladder has been processed. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.high_quality ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "hero-banner.png", "type": "file", "media_links": { "high_quality": { "download_url": "https://s3.amazonaws.com/..." } } } } ``` ## media\_links.efficient Returns a download URL for the **smallest available processed rendition**. This is the opposite of `high_quality` — Frame.io picks the lowest resolution rendition available. ### Fields | Field | Type | Description | | -------------- | -------------- | ---------------------------------------------------- | | `download_url` | string \| null | Signed URL for the smallest/most efficient rendition | ### When to use Use `media_links.efficient` when **bandwidth or file size matters more than quality** — for example, generating quick previews in a low-bandwidth environment, or feeding a thumbnail pipeline that doesn't need full resolution. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.efficient ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "hero-banner.png", "type": "file", "media_links": { "efficient": { "download_url": "https://s3.amazonaws.com/..." } } } } ``` ## media\_links.video\_h264\_180 Returns streaming and download URLs for a **low-resolution 180p H264 video transcode** of the asset. This is a legacy include. It will be `null` if a 180p transcode was not generated for the asset. For most use cases prefer `media_links.efficient`, which selects the best available low-quality rendition rather than relying on a specific transcode existing. ### Fields | Field | Type | Description | | -------------- | -------------- | -------------------------------------------- | | `download_url` | string \| null | Signed URL to download the 180p H264 video | | `url` | string \| null | Signed URL for streaming the 180p H264 video | ### When to use Use `media_links.video_h264_180` when you need a guaranteed 180p H264 transcode specifically — for example, integrating with a legacy player or pipeline that requires this exact format. If the transcode doesn't exist for a given asset, both URLs will be `null`. There is no audio included in the video\_h264\_180 file. It is intended to be used for very efficient previews when needed. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.video_h264_180 ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "interview-clip.mp4", "type": "file", "media_links": { "video_h264_180": { "download_url": "https://s3.amazonaws.com/...", "url": "https://s3.amazonaws.com/..." } } } } ``` ## media\_links.scrub\_sheet Returns a **WebP sprite sheet** — a single image containing a grid of video frame thumbnails sampled evenly across the video duration. This is used to build video scrubbing UI, where the player shows a preview frame as the user drags across the timeline. Scrub sheets are generated for **video assets only**. The include will return `null` URLs for images, PDFs, and other non-video files. ### Fields | Field | Type | Description | | -------------- | -------------- | -------------------------------------------------------------------------------- | | `download_url` | string \| null | Signed URL to download the WebP sprite sheet | | `url` | string \| null | Signed URL to load the WebP sprite sheet inline | | `metadata` | object \| null | Tile layout information for extracting individual frames (experimental API only) | **`metadata` fields:** | Field | Type | Description | | -------------- | ------- | ------------------------------------------- | | `tile_x` | integer | Number of thumbnail columns in the grid | | `tile_y` | integer | Number of thumbnail rows in the grid | | `thumb_width` | integer | Width of each thumbnail in pixels | | `thumb_height` | integer | Height of each thumbnail in pixels | | `padding` | integer | Gap in pixels between thumbnails | | `frames` | integer | Total number of frames sampled in the sheet | ### When to use Use `media_links.scrub_sheet` when building a custom video player or timeline UI that needs to show a preview thumbnail as the user scrubs. Rather than making a separate request for each frame, the sprite sheet bundles all preview frames into a single image download. ### Example request ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.scrub_sheet ``` ### Example response ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "interview-clip.mp4", "type": "file", "media_links": { "scrub_sheet": { "download_url": "https://assets.frame.io/...", "url": "https://assets.frame.io/...", "metadata": { "tile_x": 10, "tile_y": 10, "thumb_width": 160, "thumb_height": 90, "padding": 1, "frames": 100 } } } } } ``` ### Extracting a frame from the sprite sheet The sprite sheet is a grid of `tile_x` columns × `tile_y` rows. To display the thumbnail for a given frame index (zero-based), calculate its position within the image: ```javascript function getFrameOffset(frameIndex, metadata) { const { tile_x, thumb_width, thumb_height, padding } = metadata; const col = frameIndex % tile_x; const row = Math.floor(frameIndex / tile_x); return { x: col * (thumb_width + padding), y: row * (thumb_height + padding), width: thumb_width, height: thumb_height, }; } ``` You can then use CSS `background-position` to show the correct tile from the sprite sheet: ```javascript function applyFrameToElement(el, frameIndex, scrubSheet) { const { x, y, width, height } = getFrameOffset(frameIndex, scrubSheet.metadata); el.style.backgroundImage = `url(${scrubSheet.url})`; el.style.backgroundPosition = `-${x}px -${y}px`; el.style.width = `${width}px`; el.style.height = `${height}px`; } ``` To map a playback position (in seconds) to a frame index, use the total video duration and the number of frames in the sheet: ```javascript function positionToFrameIndex(currentSeconds, durationSeconds, metadata) { const progress = currentSeconds / durationSeconds; return Math.min( Math.floor(progress * metadata.frames), metadata.frames - 1 ); } ``` The `metadata` field is only available on the experimental API version. On the stable v4 API, `scrub_sheet` returns `download_url` and `url` only. ## Combining multiple includes You can request multiple includes in a single API call: ```bash GET /v4/accounts/{account_id}/files/{file_id}?include=media_links.thumbnail,media_links.original ``` ```json { "data": { "id": "93e4079d-0a8a-4bf3-96cd-e6a03c465e5e", "name": "hero-banner.png", "type": "file", "media_links": { "thumbnail": { "download_url": "https://s3.amazonaws.com/...", "url": "https://s3.amazonaws.com/..." }, "original": { "download_url": "https://s3.amazonaws.com/...", "inline_url": "https://s3.amazonaws.com/..." } } } } ``` ## Choosing the right include | Goal | Include to use | | ---------------------------------------------- | ------------------------------------------ | | Show a preview image in your UI | `media_links.thumbnail` | | Let a user download the original file | `media_links.original` | | Open the original file directly in the browser | `media_links.original` → `inline_url` | | Get the best quality rendition for export | `media_links.high_quality` | | Get a small rendition for low-bandwidth use | `media_links.efficient` | | Stream or download a low-res video (legacy) | `media_links.video_h264_180` | | Build a video scrubbing UI with frame previews | `media_links.scrub_sheet` | | Navigate a user to the file in Frame.io | Use `view_url` from the base file response | `view_url` — available on every file response without needing an include — is a permanent deep-link into the Frame.io web app. It is **not** a media URL; it opens the Frame.io UI and has no expiry. Use it when you want to direct a user to review or comment on an asset directly in Frame.io, not when you need to serve or download the file programmatically. ## Include availability Media link includes are only populated once Frame.io has finished processing the uploaded file. If you request an include immediately after upload, the URLs may be `null` while transcoding is in progress. Check the `status` field on the file object — includes will be available once status is `ready`. # Managing User Permissions This guide explains how to manage user permissions with the Frame.io V4 API. It covers how permissions work at the Account, Workspace, and Project levels, and which endpoints to use at each. *** ## Permission Levels Permissions in Frame.io are managed across the Account, Workspace, and Project levels. Each level uses its own set of roles: ``` Account │ ├── (admin) - full access to all Workspaces, Projects, and Restricted Projects │ └── (member) │ ├── Workspace - (full_access | editor | edit_only | commenter | viewer) │ │ │ └── Project - (full_access | editor | edit_only | commenter | viewer) │ └── Restricted Project - (members require direct invite) ``` Every user has an account role. Through the API, you can set a user's role to `admin` or `member`. Account Admins have full access to all Workspaces and Projects. Account Members can be selectively added to the Workspaces and Projects they need. When you add an Account Member to a Workspace, the permission level you assign (`full_access`, `editor`, `edit_only`, `commenter`, or `viewer`) applies to all existing and future Projects within it. For example, if you add an Account Member as a `viewer`, they will have `viewer` permissions whenever they access any Project in that Workspace. That same Account Member can be added to a specific Project within that Workspace as an `editor`. As a result, whenever they access that Project they will have `editor` permissions. Their `viewer` permissions continue to apply for all other Projects in that Workspace. Since Project assignments are separate from Workspace assignments, if you remove that Account Member from the Workspace, they will retain their `editor` permissions for that single Project. Restricted Projects are the exception. Account Members always require a direct invite. More on this in the Project Level Permissions section below. ## Account Level Permissions Every user in your Account has a role: | Role | Permissions | Configurable via API | Endpoint | | -------- | ------------------------------------------------------------------------------- | -------------------- | -------------------------------------------- | | Owner | Full access to all Workspaces and Projects. One per account | No | — | | `admin` | Full access to all Workspaces and Projects | Yes | `PATCH /accounts/:account_id/users/:user_id` | | `member` | Permissions set at Workspace and/or Project level | Yes | `PATCH /accounts/:account_id/users/:user_id` | | Reviewer | Access only through share links. Created when a user is added to a secure share | No | — | *** Account Admins have full access everywhere. To limit an Admin's access to specific resources, first change their account role to Member, then add them to the Workspaces or Projects they need. For example: ```curl curl https://api.frame.io/v4/accounts/:account_id/users \ -H "Authorization: Bearer " ``` ```curl curl -X PATCH https://api.frame.io/v4/accounts/:account_id/users/:user_id \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "data": { "role": "member" } }' ``` ```curl curl -X PATCH https://api.frame.io/v4/accounts/:account_id/projects/:project_id/users/:user_id \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "data": { "role": "edit_only" } }' ``` ### Account Permissions Endpoints
Lists users in a given account, including user details (ID, name, email) and their account role.
`GET` `https://api.frame.io/v4/accounts/:account_id/users`
[Documentation](/platform/api-reference/account-permissions/index)
Updates a user’s role for the account. This is currently an experimental endpoint.

`PATCH` `https://api.frame.io/v4/accounts/:account_id/users/:user_id`
[Documentation](/platform/v4-experimental/api-reference/account-permissions/developer-api-web-experimental-account-user-roles-controller-update) *** ## Workspace Level Permissions When you add an Account Member to a Workspace, they have that permission level on all Projects within it. Workspaces are invite-only, so Account Members only see the Workspaces they are added to.
| Role | Permissions | | ------------- | --------------------------------------------------------------------------------- | | `full_access` | Upload, manage, share, comment, view, download, manage settings, and invite users | | `editor` | Upload, manage, share, comment, view, download | | `edit_only` | Upload, manage, comment, view. Cannot share or download | | `commenter` | View and comment | | `viewer` | View only |
### Workspace Permissions Endpoints
Lists users with access to a given workspace, including user details (ID, name, email) and their role.
`GET` `https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/users`
[Documentation](/platform/api-reference/workspace-permissions/index)
Modifies a user’s role in a given workspace. This will either update the user’s role if they were already added to the workspace, or add them with the given role.
`PATCH` `https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/users/:user_id`
[Documentation](/platform/api-reference/workspace-permissions/workspace-user-roles-update)
Removes a user from a given workspace
`DEL` `https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/users/:user_id`
[Documentation](/platform/api-reference/workspace-permissions/workspace-user-roles-delete) *** ## Project Level Permissions Projects use the same permission levels as Workspaces. Add a user directly to a Project when they need access to that specific Project only, or when they need a different permission level than their Workspace assignment. Users do not need Workspace access to be added to a Project.
| Role | Permissions | | ------------- | --------------------------------------------------------------------------------- | | `full_access` | Upload, manage, share, comment, view, download, manage settings, and invite users | | `editor` | Upload, manage, share, comment, view, download | | `edit_only` | Upload, manage, comment, view. Cannot share or download | | `commenter` | View and comment | | `viewer` | View only |
**Example: Add a user to a Project** ```curl curl -X PATCH https://api.frame.io/v4/accounts/:account_id/projects/:project_id/users/:user_id \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "data": { "role": "full_access" } }' ``` *** ### Restricted Projects Restricted Projects require a direct invite. Workspace access does not carry over, so users can only access a Restricted Project if they have been added to it directly. To grant a Member access, add them to the Project with the appropriate permission level. Account Admins and Owners are the exception and have access to all Restricted Projects. ### Project Permissions Endpoints
Lists users with access to a given project, including user details (ID, name, email) and their role.
`GET` `https://api.frame.io/v4/accounts/:account_id/projects/:project_id/users`
[Documentation](/platform/api-reference/project-permissions/index)
Modifies a user’s role in a given project. This will either update the user’s role if they were already added to the project, or add them with the given role.
`PATCH` `https://api.frame.io/v4/accounts/:account_id/projects/:project_id/users/:user_id `
[Documentation](/platform/api-reference/project-permissions/project-user-roles-update)
Removes a user from a given project
`DEL` `https://api.frame.io/v4/accounts/:account_id/projects/:project_id/users/:user_id`
[Documentation](/platform/api-reference/project-permissions/delete) *** ## Resources Additional resources you may find helpful: * The Frame.io [Developer Forum](https://forum.frame.io/) is where developers can ask questions, share feedback, and discuss what they're building * [Help Center article](https://help.frame.io/en/articles/9875389-user-roles-and-permissions) on User Roles and Permissions * The OWASP [Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html#prefer-attribute-and-relationship-based-access-control-over-rbac), for additional information on Relationship and Attribute based access control # V4 Webhooks ## What's a Webhook? A **webhook** is a push-style HTTP callback that Frame.io fires **as soon as something interesting happens** in your account (e.g., a new file finishes transcoding, a comment is added, a project is created). Instead of polling the API, you supply a public HTTPS URL; Frame.io sends a JSON payload to that URL in real time so you can: For more on what a webhook is, and what it does, see [https://docs.webhook.site/](https://docs.webhook.site/). ## Endpoint Overview | **Operation** | **Endpoint** | **Details** | | ------------------------------------- | --------------------------------------------------------------------- | -------------------------------------------- | | **Create** a webhook | POST /v4/accounts/\{account\_id}/workspaces/\{workspace\_id}/webhooks | Body with `name`, `url`, `events[]` | | **List** all webhooks for a workspace | GET /v4/accounts/\{account\_id}/workspaces/\{workspace\_id}/webhooks | Supports pagination | | **Show** one webhook | GET /v4/webhooks/\{webhook\_id} | Returns signing secret only at creation time | | **Update** a webhook | PATCH /v4/webhooks/\{webhook\_id} | Change `url`, `events`, or `is_active` | | **Delete** a webhook | DELETE /v4/webhooks/\{webhook\_id} | Immediately stops deliveries | **Authentication** — All V4 endpoints require an OAuth 2.0 access token obtained through the Adobe Developer Console. Legacy developer tokens and JWTs are **not** accepted. ## Changes and Updates in Frame V4 Webhooks created in Legacy transfer to V4 with the following changes: 1. **Payload Structure**: Added Account ID to the payload 2. **Endpoint Changes**: The `team_id` is no longer provided in the JSON payload, but is instead in the path parameter of the URL: `https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/webhooks` 3. **API Integration**: Due to changes in API structure, endpoints, and authentication methods, any existing code for incoming webhooks that makes subsequent calls to the Frame.io API for enrichment and look-up of resources require updating 4. **Event Types**: Asset webhooks have been split into separate File and Folder events - any webhooks coming from Legacy with asset events need to be updated to have the appropriate File and Folder events **Webhook Status After Migration** — When your account migrates to Frame.io V4, existing webhooks from previous versions are automatically disabled. This ensures you can modify your webhook endpoints and integration logic to work with V4's updates before reactivating them. Webhooks that haven't been updated for V4 compatibility will encounter errors if enabled without proper modifications. You can verify which webhooks are inactive by examining the `is_active` field through the API or by reviewing your [webhook settings](https://next.frame.io/settings/webhooks) before turning them back on. ## Webhook Event Subscriptions When creating and updating webhooks identify which events you're interested in. Choose as few or as many as you'd like, note that the experience is better if you subscribe to fewer events, splitting up your webhooks logically with different naming schemes and different endpoints so that you can model your business logic on the receiving end to do less filtering and routing in shared functions. Event scope — All events are scoped to the Workspace provided during the creation of the webhook. This means events will be sent for actions taken in all projects in that Workspace. ### Projects | Event | Description | | ----------------- | ------------------------------------------ | | `project.created` | A new Project has been **created** | | `project.updated` | A Project's settings have been **updated** | | `project.deleted` | A Project has been **deleted** | ### Files | Event | Description | | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `file.created` | A File has been **created** in Frame.io. *Note:* This triggers before the file finishes uploading. If your handler needs the complete file, we recommend listening for the `upload.completed` event instead | | `file.ready` | All transcodes have **completed**, after an file has been uploaded and processed | | `file.updated` | A File's name, or other information has changed | | `file.deleted` | A File has been **deleted** (manually or otherwise) | | `file.upload.completed` | A File has been **uploaded** | | `file.versioned` | A File version has been **created** | ### Folders | Event | Description | | ---------------- | ----------------------------------------- | | `folder.created` | A new Folder has been **created** | | `folder.updated` | A Folder's settings have been **updated** | | `folder.deleted` | A Folder has been **deleted** | ### Comments | Event | Description | | --------------------- | -------------------------------------------- | | `comment.created` | A new comment or reply has been **created** | | `comment.updated` | A comment has been updated | | `comment.deleted` | A comment has been **deleted** | | `comment.completed` | A comment has been marked as **completed** | | `comment.uncompleted` | A comment has been marked as **uncompleted** | ### Metadata | Event | Description | | ------------------------ | ------------------------------------ | | `metadata.value.updated` | Metadata fields updated for an asset | ### Collections | Event | Description | | -------------------- | ------------------------------------- | | `collection.created` | A new Collection has been **created** | | `collection.updated` | A Collection has been **updated** | | `collection.deleted` | A Collection has been **deleted** | ### Custom Fields | Event | Description | | --------------------- | --------------------------------------- | | `customfield.created` | A new custom field has been **created** | | `customfield.updated` | A custom field has been **updated** | | `customfield.deleted` | A custom field has been **deleted** | ### Shares | Event | Description | | --------------- | -------------------------------- | | `share.created` | A new Share has been **created** | | `share.updated` | A Share has been **updated** | | `share.deleted` | A Share has been **deleted** | | `share.viewed` | A Share has been **viewed** | ## Webhook Message Payload All webhook payloads contain a `type` field, indicating the event that occurred, and a `resource` object. The `resource` object contains the `type` and `ID` of the Frame.io resource related to the event. ### Example Payload ```json { "account": { "id": "6f70f1bd-7e89-4a7e-b4d3-7e576585a181" }, "project": { "id": "7e46e495-4444-4555-8649-bee4d391a997" }, "resource": { "id": "d3075547-4e64-45f0-ad12-d075660eddd2", "type": "file" }, "type": "file.ready", "user": { "id": "56556a3f-859f-4b38-b6c6-e8625b5da8a5" }, "workspace": { "id": "378fcbf7-6f88-4224-8139-6a743ed940b2" } } ``` In the above example of a `file.created` event, the `resource.id` indicates the `ID` of the newly created File. Additionally, `workspace`, `project`, and `user` objects are included, which contain the related `workspace.id`, `project.id` and `user.id`. These values can be used to reduce API calls by filtering incoming events or looking up cached data locally. **We do not include any additional information beyond the resource ID about the subscribed resource**. If your application requires additional information or context, we recommend making an API call to look-up more information about the resources being referenced. ## Security By default, all webhooks have a signing key. This non-configurable signing secret can be used to verify that the request originates from Frame.io. The response payload for the webhook you've configured includes the signing secret specific to this webhook. This secret is **only provided in this initial webhook create response**, so store it somewhere safe in your secrets storage or environment variables. Use it later to verify the webhook is coming directly from our servers and was not intercepted or manipulated in any way. ### Verifying Webhook Signatures To guard an integration against man-in-the-middle and replay attacks it is essential to verify the signature of the webhook payload. Verification ensures that webhook payloads were actually sent by Frame.io and payload content has not been modified in transport. Included with the `POST` request are the following HTTP headers: | Header Name | Description | Example | | ----------------------------------- | ----------------------------------- | --------------------------------------------------------------------- | | `X-Frameio-Request-Timestamp` | The timestamp the request was sent | `1604004499` | | `X-Frameio-Signature` | The compute webhook signature | `v0=a77ce6856e609c884575c2fd211d07a9ad1c3f72e19c06ff710e8f086ffca883` | | `user-agent: "Frame.io V4 API"` | User agent in the header for v4 | | | `user-agent: "Frame.io Legacy API"` | User agent in the header for Legacy | | ```python title="Python" import hmac import hashlib def verify_signature(curr_time, req_time, signature, body, secret): """ Verify Webhook signature :Args: curr_time (float): Current epoch time req_time (float): Request epoch time signature (str): Signature provided by the Frame.io API for the given request body (str): Webhook body from the received POST secret (str): The secret for this Webhook that you saved when you first created it """ if int(curr_time) - int(req_time) < 500: message = 'v0:{}:{}'.format(req_time, body) calculated_signature = 'v0={}'.format(hmac.new( bytes(secret, 'latin-1'), msg=bytes(message, 'latin-1'), digestmod=hashlib.sha256).hexdigest()) if calculated_signature == signature: return True return False ``` **The timestamp** is the system time from Frame.io's systems when the outbound webhook is sent. This can be used to prevent [replay](https://en.wikipedia.org/wiki/Replay_attack) attacks. We recommended verifying this time is within 5 minutes of local time. **The signature** is a HMAC SHA256 hash using the signing key provided when the Webhook is first created. **Follow these steps to verify the signature:** Extract the signature from the HTTP headers. Create a message to sign by combining the version, delivery time, and request body: `v0:timestamp:body.` Compute the HMAC SHA256 signature using your signing secret. Compare your computed signature with the provided one! The provided signature is prefixed with `v0=`. Currently Frame.io only has this one version for signing requests. Be sure this prefix is prepended to your computed signature. ## Retries and Logging * Five total attempts (initial + 4 retries) * Exponential back-off starting at 15 s (+ jitter) * A non-`2xx` status or >5 second timeout triggers the retry Frame.io keeps a **failure log** with: `webhook_id`, `account_id`, `event_type`, `resource_id`, `user_id`. ## Webhook Tutorial ### Step 1: Setup receiving end (done first so that you know what your URL will be) Here, we're using [webhook.site](http://webhook.site/) which allows you to easily spin up a single-use webhook receiver that can be used for inspecting payloads, sending basic responses without any actual business logic. When you first navigate to [https://webhook.site](https://webhook.site/), a unique webhook endpoint is created for you which you can copy right away to use. This URL is unique to your session. ![Step 1 Example](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/09ca9e64de4cd7b5b0982e6c2ae5f0978320cd11272b448b7f9f8c2aff1239ab/docs/pages/v4/guides/webhook_site_example.gif) ### Step 2: Choose the event(s) you want to subscribe to For this tutorial, we'll keep it simple and setup this webhook to just subscribe to `file.created` events. The JSON payload we'll use for the webhook creation will be as follows. ```json { "data": { "name": "asset.created sample webhook", "events": ["file.created"], "url": "https://webhook.site/c05f2216-9558-4816-bc09-f77ee7b9de40" } } ``` ### Step 3: Create a webhook resource using Postman Using Postman, make an API call to create the webhook resource, supplying the [webhook.site](http://webhook.site/) endpoint in the payload. ### Step 4: Test! Now that you've created the webhook subscription and have an endpoints setup to receive webhooks, it's time to test it out by triggering the first webhook by performing the appropriate action that would cause it to fire! Since our sample was set up to trigger on the `file.created` trigger, we'll go ahead and upload a new asset into any Project within the corresponding Account and Workspace that the webhook was set up in. ![Step 4 Example](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/7503b906ce873425c6477487378fe9c513d5cbddc524754f0e1fe8ba10de5c16/docs/pages/v4/guides/trigger_asset_created_webhook.gif) ## Additional Resources **Ngrok** is a fantastic tool for developers working with webhooks that need to be exposed on a publicly accessible URL. It creates secure tunnels from your local environment to the internet, allowing you to expose your local server to receive webhook payloads in real-time. **Hookdeck** is a platform designed to help teams manage webhooks reliably by providing a robust event gateway. It centralizes webhook handling, ensuring no events are missed, and offers features such as filtering, queuing, and retrying failed webhooks. **Webhook.site** is an outstanding tool for prototyping and testing webhooks, offering a simple yet powerful platform to capture and inspect HTTP requests sent to unique, auto-generated URLs. **Val.town** is an excellent tool for quickly prototyping webhook handlers because it simplifies the process of writing, testing, and deploying small JavaScript and Python functions directly from the browser. # Postman Collection This guide covers the basics of the official Frame.io Developer API Postman collection, a set of prebuilt requests you can use to get started with the Frame.io V4 API. The collection covers the full range of V4 API endpoints, split into stable and experimental categories. Stable endpoints are production-ready, and experimental endpoints are newer additions that are functional but may change based on feedback before being promoted to stable. ## Getting Started with Postman This guide assumes you have generated credentials for the API. If you haven't, start [here](/platform/docs/quick-start) first Create your Postman account at [postman.com](http://auth.postman.com/__redirect/login), and choose your setup. You can download the Postman app [here](https://www.postman.com/downloads/) or use Postman on the web. Fork or download here ### Setting Up Your Environment The Frame.io Developer API Collection has a default environment with a number of environment variables defined. `BASE_URL` and `IMS_BASE_URL` values are static. Additional environment variables can be configured according to your account information. ![alt image](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/0780e30f05ff2cee570d698b9adc209f24326281b60e23968e5d78e66c5c9b43/docs/pages/v4/guides/postman-envvar.png) ![alt image](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/663c863cbbec947567616faf433d79e3900e70ace3d8d9d26299ee20e204c064/docs/pages/v4/guides/postman-envvar-stage.png) Below is a table with a description of each variable found in the collection's Default and Stage environments: | Variable | Description | How to Retrieve | Environment | | ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------ | -------------- | | `BASE_URL` | Base URL for all V4 API requests | Preconfigured, do not edit | Default | | `IMS_BASE_URL` | Adobe IMS authentication base URL | Preconfigured, do not edit | Default, Stage | | `IMS_CLIENT_ID` | Your Frame.io App Client ID | Credential page in **[Adobe Developer Console](https://developer.adobe.com/developer-console/)** | Stage | | `IMS_CLIENT_SECRET` | Your Frame.io App Client Secret | Credential page in **[Adobe Developer Console](https://developer.adobe.com/developer-console/)** | Stage | | `FOLDER_ID` | Unique ID for the destination folder | Returned in folder response object | Default | | `WEBHOOK_ID` | Unique ID for a configured webhook | Returned in webhook response object | Default | | `ASSET_ID` | Unique ID for a file or folder asset | returned in file or folder response object | Default | | `SHARE_ID` | Unique ID for a share link | returned in share response object | Default | *** ### Setting Up Authorization This guide uses OAuth 2.0 to authenticate with the Frame.io V4 API. For information on other authentication methods, such as Server-to-Server (S2S), see the [Authentication Guide](/platform/docs/guides/authentication/overview). The `IMS_CLIENT_ID` and `IMS_CLIENT_SECRET` environment variables should be set to the values retrieved from your project's **Credential details** in the [Adobe Developer Console](https://developer.adobe.com/console). ![alt image](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/8f77af2f98d46f52b5d9da85adb48ee8f383f326edc8103f291f192deb4d9dba/docs/pages/v4/guides/image_3.png) In your project's **Credential details** section, set the **Redirect URI** and **Redirect URL Pattern** to Postman's public callback endpoint: **Redirect URI** ``` https://oauth/pstmn.io/v1/callback ``` **Redirect URI Pattern** ``` https://oauth\\.pstmn\\.io ``` Once environment variables have been set and saved, the next step is configuring authorization settings. To do so, click the **Collections** icon at the top of the left sidebar to open your collection browser. From the collection browser, select the root of the Frame.io V4 Developer API collection (usually titled **'Frame.io Developer API Collection'** followed by your fork name) and select the **Authorization** tab. ![alt image](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/518e800fde27188c25a4f8438a552fca3cb37a27af7a810f9a93ab959b786615/docs/pages/v4/guides/postman-authorization-tab.png) OAuth scopes are pre-configured in the collection. With your environment variables set, use the **Get New Access Token** button to start the OAuth 2.0 flow. This will open a browser window to complete the authentication process and return the token to Postman. To verify your authorization configuration, select the **`GET user details`** request in the Users folder and click **Send**. A **`200 OK`** response confirms both that your collection is configured correctly and that you've authenticated to the correct account. If you encounter an error, see **[this section](/platform/docs/getting-started#errors)** of the Getting Started guide for information on errors and warnings. **Example Response** ``` { "data": { "avatar_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "email": "user_email@example.com", "id": "00000000-1111-2222-3333-444444444444", "name": "Name" } } ``` *** ## Obtaining Your Account ID `account_id` is a required path parameter for most V4 API endpoints, and is something you'll need to test other requests. You can obtain your `account_id` with the **`GET List accounts`** request, located in the collection's **Accounts** folder. **[API Reference](/platform/api-reference/accounts/index)** **Example Response** ``` { "data": [ { "created_at": "2023-09-25T19:18:29.614189Z", "display_name": "Integration Account", "id": "11111111-2222-3333-4444-555555555555", "roles": [ "admin" ], "storage_limit": 300, "storage_usage": 300, "updated_at": "2024-02-07T16:44:41.986478Z", "image": null } ], "links": { "next": "/v4/accounts" } } ``` If you have multiple Frame.io accounts, each will appear as a separate object in the response Once you have obtained your Account ID, copy the `id` value from the response and save it as an environment variable. You'll reference it as the `account_id` path parameter using `{{ACCOUNT_ID}}` in future requests. *** ## Workspace and Project Operations Your Frame.io files are stored in folders, organized into Projects within Workspaces. For a full overview of the V4 resource hierarchy, see **[this guide](/platform/docs/getting-started#resource-hierarchy)**. ### Listing Workspaces The **`GET list workspaces`** request in the **Workspaces** folder calls **[`/v4/accounts/:account_id/workspaces`](/platform/api-reference/workspaces/index)** and returns a list of Workspaces your account has access to. Some Project operations require `workspace_id` as a path parameter, so save your Workspace ID first if you plan to list or retrieve Projects. A successful request will return a **`200 OK`** status and a response body similar to the example below. **Example Response** ``` { "data": [ { "account_id": "11111111-2222-3333-4444-555555555555", "created_at": "2024-01-25T19:18:29.614189Z", "id": "88888888-bbbb-4444-aaaa-ffffffffffff", "name": "My Workspace", "updated_at": "2024-02-07T16:44:41.986478Z", "creator": { "active": true, "avatar_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "email": "user_email@example.com", "id": "196C1A5777BF4CV00A49411B@176719f5667d82g5594324.e", "name": "Name" } } ], "links": { "next": "/v4/accounts/123/workspaces" } } ``` *** ### Creating a Workspace The **`POST create workspace`** request calls **[`/v4/accounts/:account_id/workspaces`](/platform/api-reference/workspaces/create)** to create a new Workspace for your account. In the request editor, select the **Body** tab to set the name of your Workspace within the `data` object. A successful request will return a **`201 Created`** status and a response body similar to the example below. **Example Response** ``` { "data": { "account_id": "11111111-2222-3333-4444-555555555555", "created_at": "2024-01-25T19:18:29.614189Z", "id": "77777777-999-4444-8888-000000000000", "name": "My New Workspace", "updated_at": "2024-02-07T16:44:41.986478Z" } } ``` *** ### Updating a Workspace The **`PATCH update workspace`** request calls **[`/v4/accounts/:account_id/workspaces/:workspace_id`](/platform/api-reference/workspaces/update)** to update the name of a Workspace. In the request editor, select the **Body** tab to set the new name of your Workspace within the `data` object. A successful request will return a **`200 OK`** status and a response body similar to the example below. **Example Response** ``` { "data": { "id": "77777777-9999-4444-8888-000000000000", "name": "New Workspace Name", "updated_at": "2026-05-01T02:42:00.462467Z", "account_id": "11111111-2222-3333-4444-555555555555", "created_at": "2025-09-22T19:17:02.565496Z" } } ``` *** ### Creating a Project The **`POST create project`** request calls **[`/v4/accounts/:account_id/workspaces/:workspace_id/projects`](/platform/api-reference/projects/create)** to create a new Project in a given Workspace. In the request editor, select the **Body** tab to set the name of your Project within the `data` object. The optional `restricted` property is a Boolean used to create a restricted Project. A successful request will return a **`201 Created`** status and a response body similar to the example below. **Example Response** ``` { "data": { "id": "fd26defb-8bdf-5c39-9746-24d38f109cc3", "name": "test", "status": "active", "restricted": true, "updated_at": "2026-05-01T03:39:58.910884Z", "storage": 0, "workspace_id": "77777777-999-4444-8888-000000000000", "created_at": "2026-05-01T03:39:58.853797Z", "root_folder_id": "d4fca8b4-5fd8-4a94-90aa-de13de4b2021", "view_url": "https://next.frame.io/project/fd26defb-8bdg-5c39-9746-24d38f109cc3" } } ``` Copy the **`root_folder_id`** from the response and set it as the value for your **`FOLDER_ID`** environment variable. You'll need this for the remaining sections of this guide. You can add a user to a newly created restricted Project with a subsequent **`PATCH Update user role in a Project`** request located in the **Project Permissions** folder. (**[API Reference](/platform/docs/guides/postman-collection)**) *** ## Folder and File Operations ### Listing Folder Children The **`GET list folder children`** request calls **[`/v4/accounts/:account_id/folders/:folder_id/children`](/platform/api-reference/folders/index)** to list the children in a given folder. In this case, the project root folder set as your **`FOLDER_ID`** environment variable. You can use the following optional query parameters to refine your response: | Parameter | Type | Description | | ------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`page_size`** | Integer | Limits the number of returned folders
**1-100. Defaults to 50** | | **`type`** | String | Filters folder children by resource type: **`file`**, or **`folder`** | | **`after`** | String | Opaque Cursor for requests returning paginated results.
**This is auto-generated and returned in the `links` object of the previous response.** It is not intended to be human readable. | | **`include_total_count`** | Boolean | Returns the total count of all entities
**Defaults to False** | | **`include`** | Enum | Appends additional data to each returned object such as `creator`, `project`, `media_links`.
For a full list of supported parameters, see **[API Reference](/platform/api-reference/folders/index#request.query.include)** | A successful request will return a **`200 OK`** status and a response body similar to the example below. **Example Response** ``` { "data": [ { "type": "file", "created_at": "2023-09-25T19:18:29.614189Z", "file_size": 1137444, "id": "cba3b1c5-c644-4592-91c5-0d0b91f4895d", "media_type": "image/png", "name": "asset.png", "parent_id": "2559e2c4-9bb9-4284-b616-a97700a579a4", "project_id": "955c0511-656a-4859-b824-ebdbfdcb615b", "status": "created", "updated_at": "2024-02-07T16:44:41.986478Z", "view_url": "https://next.frame.io/project/d5e6011c-2bc9-4596-be05-77d562627112/view/5a89a9fb-0900-4b23-826b-127b90e4db4c", "creator": { "active": true, "avatar_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "email": "user_email@example.com", "id": "196C1A5666BF4EB00A49411B@176719f5667c82b4494214.e", "name": "Jon Doe" }, "media_links": { "high_quality": { "download_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN" }, "original": { "download_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "inline_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=inline%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragSDFXDFh&1Key-Pair-Id=KKI497NESTHMN" }, "thumbnail": { "download_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "url": "https://picture2.frame.io/image/s3://frameio-assets-development/image/cd58cb8e-24b3-4498-8d0f-9532fcd04d11/image_full.png?alg=HS256&sig=0_u7w_wz2MwQHOXp000ibbQSMRijujyaUu8V3YYPxu4&exp=1729857600" } }, "metadata": [ { "field_type": "select", "field_definition_id": "b859ccec-9536-4bf2-bc6f-5e9206e26606", "field_definition_name": "Fields definition name", "mutable": true, "value": [ { "display_name": "Display name", "id": "212add59-6527-4fd2-ac30-55ea94a8b5f8" } ], "field_options": [ { "display_name": "Display name", "id": "212add59-6527-4fd2-ac30-55ea94a8b5f8" }, { "display_name": "Display name 2", "id": "c6eb873f-125b-4317-b857-1a22eb3dbf22" } ] } ], "project": { "created_at": "2024-01-25T19:18:29.614189Z", "description": "Project Description", "id": "e0e30b1d-c3aa-44ee-926e-c6c326fb10dc", "name": "My Project", "root_folder_id": "be733511-6f15-4d97-8ee7-bc23b2fb0bd7", "status": "active", "storage": 15000, "updated_at": "2024-02-07T16:44:41.986478Z", "view_url": "https://next.frame.io/project/d5e6011c-2bc9-4596-be05-77d562627112/", "workspace_id": "91b10e83-5874-44de-9b57-41c937b87256", "owner": { "active": true, "avatar_url": "https://assets.frame.io/uploads/cd58cb8e-24b3-4448-8d0f-9532fcd04d11/original.png?response-content-disposition=attachment%3B+filename%3D%22foo.png&Expires=1729857600&Signature=L09h0pi82dCrMYjr9lMHBragByWYh1&Key-Pair-Id=KKI497NESTHMN", "email": "user_email@example.com", "id": "196C1A5666BF4EB00A49411B@176719f5667c82b4494214.e", "name": "Jon Doe" }, "restricted": false } } ], "links": { "next": "/v4/accounts/123/folders/123/folders" }, "total_count": 10 } ``` If you are testing paginated results, locate the **`links`** object in your response:
  • From the **`next`** property URL, copy only the string value following **`after=`**
  • Set this as the value of your **`after`** query param in your next request.
  • **Watch out for double encoding!** If the URL contains encoded characters (ie: %3D%3D) replace them with the raw version ( **==** ). Postman interprets your input literally and may double encode these, leading to a **`422`** error
*** ### Creating a File - Local Upload The **`POST create file - local upload`** request calls **[`/v4/accounts/:account_id/folders/:folder_id/files/local_upload`](/platform/v4/api-reference/files/create-local-upload)** to upload a local file in a specified folder. Local uploads require two or more requests depending on file size. For your first test, use a small file (less than 10 MB) to limit the process to a single upload URL. In the request editor, select the **Body** tab to set the name and file size (specified in **bytes**) within the `data` object. A successful request will return a **`201 Created`** status and a response body similar to the example below. **Example Response** ``` { "data": { "created_at": "2023-09-25T19:18:29.614189Z", "file_size": 1137444, "media_type": "image/png", "parent_id": "2559e2c4-9bb9-4284-b616-a97700a579a4", "project_id": "955c0511-656a-4859-b824-ebdbfdcb615b", "status": "created", "type": "file", "updated_at": "2024-02-07T16:44:41.986478Z", "view_url": "https://next.frame.io/project/d5e6011c-2bc9-4596-be05-77d562627112/view/5a89a9fb-0900-4b23-826b-127b90e4db4c", "id": "cba3b1c5-c644-4592-91c5-0d0b91f4895d", "name": "asset.png", "upload_urls": [ { "size": 20000000, "url": "https://my.fileupload.url.dev" } ] } } ``` This call has created a placeholder file resource in the specified folder. Use the pre-signed upload URL in the `upload_urls` array in the response to complete the upload in the next step. Click the URL in the `upload_urls` array in your response to open a new request tab in Postman. Change the request method to **`PUT`**. In the request editor, select the **Headers** tab to add the following headers to your request:
  • **`x-amz-acl`:`private`**
  • **`Content-Type`** : This must exactly match the extension type specified in the filename (ie: a file named **`IMG.png`** must use **`image/png`** )
![alt image](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/86ddb4aebecaffdee01cf07be3c2e7af0b616285721ec8ef412575114a916b21/docs/pages/v4/guides/postman-local-upload.png) In the request editor select the **Body** tab and click the **binary** option to select your file. Once selected click **Send** to complete your request. A successful request will return a **`200 OK`** status, confirming your file has been uploaded. Once your file has been uploaded, the Frame.io media pipeline automatically handles transcoding and thumbnail generation. For larger files, it may take a few moments for the file to move from **`created`** to a **`ready`** state. *** ### Creating a File - Remote Upload The **`POST create file - remote upload`** request calls **[`/v4/accounts/:account_id/folders/:folder_id/files/remote_upload`](/platform/v4/api-reference/files/create-remote-upload)** to pull an external file into a specified folder using a provided source URL. In the request editor, select the **Body** tab to set the name and source URL of your file within the `data` object. A successful request will return a **`202 Accepted`** status and a response body similar to the example below. **Example Response** ``` { "data": { "created_at": "2023-09-25T19:18:29.614189Z", "file_size": 1137444, "media_type": "image/png", "parent_id": "2559e2c4-9bb9-4284-b616-a97700a579a4", "project_id": "955c0511-656a-4859-b824-ebdbfdcb615b", "status": "created", "type": "file", "updated_at": "2024-02-07T16:44:41.986478Z", "view_url": "https://next.frame.io/project/d5e6011c-2bc9-4596-be05-77d562627112/view/5a89a9fb-0900-4b23-826b-127b90e4db4c", "id": "cba3b1c5-c644-4592-91c5-0d0b91f4895d", "name": "asset.png" }, "links": { "status": "/v4/accounts/fb4dd62f-8a89-4e98-8fa1-ad4b29a0094f/files/eab70952-966c-4d99-949b-f0a947ca5754/status" } } ``` # Custom Actions Beta Frame.io Actions provide quick access to common media operations like downloading, renaming, and duplicating items – and also allow for integrations with 3rd party tools and services to be surfaced directly within the user interface of [Frame.io](https://next.frame.io/). ## About Actions With the introduction of Custom Actions (beta), developers can configure and manage their own Actions in Frame.io V4. Leveraging the same underlying event system as [Webhooks](https://developer.adobe.com/frameio/guides/Webhooks/), Custom Actions are an alternative mechanism for developers to connect their assets to the tools that matter most to the users in their Frame.io Account. Actions can be executed by any user that is a Member of the Frame.io Workspace the Action is enabled in. When executing an Action, Frame.io sends a payload to a URL you provide. The receiving application responds with an HTTP status code to acknowledge receipt, or with a custom callback to render additional form fields in the Frame.io UI. The receiving application can be your own hosted program, service, or even low-code/no-code IPaaS tool like Workfront Fusion or Zapier. Use the Custom Actions beta to build integrations directly into [Frame.io](https://next.frame.io/) as programmable UI components. This enables workflows that can be triggered by users within the app, leveraging the same underlying events routing as webhooks. You can create user-triggered single or multi-step forms that come back to Frame.io as another form or a basic response. And when a user clicks a Custom Action on an Asset, Frame.io sends a payload to a URL you provide. The receiving application responds with an HTTP status code to acknowledge receipt, or responds with a custom callback that can render additional UI in Frame.io. ## Actions Improvements in V4 Leveraging learnings from users of our Legacy version, we've included a number of enhancements to the Actions feature set in Frame.io V4: Previously limited to text and single-select fields, we now support multi-select, text area (for a larger text box) and a boolean field (for a radio button) as well. Text fields don't make it easy for users to copy/paste URLs. Use our new link field to get an easy, 1-click to copy experience instead. Depending on the amount of data returned, you can trust your Action's modal to dynamically resize to best fit the information in your form, including scrollable modals when needed. Configure your Action to target up to 100 assets in one request.
NEW Not limited to one asset-type, Actions can be triggered across a combination of files, folders, and version-stacks. We want to hear from both developers and end-users about how you use Actions so we've surfaced a feedback form in the settings page on Web. ## Migrated Actions There are a few things to keep in mind when migrating to a Frame.io V4 Account containing Custom Actions previously created in the legacy version of Frame.io. ### Action Status Upon Account migration to Frame.io V4, all custom Actions created in earlier versions will have a status of 'null' and will be automatically disabled. This provides users the opportunity to first update your Actions to use the V4 API before enabling as any Actions not updated will fail. To identify Actions in this state visit the Actions Settings page and reference the column "Status" or, if using the API, by checking the is\_active field. ### Actionable Resources: Files, Folders & Version Stacks Given the separation of asset types as separate resources in the Frame.io V4 API, there may be behavior to consider when interpreting the resource ID received in your Action's payload. The behavior for individual Files is straight-forward, as the ID will reflect the specific File the Action was executed on. Likewise for Folders, you'll be receiving the ID for the Folder the Action was executed on; however, depending on your use-case you have multiple options when defining your Action's behavior. Use the Folder ID to make subsequent calls to the Frame.io API if you want interact with the Folder resource itself. Alternatively, you may want to get the children of that Folder in order to perform further processing on the assets within. When an action is Executed on a Version Stack, your payload will contain the ID for the 'Head Asset', which is the top most File in the Stack and is what is shown in the Frame.io UI. You can read more about the differences between the Frame.io Legacy API and V4 in our [Migration Guide](/docs/resources/migration). Configure [Custom Actions](/api-reference/custom-actions/actions-show) with the API. A Custom Action requires: | Field name | Description | | ----------- | ----------------------------------------------------------------------------------------------------------------- | | Name | The name you choose for your Custom Action. It will be shown in the menu of available Custom Actions in Frame.io. | | Description | Explain what the Action does, for reference (the description won't appear in the Frame.io web app). | | Event | Internal event key to help you differentiate between standard webhook events and your own. | | URL | Where to deliver events. | | Workspace | The Workspace that will use the Custom Action. | ## Configure Your Custom Action When a user triggers a Custom Action, Frame.io sends a payload to a URL you provide. The receiving application can respond with an HTTP status code to acknowledge receipt, or respond with a custom callback that renders additional UI in [Frame.io](https://next.frame.io/). Account Admin permissions are required to create Custom Actions for a Workspace. Ask your Admin to modify your permissions if you don't have access. ### Multi-asset configuration Multi-asset support is configuration-driven and must be explicitly enabled from the Action’s configuration modal [on Web](https://next.frame.io/settings/actions). This can be done during the creation of a new Action, or when updating an existing Action.  When multi-asset support is enabled, the payload format is switched immediately. The legacy and multi-asset-supported payloads are mutually exclusive. ## Payload From Frame.io When the user clicks your Custom Action, a payload is sent to the URL you set in the URL field. Use this payload to identify: * Which Custom Action was clicked * Which resource(s) were clicked * Which user took the action * Which event type was triggered - Which account is associated with the Custom Action - Which Workspace is associated with the Custom Action - Which Project contains the resource(s) Custom actions originally accepted only one asset per request using a `resource` object containing one asset. With multi-asset support enabled, the payload uses a `resources` list of one or more assets (with a maximum of 100 assets in one request). ```json POST /your/url { "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504", "action_id": "0aeb9feb-f8eb-4100-a8c2-b39b66d354ab", "data": { "description": "Pretty cool video.", "title": "Hey there!" }, "interaction_id": "985559de-865a-40e5-a687-2bbed4497eaa", "project": { "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea" }, "resources": [ { "id": "fe41c5a8-1b8d-417d-a7df-0b88bc19b476", "type": "file" }, { "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39", "type": "file" } ], "type": "some.event", "user": { "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935" }, "workspace": { "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f" } } ``` ```json POST /your/url { "account_id": "1a94720e-f7f5-4c41-ab62-d11eebe3d504", "action_id": "0e38b93a-9f10-4bc7-90bc-bd07a16e510a", "data": { "description": "Wow look at this.", "title": "Hey there!!" }, "interaction_id": "dff6d369-7150-41f9-8e6f-4f0895f6b416", "project": { "id": "3e34e7cb-5c21-49f5-8ca9-a1419584c2ea" }, "resource": { "id": "fe81fb2b-1316-4a76-9cf6-0630f474fc39", "type": "file" }, "type": "some.event", "user": { "id": "68093c1c-4b05-41ce-a3c9-e64d195b1935" }, "workspace": { "id": "629086c0-f6aa-4d63-a284-f39bcd415b9f" } } ``` ### Migrating from the Legacy Payload The Legacy payload is planned for deprecation and users are strongly encouraged to migrate their services to process the new payload. By enabling the configuration flag and updating your payload handling, an Action can transition seamlessly to support a multi-asset payload. 1. Replace usage of the singular `resource` object with `resources` list 2. Update code to iterate over `resources` list 3. Enable Multi-asset flag in Actions configuration | Field name | Description | | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `account_id` | The unique Account ID of the Action. | | `action_id` | The unique ID of the Action. | | `interaction_id` | A unique identifier generated by Frame.io used to keep track of your transaction across multiple requests, such as chained Message or Form Callbacks. Remains the same throughout every sequence of the Action. | | `project_id` | The unique Project ID of the Action. | | `resource.id` | The ID of the resource from which you triggered the Action. | | `resource.type` | The type of resource from which you triggered the Action. | | `type` | The name provided in the `event` field when configuring the Action. | | `user.id` | The ID of the user who triggered the Action. | | `workspace.id` | The ID of the Workspace using the Action. | | `data` | Key-value pairs containing the form field names and values selected by the user. Your app receives this to know what choices were made. | ## Interactions, Retries and Timeouts The `interaction_id` is a unique identifier to track of the interaction as it evolves over time. If you do not need to respond to the user, return a 200 status code, and you're done. While optional, we recommend including information about the result of the action, like a success message or error alert. Custom actions support message callbacks. Frame.io expects a response in less than 10 seconds, and attempts to retry up to 5 times while waiting for a successful response. Ideally the response is immediate and asynchronous actions occur after a trigger via a Custom Action. ## Create a Message Callback In your HTTP response to the webhook event, you can return a JSON object describing a message that will be returned to the initiating user in the Frame.io UI. ```json { "title": "Success!", "description": "The thing worked! Nice." } ``` Messages let you provide feedback to the user directly in the Frame.io UI. If you need to collect additional information from the user, use **Form Callbacks** instead. ## Create a Form Callback Let's say that you need more info before you start your process. For example, you may be uploading content to a system that requires additional details. You can describe a Form in your response, which the user fills out and submits back to you. Here's an example: ```json { "title": "Need some more info!", "description": "Getting ready to submit this file!", "fields": [ { "type": "text", "label": "Title", "name": "title", "value": "MyVideo.mp4" }, { "type": "select", "label": "Captions", "name": "captions", "options": [ { "name": "Off", "value": "off" }, { "name": "On", "value": "on" } ] } ] } ``` When the user submits the form, you'll receive an event on the same URL as the initial POST: ```json POST /your/url { "type": "your-specified-event-name", "interaction_id": "the-same-id-as-before", "action_id": "unique-id-for-this-custom-action", "data":{ "title": "MyVideo.mp4", "captions": "off" } } ``` All custom fields added on a form appear in the `data` section of the JSON payload sent by Frame.io. Use the `interaction_id` to map the initial request and this new form data. You can respond with a message, or chain another form. By chaining Actions, Forms, and Messages, you can effectively program multi-step workflows in Frame.io with business logic from an external system. ## Form Details Like messages, Forms support `title` and `description` attributes that render at the top of the Form. Beyond that, each form field accepts the following base attributes: * **type** -- Tells the Frame.io UI which type of data to expect, and which component and render. * **label** -- Appears on the UI as the header above the field. - **name** -- Key by which the field will be identified on the subsequent payload. - **value** -- Value with which to pre-populate the field. ## Supported Field Types ### Text field A simple text field with no additional parameters. ```json { "type": "text", "label": "Title", "name": "title", "value": "MyVideo.mp4" } ``` ### Text area A simple text area with no additional parameters. ```json { "type": "textarea", "label": "Description", "name": "description", "value": "This video is really, really popular." } ``` ### Select list Defines a picklist that the user can choose from. Must include an `options` list, each member of which should include a human-readable `name`, and a machine-parseable `value`. ```json { "type": "select", "label": "Captions", "name": "captions", "value": "off", "options": [ { "name": "Off", "value": "off" }, { "name": "On", "value": "on" } ] } ``` ### Checkbox A simple checkbox with no additional parameters. ```json { "type": "boolean", "name": "enabled", "label": "Enabled", "value": "false" } ``` ### Link A simple link with no additional parameters. ```json { "type": "link", "name": "videoLink", "label": "Video Link", "value": "https://www.youtube.com/watch?v=XtX1zv9CEVc" } ``` ## The Frame.io Permissions Model Custom Actions have a special permissions model: they belong to a Workspace, not to any specific user who exists on an Account. That means: * Any Admin can create a Custom Action on a Workspace. * Any Admin can modify or delete a Custom Action that exists on a Team. - Once modified, all users will immediately see the result of the change. ## Security and Verification By default, all Custom Actions have a signing key generated during their creation. This is not configurable. This key can be used to verify that the request originates from Frame.io. Included in the `POST` request are the following: | Name | Description | | ----------------------------- | ------------------------------------------ | | `X-Frameio-Request-Timestamp` | The time your Custom Action was triggered. | | `X-Frameio-Signature` | The computed signature. | **The timestamp** is the time the request was signed on its way out of Frame.io's network. This can be used to prevent replay attacks. We recommended verifying this time is within 5 minutes of local time. **The signature** is a HMAC SHA-256 hash using the signing key provided when the Custom Action is first created. ### Verifying the Signature Extract the signature from the HTTP headers. Create a message to sign by combining the version, delivery time, and request body `v0:timestamp:body`. Compute the HMAC SHA256 signature using your signing secret. Compare your computed signature with the provided one! The provided signature is prefixed with `v0=`. Currently Frame.io only has this one version for signing requests. You will need to add this prefix to your computed signature. ```python title="Python" import hmac import hashlib def verify_signature(curr_time, req_time, signature, body, secret): """ Verify webhook/custom action signature :Args: curr_time (float): Current epoch time req_time (float): Request epoch time signature (str): Signature provided by the frame.io API for the given request body (str): Custom Action body from the received POST secret (str): The secret for this Custom Action that you saved when you first created it """ if int(curr_time) - int(req_time) < 500: message = 'v0:{}:{}'.format(req_time, body) calculated_signature = 'v0={}'.format(hmac.new( bytes(secret, 'latin-1'), msg=bytes(message, 'latin-1'), digestmod=hashlib.sha256).hexdigest()) if calculated_signature == signature: return True return False ``` ## Beta Feedback We'd love to hear from developers and end-users about the ways you'd like to use Actions in Frame.io V4. Be sure to [reach out to us](https://forum.frame.io/) with your questions, ideas, and use-cases to help inform our prioritization. # Introduction to Zapier Transform your Frame.io workflows with simple, no-code automation that anyone can set up in minutes with no technical expertise required. ## What is Zapier? **Zapier is your digital assistant that connects your favorite apps automatically.** Think of it as a bridge that lets your apps "talk" to each other without you having to do anything manually. The magic happens through simple "if this, then that" rules called [**Zaps**](https://help.zapier.com/hc/en-us/articles/8496309697421-What-is-a-Zap). For example: "When a new video is uploaded to Frame.io, automatically create a share link to send to my team." That's it—no coding, no complex setup, just point-and-click simplicity. With over [7,000+ apps available](https://zapier.com/apps), Zapier turns repetitive, mundane tasks into automated workflows, giving you and your team more time to focus on the most important work. ## Why Use Frame.io with Zapier? Frame.io's [Zapier integration](https://zapier.com/apps/frameio-v4/integrations) brings the power of automation to your file workflows. Instead of manually checking for new uploads, copying links, or sending status updates, you can set up automated workflows that handle these tasks for you. **Popular automation examples:** * **New upload notifications**: Automatically notify your team in Slack when someone uploads a new video * **Project management sync**: Create tasks in Airtable when new Frame.io projects are created * **Client communication**: Send email updates to clients when their review is ready * **File organization**: Automatically save approved assets to Google Drive or Dropbox * **Status tracking**: Update project status in your CRM when comments are resolved ## Getting Started is Easier Than You Think **No coding knowledge required.** Zapier's visual interface guides you through each step: "When this happens in Frame.io..." (like a new upload) "Do this in another app..." (like send a Slack message) Choose what information to share between apps Zapier shows you exactly what will happen before going live The whole process takes just a few minutes, and Zapier provides helpful [templates](https://zapier.com/apps/frameio-v4/integrations#integrations) to get you started even faster. ## Setting Up Zapier Get up and running with our Zapier integration and connect Frame.io to hundreds of apps. ### Setup Sign up for a [free Zapier account](https://zapier.com/apps/frameio-v4/integrations) Log into Zapier and create a Zap and add the Frame.io app to your Zap. Once you do that, you'll be prompted to connect Zapier with your Frame.io account. ### Explore * Browse [Zapier's examples and templates](https://zapier.com/apps/frameio-v4/integrations) * If you'd like to see more features in our Zapier integration, tell us what you want on our [community chat](https://forum.frame.io/). We maintain the Zapier integration just like our other native integrations and we're always looking for ways to improve it. ### Partner with us * [Become a Frame.io partner](https://frame.io/integrations) if your company's software should be directly integrated into Frame.io without Zapier middleware. ## Quick Start with Templates The quickest method to get started is to use one of our pre-built templates. These templates provide ready-made workflows that you can customize for your specific needs. ### Popular Workflow Examples [Create Frame.io projects from new monday.com items](https://zapier.com/apps/frameio-v4/integrations/monday/255666675/create-frameio-projects-from-new-mondaycom-items-in-a-board) For busy production teams, automatically set up Frame.io projects when tasks are added in monday.com. [Upload approved Frame.io videos to YouTube](https://zapier.com/apps/frameio-v4/integrations/youtube/255666695/upload-newly-approved-frameio-videos-to-youtube) Automatically publish approved videos to YouTube without manual steps. [Create Slack channels for new Frame.io projects](https://zapier.com/apps/frameio-v4/integrations/slack/255666678/create-slack-channels-for-new-frameio-projects) Set up dedicated communication channels for each new project automatically. ### How to Use Templates Using templates is straightforward and saves you significant setup time: Choose from one of the pre-built templates that matches your workflow needs For each step within the Zap, you'll go straight to the configure section *(setup is already done as per the template)* Input the required details like your account credentials, workspace names, project names, folder locations, etc. Run a test to make sure everything works correctly Testing can sometimes be tricky, especially with webhook-based triggers. The testing step may show sample data that will be replaced by real data once you actually use the Zap. Once you're satisfied with the configuration, click "Publish" to activate your Zap! ## Available Triggers and Actions ### Available Triggers The V4 integration supports the following webhook-based triggers: * **File Created**: Triggers when a file is first created * **File Ready**: Triggers when file processing is complete * **File Upload Completed**: Triggers when file upload finishes - **Comment Created**: Triggers when a new comment is added - **Comment Updated**: Triggers when a comment is modified - **Comment Completed**: Triggers when a comment is resolved * **Project Created**: Triggers when a new Project is created - **Metadata Value Updated**: Triggers when custom metadata field values change ### Available Actions * **Create Folder**: Create a new folder in a Project * **Upload File From URL**: Upload a file from a publicly available URL - **Create Comment**: Add a new comment to a file - **Update Comment**: Modify an existing comment * **Create Workspace**: Create a new Workspace in an Account * **Create Share**: Create a new share link - **Show Comment**: Get comment details - **Find Project**: Search for Projects by name - **Show File**: Retrieve detailed file information - **Show Project Details**: Get comprehensive Project details ## Frame.io Resource Fields in Zapier When working with triggers like "File Created" or "Comment Created," you'll see many fields that provide rich context about the events and resources. ### File Fields **File URLs are secure and direct**: The V4 integration provides direct links to Frame.io's asset storage. When you have a choice between "File Attachment" and "File Attachment (URL)" in other apps, choose the URL option as it generally supports larger files and more file types. Key File fields include: * `Original Download URL` - Direct download link to the original uploaded file * `High Quality Download URL` - Download link for high-quality proxy version * `Thumbnail Download URL` - Download link for the file thumbnail * `File Name` - Complete filename including extension * `File Type Category` - Categorized type: "video", "image", "audio", "document", or "other" * `Creator Name` and `Creator Email` - Information about who uploaded the file * `Project Name` and `Project ID` - Project context information ### Comment Fields Key comment fields include: * `Comment Text` - The text content of the comment * `Comment Author Name` and `Comment Author Email` - Who left the comment * `Timestamp` - Frame number for time-based comments (for videos) * `File ID` - ID of the file the comment was left on * `Project Name` and `Project ID` - Project context ### Project Fields Key Project fields include: * `Project Name` and `Project ID` - Basic Project information * `Root Folder ID` - ID of the Project's root folder * `Storage Usage` - Storage used by the Project in bytes * `View URL` - Direct link to view the Project in Frame.io * `Workspace ID` and `Account ID` - Organizational context ## Building Custom Zaps If you prefer to build a custom workflow from scratch or need something more specific than our templates offer: Go to the Zapier homepage and click "Create" then "New Zap" Choose the trigger action, which can be Frame.io or any other Zapier integration Add the actions and configure the steps according to your specific needs Remember that Zaps can be shared with team members and collaborators for consistent workflows across your organization ## Migrating from Legacy to V4 Frame.io's V4 Zapier integration brings significant improvements while maintaining feature parity with our legacy version. ### Making the Switch **For Existing Users**: If you're currently using the legacy Frame.io Zapier integration, your existing Zaps will only work with the legacy version of Frame.io. Once you've upgraded your Frame.io Account to V4, you'll need to rebuild your integrations using the Frame.io V4 Zapier integration. **For New Users**: Always choose the **Frame.io V4** integration when creating new Zaps. It's the current, actively maintained version with all the latest improvements. ### Key Terminology Changes The most noticeable change is in our language around content organization: | Legacy Term | V4 Term | | ------------------------ | ------------------------- | | "Asset" | "File" or "File & Folder" | | "Asset Created" | "File Created" | | "Asset Ready" | "File Ready" | | "Asset Upload Completed" | "File Upload Completed" | **Why the change?** The term "File" is more universally understood and accurately describes what you're working with—whether it's a video, image, document, or any other file type. ## Tips for Success Begin with one of our templates to get familiar with how Frame.io and Zapier work together Always test your Zaps before publishing, especially when working with file uploads or webhooks Take advantage of Frame.io's comprehensive data fields to create more intelligent automations Consider how your workflows will perform as your team and project volume grows ## Need More Help? **Need a Missing Feature?** Our goal is to match all features between Legacy and V4, but if you notice something missing or need additional functionality, reach out to us! ### How to Reach Out * **Community Forum**: Post in our [Frame.io Community](https://forum.frame.io/) for feature requests * **Support Team**: Contact our support team directly through the Frame.io app When requesting features or reporting issues, please describe: * The specific workflow you're trying to achieve * Any errors you're seeing or where you're getting stuck * Whether this worked in the legacy version or if this is a new V4-specific feature ## Ready to Automate? The best part about automation is that you start small and grow from there. Begin with one simple workflow, like getting notified when someone comments on your project, and expand as you see the time-saving benefits. Your apps are already doing great work. Now let them work together to do even more. Ready to dive in? Start with our [templates](https://zapier.com/apps/frameio-v4/integrations) to create your first automation in under 10 minutes. # Automate Your Frame.io Workflows with Make Make is a no-code automation platform that connects your apps and services. It uses a visual interface where you build workflows called scenarios by sequencing different modules. Every scenario has a trigger (like "new Project created in Frame.io") and actions that follow (like "add a row to Google Sheets"). You connect these modules visually to define what happens and in what order. ## Why Connect Frame.io to Make? Make extends Frame.io across your entire workflow. Sync files to storage, update project management tools, generate reports, notify your team, or build custom workflows based on Frame.io activity. The more you connect Frame.io to your tech stack, the more powerful it becomes. **Automation Ideas:** * Auto-create Frame.io Projects when a client submits an intake form * Post to Slack when comments are added to a video in Frame.io * Update a Google Sheet when a new Frame.io Project is created These are just a few examples. For a full list of available Frame.io modules, check out this page on [Make.com](https://www.make.com/en/integrations/frame-io#:~:text=All-,Modules,-\(26\)). ## What You Need * **A Frame.io account** (see subscription info [here](https://frame.io/pricing)) * **A Make account** (free tier available)
How This Guide Is Organized
The next section covers Make basics. If you want to get straight to building, skip to the tutorial where we'll connect your Frame.io account and build a scenario that logs new Frame.io Projects to a Google Sheet. ## Module Types Make has four types of modules: triggers, searches, actions, and universal modules. Triggers work by watching for changes in a service, and bringing them over to Make so you can use that data in your scenario. You can add **one** trigger module per scenario.
See the **Trigger Types** section below for details on polling vs. instant triggers.
* You can set how often a trigger module runs by clicking **Schedule settings** in the scenario toolbar * Make highly recommends starting scenarios with a trigger module. Search modules retrieve specific data from a service. You can add multiple search modules anywhere in your scenario. Most searches return up to 3,200 objects per run.
**Types of search modules:**
* **Search modules** let you filter and use queries to find specific data (Search Records, Search Rows, etc.) * **List modules** retrieve all data without filtering. (List Projects, List Sheets, etc.) Action modules process the data retrieved from a service. You can add as many actions as needed, anywhere in your scenario.
**Types of actions:**
* GET * CREATE * UPDATE * DELETE
Universal modules (usually called **Make an API Call**) let you make custom API calls when Make doesn't provide a pre-built module for what you need.
You can add as many Universal modules as needed and place them anywhere in your scenario. ## Trigger Types Make uses two types of triggers: polling and instant. **Polling triggers** check your service account for new data on a schedule. They're usually named things like "Watch Records" or "Watch Rows." When the scenario runs, Make asks the service if anything's new. If there is, the scenario processes it. **Instant triggers** work differently. They use webhooks, so the service pings Make immediately when something happens. Your scenario runs right away. You can spot these by the lightning icon and "Instant" tag on the module. Frame.io's Watch Events module is an instant trigger, so the scenario we're building later on will run in real time. Make has more details on how different module types run in [this section of their Help Center](https://help.make.com/types-of-modules). # The Make Interface Your Make dashboard shows all your scenarios. This is where you monitor active scenarios, scenario performance, and credit usage. Click **Create scenario** in the header to open the builder. ### Adding Applications + Modules To add modules to your scenario, click the plus button in the center of the builder. This opens a panel where you can search for the app you need, such as Frame.io or Google Sheets, then select the specific module you want (like “Watch Events” or “Add a Row”). Drag and drop modules in the builder to connect them and build your scenario. ### Managing + Reconnecting Apps The left sidebar gives you access to scenarios, connections, webhooks, and other Make features. If you need to reconnect Frame.io or any other app, click **Connections** in the left sidebar. You'll see all your connected apps with a **Reauthorize** button next to each one. Click it to go through the authentication flow again. ### Testing To test your scenario, click **Run once** in the toolbar. When the test completes, operation bubbles appear above each module showing how many operations ran. Click on a bubble to see the input and output data for that step. **Testing with existing data:** By default, triggers only process new events. To test with existing data, click the dropdown arrow next to the **Run once** button. This opens a dialog where you can rerun data from an earlier received webhook event. *** # Building Your First Scenario: Log New Projects to Google Sheets Before we start, create a Google Sheet with these column headers: **Event Type**, **Resource ID**, **Workspace ID**, **User ID**. We'll call the sheet "Frame Projects" in this example. Click the plus sign in the Make builder to add a module. Search for "Frame.io" and select **Watch Events**. This creates a webhook that triggers when specific events happen in Frame.io. **Connecting Frame.io:** * Click **Add** next to the connection field * Keep the default connection name or rename it * You'll be prompted to log in to your Adobe account and authorize Make * Once connected, you'll see all your available Frame.io accounts and workspaces in the drop downs **Configure the Webhook:** * Select your account and the workspace you want to watch. For this example, we'll use "New Workspace" * Under events, choose **Project Created** (For more on supported events see our [webhooks documentation](https://developer.adobe.com/frameio/guides/Webhooks/#webhook-event-subscriptions)) * Name your webhook, save your changes Click the plus sign to add the next step. Search for and select the Google Sheets app, and click on the **Add a Row** module. **Connect Google Sheets:** * Click **Add** to create a new connection * Click **Sign in with Google** and authorize Make to access your Google account * Once connected, you should see your account's sheets in the dropdowns * Select the sheet/tab name (in our case, "Frame Projects") **Map the data:** Now map Frame.io data to your spreadsheet columns. Click into each field and select the corresponding data from the Frame.io trigger: * **Event Type** → map to Frame.io Event Type * **Resource ID** → map to Frame.io Resource * **Workspace ID** → map to Frame.io Workspace ID * **User ID** → map to Frame.io User ID Click **Run once** to test the scenario, then create a new project in your selected Frame.io workspace. If everything is set up correctly, a new row should appear in your spreadsheet. ![Sheet](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/7ce29e4733e003f705331afffe5dfee291f6335c62387f46784b4db5a20b6d80/docs/pages/v4/guides/frame_sheet_example.gif) When you're ready to go live, flip the toggle to **Active** and it will run automatically. You just built your first automation. From here, you can add more steps to this scenario or build new ones using the other available Frame.io modules on [Make.com](https://www.make.com/en/integrations/frame-io#:~:text=All-,Modules,-\(26\)) If you run into issues, have questions, or want to share what you built, check out the [Community Forum](https://forum.frame.io/). *** # Frame.io Legacy API to V4 Migration Guide ## Introduction The Frame.io V4 API is a redesign of the Legacy API, often referred to as *V2 endpoints* or *Frame.io V3 API*. The redesign takes full advantage of the new capabilities and features of Frame V4 while maintaining all the relevant functionality of the Legacy API. This guide outlines the key differences between the Legacy and V4 APIs and provides step-by-step guidance to help you migrate smoothly. ## Migration Checklist For V4-migrated accounts not yet administered via the Adobe Admin Console, you can continue to use Legacy Developer tokens managed in the [Frame.io developer site](/), but you will need to add a header to your api requests with the key `x-frameio-legacy-token-auth` and a value of `true`. Otherwise, you should follow steps in the [Authentication](#adobe-developer-console-managed-authentication) section below. All legacy API routes will need to be mapped to the new V4 API routes and JSON payloads. There is a fairly comprehensive [mapping](#endpoint-mappings-legacy-api-to-v4) table below to assist with this process. **Test thoroughly.** Because there are many changes to the API, it is recommended to test with a V4 account to ensure that the new API is working as expected. Implement a dedicated login method for V4 due to separate Auth URLs. The V4 Auth URL is different than the Legacy API, and it will not return accounts not yet upgraded to V4 in the response and should be treated as a separate integration. If there is an endpoint that is not listed in the mapping table below that you have questions about, please reach out to our support team for more at [support@frame.io](mailto:support@frame.io). ## Adobe Developer Console Managed Authentication For V4-migrated accounts that are managed through the [Adobe Developer Console](https://developer.adobe.com/developer-console/), you will need to use the V4 API with OAuth2.0. You will need to follow the steps below. **Create a project in the Adobe Developer Console** and add Frame.io as a product. **Authenticate.** See the [Authentication Guide](https://developer.adobe.com/frameio/guides/Authentication/) for more information. If your V4 account is not yet managed via the Adobe Admin Console, you can skip this step. * **User authentication**: Connects to Frame using a Client ID and/or Client Secret, and requires a user to login with their username and password. * **Server to server authentication**: Connects to Frame using Client ID and Client Secret, but does not require a user in the loop to login via a browser. **JWT Bearer Auth**: For every API request, pass the auth token via a header with key `Authorization` and a value of `Bearer `. ## Endpoint Mappings (Legacy API to V4) If you are using legacy developer token authentication, you will need to add a header to your api requests with the key x-frameio-legacy-token-auth and a value of true. General notes to help with the migration: The request and response payloads may be different. "Teams" in Legacy API are the equivalent of "Workspaces" in V4. "Assets" in Legacy API are now split into "Files", "Folders", and "Version Stacks" in V4. Permissions and roles are different in V4, which changes the structure of the endpoints. In V4, you have workspace and project user roles. For more details, see [Managing User Permissions](/platform/v4/docs/guides/managing-user-permissions). ### 1. Accounts & User Info | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ------- | -------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | | **GET** | `/v2/accounts`
([Get Accounts for User](/platform/v2/api-reference/accounts/get-accounts)) | **GET** | `/v4/accounts`
([List accounts](/platform/v4/api-reference/accounts/index)) | V4 returns all accounts the user can access. | | **GET** | `/v2/accounts/{account_id}`
([Get Account by ID](/platform/v2/api-reference/accounts/get-account)) | N/A | N/A | Info about a specific account can be found in list accounts endpoint. | | **GET** | `/v2/me`
([Get Current User](/platform/v2/api-reference/users/get-me)) | **GET** | `/v4/me`
([User details](/platform/v4/api-reference/users/show)) | Fetch current user's profile. | | **GET** | `/v2/accounts/{account_id}/membership` | N/A | N/A | Roles and permissions are handled via workspace and project permissions. | ### 2. Workspaces (Replaced Team Endpoints) | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | -------- | -------------------------------------------------------------------------------------------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | **GET** | `/v2/accounts/{account_id}/teams`
([Get all Teams on an Account](/platform/v2/api-reference/teams/get-teams-by-account)) | **GET** | `/v4/accounts/{account_id}/workspaces`
([List workspaces](/platform/v4/api-reference/workspaces/index)) | Legacy API concept of "teams" → "workspaces" in V4. | | **POST** | `/v2/accounts/{account_id}/teams`
([Create a Team for the given account](/platform/v2/api-reference/teams/create-team)) | **POST** | `/v4/accounts/{account_id}/workspaces`
([Create workspace](/platform/v4/api-reference/workspaces/create)) | Body is similar (name, etc.). Response is a workspace object, not a team object. | | **GET** | `/v2/teams/{team_id}`
([Get a Team](/platform/v2/api-reference/teams/get-team)) | **GET** | `/v4/accounts/{account_id}/workspaces/{workspace_id}`
([Show Workspace](/platform/v4/api-reference/workspaces/show)) | Team ID → Workspace ID in V4. | | **GET** | `/v2/teams/{team_id}/members`
([Get Team Members](/platform/v2/api-reference/teams/get-team-members)) | **GET** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/users`
[(Get Workspace Members)](/platform/v4/api-reference/workspace-permissions/index) | Returns all users in a workspace | | **POST** | `/v2/teams/{team_id}/members`
([Add a Team Member)](/platform/v2/api-reference/teams/add-team-member)) | **PATCH** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/users/{user_id}`
([Add Or Update User Role In Workspace](/platform/v4/api-reference/workspace-permissions/workspace-user-roles-update)) | Allows for adding or removing users from a workspace | | **GET** | `/v2/teams/{team_id}/membership`
([Get user membership for team](/platform/v2/api-reference/teams/get-membership-by-team)) | N/A | N/A | Roles and permissions are handled via workspace and project permissions. | ### 3. Projects | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | **GET** | `/v2/teams/{team_id}/projects`
([Get Projects by Team](/platform/v2/api-reference/projects/get-projects-by-team)) | **GET** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/projects`
([List Projects](/platform/v4/api-reference/projects/index)) | Must provide both `account_id` & `workspace_id` in V4. | | **GET** | `/v2/projects/shared` | N/A | N/A | This is not currently supported in V4. | | **POST** | `/v2/teams/{team_id}/projects`
([Create a Project](/platform/v2/api-reference/projects/create-project)) | **POST** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/projects`
([Create project](/platform/v4/api-reference/projects/create)) | Body is similar: `{ "name": "MyProject", ... }`. | | **GET** | `/v2/projects/{project_id}`
([Get Project by ID](/platform/v2/api-reference/projects/get-project)) | **GET** | `/v4/accounts/{account_id}/projects/{project_id}`
([Show project](/platform/v4/api-reference/projects/show)) | Requires `account_id` & `project_id` | | **PUT** | `/v2/projects/{project_id}`
([Update a Project](/platform/v2/api-reference/projects/update-project)) | **PATCH** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/projects/{project_id}`
([Update project](/platform/v4/api-reference/projects/update)) | V4 uses PATCH for partial updates. | | **DELETE** | `/v2/projects/{project_id}`
[(Delete Project by ID)](/platform/v2/api-reference/projects/delete-project) | **DELETE** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/projects/{project_id}`
[(Delete Project)](/platform/v4/api-reference/projects/delete) | Removes project. | | **GET** | `/v2/projects/{project_id}/collaborators`
([Get Project Collaborators](/platform/v2/api-reference/projects/get-project-collaborators)) | **GET** | `/v4/accounts/{account_id}/projects/{project_id}/users`
([List project user roles](/platform/v4/api-reference/project-permissions/index)) | Returns all the users in a project (closest equivalent to legacy collaborators endpoint) | | **POST** | `/v2/projects/{project_id}/collaborators`
([Add a Collaborator to a Project](/platform/v2/api-reference/projects/add-collaborator-to-project)) | **PATCH** | `/v4/accounts/{account_id}/projects/{project_id}/users/{user_id}`
([Update user roles for the given project](/platform/v4/api-reference/project-permissions/project-user-roles-update)) | Allows for adding or removing users from a project (closest equivalent to legacy collaborators endpoint) | ### 4. Folders | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ----------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | **GET** | `/v2/assets/{asset_id}/children`
([Fetch child Assets](/platform/v2/api-reference/assets/get-assets)) | **GET** | `/v4/accounts/{account_id}/folders/{folder_id}/children`
([List folder children](/platform/v4/api-reference/folders/index)) | If your `asset_id` in Legacy API was a folder, it's now `folder_id` in V4. | | **POST** | `/v2/assets/{parent_asset_id}/children`
([Create an Asset](/platform/v2/api-reference/assets/create-asset)) | **POST** | `/v4/accounts/{account_id}/folders/{folder_id}/folders`
([Create folder](/platform/v4/api-reference/folders/create)) | In Legacy API you used `"type": "folder"`, in V4 you do `{"data": {"name": "Folder name"}}`. | | **GET** | `/v2/assets/{asset_id}`
([Get an Asset](/platform/v2/api-reference/assets/get-asset)) | **GET** | `/v4/accounts/{account_id}/folders/{folder_id}`
([Show folder](/platform/v4/api-reference/folders/show)) | Legacy API requires "type": "folder"
V4 API requires `folder_id` & `account_id` in path parameters | | **PUT** | `/v2/assets/{asset_id}` ([Update an Asset](/platform/v2/api-reference/assets/update-asset)) | **PATCH** | `/v4/accounts/{account_id}/folders/{folder_id}`
([Update folder](/platform/v4/api-reference/folders/update)) | Legacy API: `asset_id` will be your folder id
V4 API: Body: `{"data": {"name": "New Folder Name"}}`. | | **DELETE** | `/v2/assets/{asset_id}`
([Delete an Asset](/platform/v2/api-reference/assets/delete-asset)) | **DELETE** | `/v4/accounts/{account_id}/folders/{folder_id}`
([Delete folder)](/platform/v4/api-reference/folders/delete) | Removes folder. | | N/A | N/A | **GET** | `/v4/accounts/{account_id}/folders/{folder_id}/folders`
([List folders](/platform/v4/api-reference/folders/list)) | Lists folders in a given folder. (Get root\_folder\_id from show project route, and you can use this to list all folders at the highest level.) | ### 5. Version Stacks | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ------------------------------------------------------------------------------------------------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | **POST** | `/v2/assets/{destination_folder}/copy`
([Copy an Asset](/platform/v2/api-reference/assets/copy-asset)) | **POST** | `/v4/accounts/{account_id}/version_stacks/{version_stack_id}/copy`
([Copy version stack](/platform/api-reference/version-stacks/copy)) | Legacy: destination folder in path; use with a version stack in request. V4: copy a version stack. | | **POST** | `/v2/assets/{asset_id}/version`
([Version an Asset](/platform/v2/api-reference/assets/add-version-to-asset)) | **POST** | `/v4/accounts/{account_id}/folders/{folder_id}/version_stacks`
([Create version stack](/platform/api-reference/version-stacks/create)) | Create a version stack. Requires 2–10 file IDs in request body. | | **POST** | `/v2/assets/{asset_id}/version`
([Version an Asset](/platform/v2/api-reference/assets/add-version-to-asset)) | **PATCH** | `/v4/accounts/{account_id}/files/{file_id}/move`
([Move file to version stack](/platform/api-reference/files/move)) | Move a file to an existing version stack. Use the `version_stack_id` as the `parent_id` in request body. | | **GET** | `/v2/assets/{asset_id}/children`
([Fetch child Assets](/platform/v2/api-reference/assets/get-assets)) | **GET** | `/v4/accounts/{account_id}/version_stacks/{version_stack_id}/children`
([List version stack children](/platform/api-reference/version-stacks/index)) | Legacy: use with a version stack asset\_id. V4: list children (files/versions) in a version stack. | | N/A | N/A | **GET** | `/v4/accounts/{account_id}/folders/{folder_id}/version_stacks`
([List version stacks](/platform/api-reference/version-stacks/list)) | List version stacks in a folder. | | N/A | N/A | **PATCH** | `/v4/accounts/{account_id}/version_stacks/{version_stack_id}/move`
([Move version stack](/platform/api-reference/version-stacks/move)) | Move a version stack to another folder. | | **GET** | `/v2/assets/{asset_id}`
([Get an Asset](/platform/v2/api-reference/assets/get-asset)) | **GET** | `/v4/accounts/{account_id}/version_stacks/{version_stack_id}`
([Show version stack](/platform/api-reference/version-stacks/show)) | Legacy: use with a version stack asset\_id. V4: show version stack details. | | **DELETE** | `/v2/assets/{asset_id}/unversion` (Delete unversion) | N/A | N/A | Un-versioning is not currently supported in V4. | ### 6. Files Note: there are now two endpoints for creating files in V4 (locally and via S3 upload). For more details, see [Uploading Files](/platform/v4/docs/guides/how-to-upload). | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ----------------------------------------------------------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **POST** | `/v2/assets/{parent_asset_id}/children`
([Create an Asset](/platform/v2/api-reference/assets/create-asset)) | **POST** | `/v4/accounts/{account_id}/folders/{folder_id}/files/local_upload`
([Create file (local upload)](/platform/v4/api-reference/files/create_local_upload)) | Legacy API: requires name, type, filetype, filesize, & auto\_version\_id
V4 API: account\_id & folder\_id are required in the path parameters, file\_size and name required on payload | | N/A | N/A | **POST** | `/v4/accounts/{account_id}/folders/{folder_id}/files/remote_upload`
([Create file (remote upload)](/platform/v4/api-reference/files/create_remote_upload)) | Account\_id & folder\_id are required in the path parameters, source url and name required on payload | | **GET** | `/v2/assets/{asset_id}`
([Get an Asset](/platform/v2/api-reference/assets/get-asset)) | **GET** | `/v4/accounts/{account_id}/files/{file_id}`
([Show file)](/platform/v4/api-reference/files/show) | Show file details - many includes are available to return additional file details in the response. | | N/A | N/A | **GET** | `/v4/accounts/{account_id}/files/{file_id}/status`
([Get file metadata](/platform/api-reference/files/show-file-upload-status)) | Get status of a remote upload from a create file remote upload endpoint. | | **PUT** | `/v2/assets/{asset_id}`
([Update an Asset](/platform/v2/api-reference/assets/update-asset)) | **PATCH** | `/v4/accounts/{account_id}/files/{file_id}`
([Update file](/platform/v4/api-reference/files/update)) | Update file name. | | **DELETE** | `/v2/assets/{asset_id}`
([Delete an Asset](/platform/v2/api-reference/assets/delete-asset)) | **DELETE** | `/v4/accounts/{account_id}/files/{file_id}`
([Delete file](/platform/v4/api-reference/files/delete)) | 204 No Content on success. | ### 7. Comments Most V4 api comment capabilities are currently supported. **Coming Soon Features:** * Comment reactions, i.e. emojis * Viewing or modifying comment completion status * Seeing who has viewed a comment (impressions) The "timestamp" field represents the framestamp the comment is left on (starting from 1), not the timestamp | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | **GET** | `/v2/assets/{asset_id}/comments`
([Get all the Comments and Replies from a Comment thread](/platform/v2/api-reference/comments/get-comments)) | **GET** | `/v4/accounts/{account_id}/files/{file_id}/comments`
([List comments](/platform/api-reference/comments/index)) | Lists comments on a file. | | **POST** | `/v2/assets/{asset_id}/comments`
([Create a Comment](/platform/v2/api-reference/comments/create-comment)) | **POST** | `/v4/accounts/{account_id}/files/{asset_id}/comments`
([Create comment](/platform/api-reference/comments/create)) | Create a comment. Body is similar: `{"text":"Nice","timestamp":12.3}`. | | **GET** | `/v2/comments/{comment_id}`
([Get a Comment by ID](/platform/v2/api-reference/comments/get-comment)) | **GET** | `/v4/accounts/{account_id}/comments/{comment_id}`
([Show comment](/platform/api-reference/comments/show)) | Fetch single comment by ID. | | **PUT** | `/v2/comments/{comment_id}`
([Update a Comment](/platform/v2/api-reference/comments/update-comment)) | **PATCH** | `/v4/accounts/{account_id}/comments/{comment_id}`
([Update comment)](/platform/api-reference/comments/update) | Update text, time, etc. | | **DELETE** | `/v2/comments/{comment_id}`
([Delete a Comment](/platform/v2/api-reference/comments/delete-comment)) | **DELETE** | `/v4/accounts/{account_id}/comments/{comment_id}`
([Delete comment](/platform/api-reference/comments/delete)) | Remove comment. | | **GET** | `/v2/comments/{comment_id}/impressions`
([Get Impressions](/platform/v2/api-reference/comments/get-comment-impressions)) | N/A | N/A | Impressions are not currently supported in V4. | ### 8. Shares (Review Links / Presentations) In Frame V4 share links are no longer split between review and presentation links. In V4 the share link can now be configured with different styling to match the review or presentation experience. Note: interacting with legacy review links and presentations via V4 api is not supported. | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | **GET** | `/v2/projects/{project_id}/review_links`
([List Review Links in a project](/platform/v2/api-reference/review-links/list)) | **GET** | `/v4/accounts/{account_id}/projects/{project_id}/shares`
([List shares](https://developer.adobe.com/frameio/api/current/#tag/Shares/operation/shares.index)) | Lists shares in a project (note this doesn't include legacy review links and presentations) | | **POST** | `/v2/projects/{project_id}/review_links`
([Create a Review Link)](/platform/v2/api-reference/review-links/review-link-create)) | **POST** | `/v4/accounts/{account_id}/projects/{project_id}/shares`
([Create share](https://developer.adobe.com/frameio/api/current/#tag/Shares/operation/shares.create)) | Creates a new share link. Body might be `{"data":{"name":"Review Link","type":"review"}}`. | | **POST** | `/v2/review_links/{link_id}/assets`
([Add Asset to a Review Link](/platform/v2/api-reference/review-links/review-link-item-create)) | **POST** | `/v4/accounts/{account_id}/shares/{share_id}/assets`
([Add new asset to share](/platform/api-reference/shares/add-asset)) | Adds asset to a share. This supports files, folders, and version stacks. | | N/A | Does not exist | **DELETE** | `/v4/accounts/{account_id}/shares/{share_id}/assets/{asset_id}`
[(Delete Share)](/platform/api-reference/shares/remove-asset) | Remove asset from share | | **DELETE** | `/v2/review_links/{link_id}`
([Delete a Review Link](/platform/v2/api-reference/review-links/review-link-delete)) | **DELETE** | `/v4/accounts/{account_id}/shares/{share_id}`
[(Delete Share)](/platform/api-reference/shares/delete) | Delete the share link. | | **PUT** | `/v2/review_links/{review_link_id}`
([Update a Review Link](/platform/v2/api-reference/review-links/review-link-update)) | **PATCH** | `/v4/accounts/{account_id}/shares/{share_id}`
[(Update Share)](/platform/api-reference/shares/update) | Update the share link | ### 9. Webhooks The webhooks that you used in V3 will be migrated over and for the most part will function the same. On migration they will be disabled and will need to be enabled to function. There will be some changes required for asset events, which are now split into files and folders. There are some new V4 specific events to be aware of: metadata.value.updated, collection related events, and share related events. | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **POST** | `/v2/teams/{team_id}/hooks`
[(Create Webhook)](/platform/v2/api-reference/webhooks/create-webhook-for-team) | **POST** | `/v4/accounts/{account_id}/workspaces/{workspaces_id}/webhooks`
[(Create Webhook)](/platform/api-reference/webhooks/create) | Provide `{"data":{"url":"...","events":["file.created",...]}}`. | | **GET** | `/v2/accounts/{account_id}/webhooks`
[(Get Webhooks for and Account)](/platform/v2/api-reference/webhooks/get-webhooks-by-account) | **GET** | `/v4/accounts/{account_id}/workspaces/{workspaces_id}/webhooks`
[(List Webhooks)](/platform/api-reference/webhooks/index) | Gets all webhooks for a workspace. Note: to get all webhooks for an account you need to get all workspaces for the account and then get all webhooks for those workspaces. | | **GET** | `/v2/hooks/{hook_id}`
[(Get Webhook)](/platform/v2/api-reference/webhooks/get-webhook) | **GET** | `/v4/accounts/{account_id}/webhooks/{webhook_id}`
[(List Webhooks)](/platform/api-reference/webhooks/index) | Get webhook info | | **PUT** | `/v2/hooks/{hook_id}`
[(Update Webhook)](/platform/v2/api-reference/webhooks/update-webhook) | **PATCH** | `/v4/accounts/{account_id}/webhooks/{webhook_id}`
[(Update Webhook)](https://developer.adobe.com/frameio/api/experimental/#tag/Webhooks/operation/webhooks.update) | Update webhook settings | | **DELETE** | `/v2/hooks/{hook_id}`
[(Delete Webhook)](/platform/v2/api-reference/webhooks/delete-webhook) | **DELETE** | `/v4/accounts/{account_id}/webhooks/{webhook_id}`
[(Delete Webhook)](https://developer.adobe.com/frameio/api/experimental/#tag/Webhooks/operation/webhooks.delete) | Removes the webhook. | ### 10. Custom Actions The custom actions that you used in V3 will be migrated over, but will require some modification to requests and to response handling. On migration they will be disabled and will need to be enabled to function. For more detail please refer to this [(document)](/platform/v4/docs/guides/custom-actions#migrated-actions) Note: the custom actions endpoints are currently in the experimental api and will require a header: "api-version: experimental". | Method | Legacy Endpoint | Method | V4 Endpoint | Notes | | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | | **POST** | `/v2/teams/{team_id}/actions` ([Create a Custom Action](/platform/v2/api-reference/custom-actions/create-action-for-team)) | **POST** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/actions` ([Create Custom Action](/platform/v4-experimental/api-reference/custom-actions/actions-create)) | Create a custom action in a workspace. | | **DELETE** | `/v2/actions/{action_id}` ([Delete a Custom Action](/platform/v2/api-reference/custom-actions/delete-action)) | **DELETE** | `/v4/accounts/{account_id}/actions/{action_id}` ([Delete Custom Action](/platform/v4-experimental/api-reference/custom-actions/actions-delete)) | Delete a custom action. | | **PUT** | `/v2/actions/{action_id}` ([Update a Custom Action](/platform/v2/api-reference/custom-actions/update-action)) | **PATCH** | `/v4/accounts/{account_id}/actions/{action_id}` ([Update Custom Action](/platform/v4-experimental/api-reference/custom-actions/actions-update)) | Update custom action details. | | **GET** | `/v2/teams/{team_id}/actions` ([Get Custom Actions for a Team)](/platform/v2/api-reference/custom-actions/get-actions-by-account) | **GET** | `/v4/accounts/{account_id}/workspaces/{workspace_id}/actions` ([List Custom Actions](/platform/v4-experimental/api-reference/custom-actions/actions-index)) | List Custom Actions in a given Workspace. | | **GET** | `/v2/actions/{action_id}` ([Get a Custom Action by ID](/platform/v2/api-reference/custom-actions/get-action)) | **GET** | `/v4/accounts/{account_id}/actions/{action_id}` ([Show Custom Action Details](/platform/v4-experimental/api-reference/custom-actions/actions-show)) | Show custom action details. | ## Migration Steps **Adjust** any unsupported Legacy V2 endpoints. **Update base URLs** from `api.frame.io/v2/...` to `api.frame.io/v4/...`. **Update API requests** in your code to reference the new endpoints schema. **Update JSON payloads** of request/response schemas to ensure you're producing and consuming the correct fields. Update terminology: "teams" → "workspaces"; "assets" → "files/folders"; "review links" or "presentation links" → "shares" in your code and your front-end. **Test** all newly updated endpoints. If you see 403, 404, 422, confirm endpoints, request payload shape, etc. **Parse** the new detailed error responses, looking for the issue in the `{"errors": [...]}` JSON response if your API call fails. **Deploy** to Production once validated with a V4 [Frame.io](http://frame.io/) account. ## Error Handling & Common Issues Some routes give errors with custom descriptions that may differ slightly from examples below. * **400** Bad Request: Check payload accuracy. * **401** Unauthorized: Invalid or missing authorization token. * **403** Forbidden: Missing scope or user lacks access. * **404** Not Found: Confirm endpoint, API version, or IDs. * **422** Unprocessable Entity: Validate request data * **429** Too Many Requests: Implement retry with backoff. - **500** Internal Server Error: Retry after a brief delay. ## SDK Support Similar to the Legacy SDK, there is a Python SDK available for developers to use, and for the first time there is a Typescript SDK available also. These SDKs will have similar functionality but have completely different methods and if you are updating from the Legacy SDK to the V4 SDK, please be sure to update your code accordingly. You can find them at the links below: [Getting Started SDKS](/platform/docs/getting-started#sdks) [Python SDK](/platform/docs/sdk-reference/python-sdk-reference) [Typescript SDK](/platform/docs/sdk-reference/type-script-sdk-reference) *** # FAQ The Frame.io API allows developers to integrate Frame.io's surface for creatives and their teams to manage their work. ## General Questions Go [here](https://developer.adobe.com/frameio/api/current/) to see the Frame V4 API reference pages. Reach out to the Frame.io support team for assistance by chatting with us on our [Support Site](https://help.frame.io/en/). Please note that enterprise customers may be directed to their Customer Success Manager. * V4 represents an expansion from primarily serving post-production video professionals to a discipline-agnostic platform for creatives and creative managers. Frame.io acts as a central canvas for multi-disciplinary teams and solves for key needs for everything from more focus time for creative work to increased visibility into ongoing projects. Centralize, organize, and build all your end-to-end creative workflows at scale leveraging Metadata, Custom Fields, and Collections. This set of capabilities gives users all the flexibility and power to build the best file management system for their creative process making it easier to quickly get the information they need, and manage all their work-in-progress assets at scale. Frame.io helps creative teams reduce the total number of revision cycles with advanced review, commenting, and annotation capabilities available across a broad set of media types. Customize and share creative work from one central place. View and manage all users, workspaces, and projects in one place. Take bulk actions and export information to control how you utilize usage data. A REST API documented via the OpenAPI 3.0 specification can connect Frame.io to the systems you already use to unlock custom workflows. ## Compatibility Questions No. The Frame.io product released at Adobe MAX operates in fundamentally different ways and emphasizes different workflows than the legacy version. Due to these differences, the new API is not backward compatible. Recognizing that backward-compatibility is a major concern for customers managing production-quality integrations with high uptime requirements, we are designing the V4 API to support an additional level of versioning via a custom HTTP header in order to allow clients to opt into using experimental endpoints, avoid breaking changes, and provide backward-compatibility guarantees within the `/v4` API namespace. All automations using legacy developer tokens will no longer work for V4 accounts. We **do not** have any way to migrate them to V4. ## Availability Questions The V4 API is currently available for new Enterprise customers and select customers and partners via testing accounts. We do not yet have any Collections endpoints publicly available. But, Collections management is under development. ## Media & Files URLs returned in `media_links` includes (such as `download_url`, `inline_url`, and `url`) are **temporary signed URLs** — they expire and cannot be reused indefinitely. | URL type | Expiry | | ------------------------------------------------------------------------------------ | -------------- | | Download and inline URLs (`original`, `high_quality`, `efficient`, `video_h264_180`) | Up to 24 hours | | Thumbnail and preview URLs (`thumbnail`) | Up to 24 hours | In practice, expiry is aligned to UTC noon or midnight, so the actual time remaining when you receive a URL may be anywhere between a few minutes and 24 hours depending on when the request is made. **Do not store or cache these URLs.** Always request a fresh set of `media_links` each time you need to serve or access a file. Attempting to use an expired URL will result in a `403` error from the CDN. ## Integration Questions The existing Zapier integration however **does not work** with V4 yet but it is in development. No, not yet but it is in development. # Troubleshooting The Frame.io API allows developers to integrate Frame.io's surface for creatives and their teams to manage their work. ## Known issues This known issue we are working on, we hope to have this fixed soon. Please keep an eye on our [Support Site](https://help.frame.io/en/). # Python SDK Reference ### Installation ```curl pip install frameio ``` *** ### Usage Instantiate and use the client with the following: ```python from frameio import ( Frameio, SelectDefinitionParamsFieldConfiguration, SelectDefinitionParamsFieldConfigurationOptionsItem, ) from frameio.metadata_fields import CreateFieldDefinitionParamsData_Select client = Frameio( token="YOUR_TOKEN", ) client.metadata_fields.metadata_field_definitions_create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=CreateFieldDefinitionParamsData_Select( field_configuration=SelectDefinitionParamsFieldConfiguration( enable_add_new=False, options=[ SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ), ], ), name="Fields definition name", ), ) ``` *** ### Async Client The SDK also exports an async client so that you can make non-blocking calls to our API. Note that if you are constructing an Async httpx client class to pass into this client, use httpx.AsyncClient() instead of httpx.Client() (e.g. for the httpx\_client parameter of this client). ```python import asyncio from frameio import ( AsyncFrameio, SelectDefinitionParamsFieldConfiguration, SelectDefinitionParamsFieldConfigurationOptionsItem, ) from frameio.metadata_fields import CreateFieldDefinitionParamsData_Select client = AsyncFrameio( token="YOUR_TOKEN", ) async def main() -> None: await client.metadata_fields.metadata_field_definitions_create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=CreateFieldDefinitionParamsData_Select( field_configuration=SelectDefinitionParamsFieldConfiguration( enable_add_new=False, options=[ SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ), ], ), name="Fields definition name", ), ) asyncio.run(main()) ``` *** ### Exception Handling When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error will be thrown. ```python from frameio.core.api_error import ApiError try: client.metadata_fields.metadata_field_definitions_create(...) except ApiError as e: print(e.status_code) print(e.body) ``` *** ### Pagination Paginated requests will return a SyncPager or AsyncPager, which can be used as generators for the underlying object. ```python from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.project_permissions.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` *** ### Advanced #### Access Raw Response Data The SDK provides access to raw response data, including headers, through the .with\_raw\_response property. The .with\_raw\_response property returns a "raw" client that can be used to access the .headers and .data attributes. ```python from frameio import Frameio client = Frameio( ..., ) response = ( client.metadata_fields.with_raw_response.metadata_field_definitions_create( ... ) ) print(response.headers) # access the response headers print(response.data) # access the underlying object pager = client.project_permissions.index(...) print(pager.response.headers) # access the response headers for the first page for item in pager: print(item) # access the underlying object(s) for page in pager.iter_pages(): print(page.response.headers) # access the response headers for each page for item in page: print(item) # access the underlying object(s) ``` *** #### Retries The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long as the request is deemed retryable and the number of retry attempts has not grown larger than the configured retry limit (default: 2).\ A request is deemed retryable when any of the following HTTP status codes is returned: * 408 (Timeout) * 429 (Too Many Requests) * 5XX (Internal Server Errors)
Use the `max_retries` request option to configure this behavior. ```python client.metadata_fields.metadata_field_definitions_create(..., request_options={ "max_retries": 1 }) ``` *** #### Timeouts The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level. ```python from frameio import Frameio client = Frameio( ..., timeout=20.0, ) # Override timeout for a specific method client.metadata_fields.metadata_field_definitions_create(..., request_options={ "timeout_in_seconds": 1 }) ``` *** #### Custom Client You can override the httpx client to customize it for your use-case. Some common use-cases include support for proxies and transports. ```python import httpx from frameio import Frameio client = Frameio( ..., httpx_client=httpx.Client( proxy="http://my.test.proxy.example.com", transport=httpx.HTTPTransport(local_address="0.0.0.0"), ), ) ``` *** ### Reference #### Auth Authenticate using the OAuth 2.0 client\_credentials grant. This flow does not involve a user and does not return a refresh token. When the access token expires the SDK automatically requests a new one using the client credentials. For async usage, use `AsyncServerToServerAuth`. ```python usage from frameio import Frameio from frameio.auth import ServerToServerAuth auth = ServerToServerAuth(client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET") client = Frameio(token=auth.get_token) ``` **Parameters** `client_id`: `str` — Adobe IMS OAuth client ID. `client_secret`: `str` — Adobe IMS OAuth client secret. `scopes`: `str` — Space-separated scopes (OAuth 2.0 RFC 6749). Defaults to `openid AdobeID frame.s2s.all`. `ims_base_url`: `str` — IMS base URL for staging/alternative environments. Defaults to production. `http_client`: `typing.Optional[httpx.Client]` — Optional httpx.Client for proxy, TLS, or connection pooling. `on_token_refreshed`: `typing.Optional[typing.Callable[[dict[str, Any]], None]]` — Optional callback fired after every token fetch. `timeout`: `float` — HTTP request timeout in seconds. Defaults to 30. `max_retries`: `int` — Maximum number of retries for transient failures. Defaults to 2. `refresh_buffer`: `int` — Seconds before expiry to trigger proactive refresh. Defaults to 60. **Methods** `get_token() -> str` — Return a valid access token, refreshing if necessary. Pass this method reference (not a call) to the SDK: `Frameio(token=auth.get_token)`. `authenticate() -> dict[str, Any]` — Explicitly fetch a new access token. Returns the token response dict with `access_token`, `expires_in`, etc. `revoke() -> None` — Revoke both tokens server-side and clear local state. `export_tokens() -> dict[str, Any]` — Export current token state for persistence. `import_tokens(data: dict[str, Any]) -> None` — Restore token state from a previously exported dict. Authenticate using the OAuth 2.0 authorization\_code grant. Use this for server-side applications that can securely store a client secret. For async usage, use `AsyncWebAppAuth`. ```python usage import secrets from frameio import Frameio from frameio.auth import WebAppAuth auth = WebAppAuth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", redirect_uri="https://myapp.com/callback", ) url = auth.get_authorization_url(state=secrets.token_urlsafe(32)) # redirect user to url ... auth.exchange_code(code="CODE_FROM_CALLBACK") client = Frameio(token=auth.get_token) ``` **Parameters** `client_id`: `str` — Adobe IMS OAuth client ID. `client_secret`: `str` — Adobe IMS OAuth client secret. `redirect_uri`: `str` — Registered redirect URI. `scopes`: `str` — Space-separated scopes (OAuth 2.0 RFC 6749). `ims_base_url`: `str` — IMS base URL for staging/alternative environments. Defaults to production. `http_client`: `typing.Optional[httpx.Client]` — Optional httpx.Client for proxy, TLS, or connection pooling. `on_token_refreshed`: `typing.Optional[typing.Callable[[dict[str, Any]], None]]` — Optional callback fired after every token refresh. `timeout`: `float` — HTTP request timeout in seconds. Defaults to 30. `max_retries`: `int` — Maximum number of retries for transient failures. Defaults to 2. `refresh_buffer`: `int` — Seconds before expiry to trigger proactive refresh. Defaults to 60. **Methods** `get_token() -> str` — Return a valid access token, refreshing if necessary. Pass this method reference to the SDK: `Frameio(token=auth.get_token)`. `get_authorization_url(state: str) -> str` — Build the Adobe IMS authorization URL. Pass an opaque CSRF/state value that will be echoed back. `exchange_code(code: str) -> dict[str, Any]` — Exchange an authorization code for access and refresh tokens. `refresh() -> dict[str, Any]` — Manually trigger a token refresh. `revoke() -> None` — Revoke both tokens server-side and clear local state. `export_tokens() -> dict[str, Any]` — Export current token state for persistence. `import_tokens(data: dict[str, Any]) -> None` — Restore token state from a previously exported dict. Authenticate using authorization\_code + PKCE (no client secret). Use this for browser-based or native apps that cannot securely store a client secret. For async usage, use `AsyncSPAAuth`. ```python usage import secrets from frameio import Frameio from frameio.auth import SPAAuth auth = SPAAuth(client_id="YOUR_CLIENT_ID", redirect_uri="https://myapp.com/cb") result = auth.get_authorization_url(state=secrets.token_urlsafe(32)) # redirect user to result.url, store result.code_verifier auth.exchange_code(code="CODE_FROM_CALLBACK", code_verifier=result.code_verifier) client = Frameio(token=auth.get_token) ``` **Parameters** `client_id`: `str` — Adobe IMS OAuth client ID. `redirect_uri`: `str` — Registered redirect URI. `scopes`: `str` — Space-separated scopes (OAuth 2.0 RFC 6749). `ims_base_url`: `str` — IMS base URL for staging/alternative environments. Defaults to production. `http_client`: `typing.Optional[httpx.Client]` — Optional httpx.Client for proxy, TLS, or connection pooling. `on_token_refreshed`: `typing.Optional[typing.Callable[[dict[str, Any]], None]]` — Optional callback fired after every token refresh. `timeout`: `float` — HTTP request timeout in seconds. Defaults to 30. `max_retries`: `int` — Maximum number of retries for transient failures. Defaults to 2. `refresh_buffer`: `int` — Seconds before expiry to trigger proactive refresh. Defaults to 60. **Methods** `get_token() -> str` — Return a valid access token, refreshing if necessary. Pass this method reference to the SDK: `Frameio(token=auth.get_token)`. `get_authorization_url(state: str) -> AuthorizationUrlResult` — Build the Adobe IMS authorization URL with PKCE challenge. Returns an `AuthorizationUrlResult` with `url` and `code_verifier` attributes. `exchange_code(code: str, code_verifier: str) -> dict[str, Any]` — Exchange an authorization code + PKCE verifier for tokens. `refresh() -> dict[str, Any]` — Manually trigger a token refresh. `revoke() -> None` — Revoke both tokens server-side and clear local state. `export_tokens() -> dict[str, Any]` — Export current token state for persistence. `import_tokens(data: dict[str, Any]) -> None` — Restore token state from a previously exported dict. Frozen dataclass returned by `SPAAuth.get_authorization_url()` and `AsyncSPAAuth.get_authorization_url()`. Holds the authorization URL and the PKCE code verifier. **Attributes** `url`: `str` — The full authorization URL to redirect the user to. `code_verifier`: `str` — The PKCE code verifier to store and pass to `exchange_code()`. Close the module-level HTTP clients used by the auth module. Call `close_clients()` in sync code or `await aclose_clients()` in async code during application shutdown to release connections. ```python usage from frameio.auth import close_clients # During application shutdown close_clients() ``` #### Auth Exceptions All auth exceptions inherit from `FrameioAuthError`. | Exception | Description | | --------------------- | -------------------------------------------------------------------------------------- | | `FrameioAuthError` | Base exception for all `frameio.auth` errors. | | `AuthenticationError` | Token exchange or refresh failed. Has `error_code` and `error_description` attributes. | | `TokenExpiredError` | Refresh token is expired; re-authentication is required. | | `ConfigurationError` | Required configuration is missing or invalid. | | `NetworkError` | Network request failed (timeout, connection error, etc.). | | `RateLimitError` | API returned 429 and retries are exhausted. Has `retry_after` attribute. | | `PKCEError` | PKCE verification failed. | *** #### Metadata Update metadata values across multiple files.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.metadata import ( BulkUpdateMetadataParamsData, BulkUpdateMetadataParamsDataValuesItem, ) client = Frameio( token="YOUR_TOKEN", ) client.metadata.bulk_update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=BulkUpdateMetadataParamsData( file_ids=[ "09b31c2a-04de-464a-a593-643a36ef0d98", "b967fc36-4e18-4b48-a3ab-c790100e2baa", ], values=[ BulkUpdateMetadataParamsDataValuesItem( field_definition_id="ff41ce50-269b-4624-8306-aac10e28ab94", value=[ { "id": "e60f47b4-cf8e-4273-96d5-3258a830a0aa", "type": "user", }, { "id": "24eeaf7e-ce27-4555-bc77-cce39900626d", "type": "account_user_group", }, ], ) ], ), ) ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid` — `data`: `BulkUpdateMetadataParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Show the metadata of a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.metadata.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", show_null=True, ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `show_null`: `typing.Optional[bool]` — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Metadata Fields Delete account level custom field definitions.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.metadata_fields.metadata_field_definitions_delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", field_definition_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `field_definition_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update account level custom field definitions.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import ( Frameio, UpdateSelectDefinitionParamsFieldConfiguration, UpdateSelectDefinitionParamsFieldConfigurationOptionsItem, ) from frameio.metadata_fields import UpdateFieldDefinitionParamsData_Select client = Frameio( token="YOUR_TOKEN", ) client.metadata_fields.metadata_field_definitions_update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", field_definition_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=UpdateFieldDefinitionParamsData_Select( field_configuration=UpdateSelectDefinitionParamsFieldConfiguration( enable_add_new=False, options=[ UpdateSelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), UpdateSelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ), ], ), name="Updated-Field-Name", ), ) ``` **Parameters** `account_id`: Uuid — `field_definition_id`: Uuid — `data`: typing.Optional\[UpdateFieldDefinitionParamsData] `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List account level field definitions.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.metadata_fields.metadata_field_definitions_index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: Uuid — `include`: typing.Optional\[typing.Literal\["creator"]] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Create account level field definitions.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import ( Frameio, SelectDefinitionParamsFieldConfiguration, SelectDefinitionParamsFieldConfigurationOptionsItem, ) from frameio.metadata_fields import CreateFieldDefinitionParamsData_Select client = Frameio( token="YOUR_TOKEN", ) client.metadata_fields.metadata_field_definitions_create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=CreateFieldDefinitionParamsData_Select( field_configuration=SelectDefinitionParamsFieldConfiguration( enable_add_new=False, options=[ SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 1", ), SelectDefinitionParamsFieldConfigurationOptionsItem( display_name="Option 2", ), ], ), name="Fields definition name", ), ) ``` **Parameters** `account_id`: Uuid — `data`: typing.Optional\[CreateFieldDefinitionParamsData] `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Project Permissions List user roles for a given project.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.project_permissions.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include_deactivated=True, after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: Uuid — `project_id`: Uuid — `include_deactivated`: typing.Optional\[bool] — Supports including deactivated users in the response. Default is false. `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Remove a user from a given project.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.project_permissions.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `project_id`: Uuid — `user_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update user roles for the given project if the user is already added to the project. If the user is not added to the project, the user will be added with the given role.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio, UpdateUserRolesParamsData client = Frameio( token="YOUR_TOKEN", ) client.project_permissions.project_user_roles_update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=UpdateUserRolesParamsData( role="editor", ), ) ``` **Parameters** `account_id`: Uuid — `project_id`: Uuid — `user_id`: Uuid — `data`: UpdateUserRolesParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Projects Show project details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.projects.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid` — `include`: `typing.Optional[typing.Literal["owner"]]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Delete a project.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.projects.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Update project details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.projects import ProjectUpdateParamsData client = Frameio( token="YOUR_TOKEN", ) client.projects.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=ProjectUpdateParamsData( name="Project Name", restricted=True, status="active", ), ) ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid` — `data`: `ProjectUpdateParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. List projects in a given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.projects.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: `Uuid` — `workspace_id`: `Uuid` — `include`: `typing.Optional[typing.Literal["owner"]]` — `after`: `typing.Optional[RequestAfterOpaqueCursor]` Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: `typing.Optional[RequestPageSize]` — ` `include\_total\_count`: `typing.Optional\[IncludeTotalCount]\` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Create project in a given workspace.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.projects import ProjectParamsData client = Frameio( token="YOUR_TOKEN", ) client.projects.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=ProjectParamsData( name="Project Name", restricted=True, ), ) ``` **Parameters** `account_id`: `Uuid` — `workspace_id`: `Uuid` — `data`: `ProjectParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. #### Folders Show folder details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.folders.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="creator", ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `include`: typing.Optional\[AssetInclude] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Delete folder by id.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.folders.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update folder details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.folders import FolderUpdateParamsData client = Frameio( token="YOUR_TOKEN", ) client.folders.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FolderUpdateParamsData( name="Folder name", ), ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `data`: FolderUpdateParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List the children in the given folder. Use the include query parameter to selectively include additional properties in the response. if you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a 403 Forbidden error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's status is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully. Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.folders.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", type="file,folder,version_stack", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `include`: typing.Optional\[FileWithMediaLinksInclude] — `type`: typing.Optional\[ChildrenType] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Copy folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.folders import FolderCopyParamsData client = Frameio( token="YOUR_TOKEN", ) client.folders.copy( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", copy_metadata=True, data=FolderCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `copy_metadata`: typing.Optional\[bool] — Whether to copy metadata values along with the folder `data`: typing.Optional\[FolderCopyParamsData] `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List folders in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.folders.list( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="creator", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `include`: typing.Optional\[AssetInclude] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Create a new folder inside the given folder\_id path param.\ Rate Limits: 3 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio from frameio.folders import FolderCreateParamsData client = Frameio( token="YOUR_TOKEN", ) client.folders.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FolderCreateParamsData( name="Folder name", ), ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `data`: FolderCreateParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Move folder to a folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.folders import FolderMoveParamsData client = Frameio( token="YOUR_TOKEN", ) client.folders.move( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FolderMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `data`: FolderMoveParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Version Stacks List the children (files) in a given version stack. Use the include query parameter to selectively include additional properties in the response. If you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's status is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully.. Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", version_stack_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: Uuid — `version_stack_id`: Uuid — `include`: typing.Optional\[FileWithMediaLinksInclude] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Show version stack details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", version_stack_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", ) ``` **Parameters** `account_id`: Uuid — `version_stack_id`: Uuid — `include`: typing.Optional\[VersionStacksShowRequestInclude] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Copy version stack.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.version_stacks import VersionStackCopyParamsData client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.copy( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", version_stack_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", copy_metadata=True, data=VersionStackCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: Uuid — `version_stack_id`: Uuid — `copy_metadata`: typing.Optional\[bool] — Whether to copy metadata values along with the version stack `data`: typing.Optional\[VersionStackCopyParamsData] `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List version stacks in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.list( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `include`: typing.Optional\[FileWithMediaLinksInclude] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Create a new Version Stack under the parent folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.version_stacks import VersionStackCreateParamsData client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=VersionStackCreateParamsData( file_ids=[ "dd2a3cdd-fc90-41bd-a7b8-8a0447aec6d4", "79fed48a-8372-496e-8dcb-5e959b9b9fcf", ], ), ) ``` **Parameters** `account_id`: Uuid — `folder_id`: Uuid — `data`: VersionStackCreateParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Move version stack to a folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.version_stacks import VersionStackMoveParamsData client = Frameio( token="YOUR_TOKEN", ) client.version_stacks.move( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", version_stack_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=VersionStackMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: Uuid — `version_stack_id`: Uuid — `data`: VersionStackMoveParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Account Permissions List user roles for a given account.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.account_permissions.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include_deactivated=True, after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: Uuid — `include_deactivated`: typing.Optional\[bool] — Supports including deactivated users in the response. Default is false. `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Accounts List accounts for the current user.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.accounts.index( after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Comments Show a single comment on a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.comments.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", comment_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="owner", ) ``` **Parameters** `account_id`: Uuid — `comment_id`: Uuid — `include`: typing.Optional\[CommentsShowRequestInclude] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Delete comment from an asset.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.comments.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", comment_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `comment_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update comment on given asset.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.comments import UpdateCommentParamsData client = Frameio( token="YOUR_TOKEN", ) client.comments.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", comment_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", timestamp_as_timecode=True, data=UpdateCommentParamsData( annotation='[{"tool":"rect","color":"#F22237","size":8,"x":0.277726001863933,"y":0.12909555568499534,"w":0.3153168321877913,"h":0.5308131407269339,"ix":0.277726001863933,"iy":0.12909555568499534,"radius":8}]', completed=False, page=4, text="This is great!", ), ) ``` **Parameters** `account_id`: Uuid — `comment_id`: Uuid — `data`: UpdateCommentParamsData `timestamp_as_timecode`: typing.Optional\[bool] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List comments on a given asset.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.comments.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="owner", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: Uuid — `file_id`: Uuid — `include`: typing.Optional\[CommentInclude] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Create a comment on a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.comments import CreateCommentParamsData client = Frameio( token="YOUR_TOKEN", ) client.comments.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", timestamp_as_timecode=True, data=CreateCommentParamsData( annotation='[{"tool":"rect","color":"#F22237","size":8,"x":0.277726001863933,"y":0.12909555568499534,"w":0.3153168321877913,"h":0.5308131407269339,"ix":0.277726001863933,"iy":0.12909555568499534,"radius":8}]', completed=False, page=4, text="This is great!", timestamp="00:00:02:12", ), ) ``` **Parameters** `account_id`: Uuid — `file_id`: Uuid — `data`: CreateCommentParamsData `timestamp_as_timecode`: typing.Optional\[bool] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Webhooks List webhooks for the given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.webhooks.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `include`: typing.Optional\[typing.Literal\["creator"]] — `after`: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Creates a single webhook with secret. Valid events: `file.created`,\ `file.deleted`,\ `file.ready`, `file.updated`, `file.upload.completed`, `file.versioned`, `file.copied`, `folder.created`, `folder.deleted`, `folder.updated`, `folder.copied`, `comment.completed`, `comment.created`, `comment.deleted`, `comment.uncompleted`, `comment.updated`, `customfield.created`, `customfield.updated`, `customfield.deleted`, `metadata.value.updated`, `project.created`, `project.deleted`, `project.updated`, `collection.created`, `collection.updated`, `collection.deleted`, `share.created`, `share.updated`, `share.deleted`, `share.viewed`. Rate Limits: 10 calls per 1.00 minute(s) per account ```python usage from frameio import Frameio from frameio.webhooks import WebhookCreateParamsData client = Frameio( token="YOUR_TOKEN", ) client.webhooks.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=WebhookCreateParamsData( events=[ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name="New Webhook", url="https://url.example.com", ), ) ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `data`: WebhookCreateParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Show webhook details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.webhooks.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", webhook_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `webhook_id`: Uuid — `include`: typing.Optional\[typing.Literal\["creator"]] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Delete a webhook.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.webhooks.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", webhook_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `webhook_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update webhook details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.webhooks import WebhookUpdateParamsData client = Frameio( token="YOUR_TOKEN", ) client.webhooks.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", webhook_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=WebhookUpdateParamsData( active=True, events=[ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name="Updated Webhook", url="https://url.example.com", ), ) ``` **Parameters** `account_id`: Uuid — `webhook_id`: Uuid — `data`: WebhookUpdateParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Workspace Permissions List user roles for a given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.workspace_permissions.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include_deactivated=True, after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: `Uuid` — `workspace_id`: `Uuid` — `includ_deactivated`: `typing.Optional[bool]` — Supports including deactivated users in the response. Default is false. `after`: `typing.Optional[RequestAfterOpaqueCursor]` Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: `typing.Optional[RequestPageSize]` — `include_total_count`: `typing.Optional[IncludeTotalCount]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Remove a user from a given workspace.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.workspace_permissions.workspace_user_roles_delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `workspace_id`: `Uuid` — `user_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Update user roles for the given workspace if the user is already added to the workspace. If the user is not added to the workspace, the user will be added with the given role.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio, UpdateUserRolesParamsData client = Frameio( token="YOUR_TOKEN", ) client.workspace_permissions.workspace_user_roles_update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", user_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=UpdateUserRolesParamsData( role="editor", ), ) ``` **Parameters** `account_id`: `Uuid` — `workspace_id`: `Uuid`— `user_id`: `Uuid` — `data`: `UpdateUserRolesParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. #### Workspaces Show workspace details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.workspaces.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `include`: typing.Optional\[typing.Literal\["creator"]] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Delete workspace from account.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.workspaces.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Update a workspace.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio, WorkspaceParamsData client = Frameio( token="YOUR_TOKEN", ) client.workspaces.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", workspace_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=WorkspaceParamsData( name="My Workspace", ), ) ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `data`: WorkspaceParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. List workspaces for a given account.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.workspaces.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: Uuid — `workspace_id`: Uuid — `include`: typing.Optional\[typing.Literal\["owner"]] — after: typing.Optional\[RequestAfterOpaqueCursor] Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. \`page\_size\`\`: typing.Optional\[RequestPageSize] — `include_total_count`: typing.Optional\[IncludeTotalCount] — `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. Create workspace from an account.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio, WorkspaceParamsData client = Frameio( token="YOUR_TOKEN", ) client.workspaces.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=WorkspaceParamsData( name="My Workspace", ), ) ``` **Parameters** `account_id`: Uuid — `data`: WorkspaceParamsData `request_options`: typing.Optional\[RequestOptions] — Request-specific configuration. #### Shares Show a single Share.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.shares.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Delete a share.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.shares.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Update share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage import datetime from frameio import Frameio from frameio.shares import UpdateShareParamsData client = Frameio( token="YOUR_TOKEN", ) client.shares.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=UpdateShareParamsData( access="public", description="A descriptive summary of the share", downloading_enabled=True, expiration=datetime.datetime.fromisoformat( "2026-01-22 17:04:53+00:00", ), name="Share Name", passphrase="as!dfj39sd(*", ), ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `data`: `UpdateShareParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. List share reviewers.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.shares.list_reviewers( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `after`: `typing.Optional[RequestAfterOpaqueCursor]` Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: `typing.Optional[RequestPageSize]` — `include_total_count`: `typing.Optional[IncludeTotalCount]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Add reviewers to secure share by three identifier types: `adobe_user_id`, `email`, and `user_id`. A request can only include one identifier type parameter. `email` is the only identifier able to add reviewers to a Share who don't have a Frame account member on the account where the Share belongs.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.shares import ( AddReviewersToShareParamsData, AddReviewersToShareParamsDataReviewers, ) client = Frameio( token="YOUR_TOKEN", ) client.shares.add_reviewers( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=AddReviewersToShareParamsData( message="Please join my share!", reviewers=AddReviewersToShareParamsDataReviewers( emails=["email1@domain.com", "email2@domain.com"], ), ), ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `data`: `AddReviewersToShareParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Removes reviewers from secure Share by three identifier types: `adobe_user_id`, `email`, and `user_id`. A request can only include one identifier type parameter.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.shares import ( RemoveReviewerParamsData, RemoveReviewerParamsDataReviewers, ) client = Frameio( token="YOUR_TOKEN", ) client.shares.remove_reviewers( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=RemoveReviewerParamsData( reviewers=RemoveReviewerParamsDataReviewers( adobe_user_ids=[ "2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e" ], ), ), ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `data`: `RemoveReviewerParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Remove an asset currently in the share from that share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.shares.remove_asset( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", asset_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `asset_id`: `Uuid`— `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Add new asset share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.shares import AddAssetParamsData client = Frameio( token="YOUR_TOKEN", ) client.shares.add_asset( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", share_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=AddAssetParamsData( asset_id="0cc1cb59-1d7c-4176-8532-afe099897318", ), ) ``` **Parameters** `account_id`: `Uuid` — `share_id`: `Uuid`— `data`: `AddAssetParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. List shares on a project.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) response = client.shares.index( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", after="", page_size=10, include_total_count=False, ) for item in response: yield item # alternatively, you can paginate page-by-page for page in response.iter_pages(): yield page ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid`— `after`: `typing.Optional[RequestAfterOpaqueCursor]` Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: `typing.Optional[RequestPageSize]` — `include_total_count`: `typing.Optional[IncludeTotalCount]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Create share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```python usage import datetime from frameio import Frameio from frameio.shares import CreateShareParamsData_Asset client = Frameio( token="YOUR_TOKEN", ) client.shares.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", project_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=CreateShareParamsData_Asset( access="public", asset_ids=[ "12eb1446-5736-4f93-85fc-3b636f156211", "f23a3b3e-7b1f-4655-b91a-acf0566e5bb9", ], downloading_enabled=True, expiration=datetime.datetime.fromisoformat( "2026-01-22 17:04:53+00:00", ), name="Share Name", passphrase="as!dfj39sd(*", ), ) ``` **Parameters** `account_id`: `Uuid` — `project_id`: `Uuid`— `data`: `CreateShareParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. #### Files List files in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.files.list( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", after="", page_size=10, include_total_count=False, ) ``` **Parameters** `account_id`: `Uuid` — `folder_id`: `Uuid` — `include`: `typing.Optional[FileWithMediaLinksInclude]` — `after`: `typing.Optional[RequestAfterOpaqueCursor]` Opaque Cursor query param for requests returning paginated results. This value is auto-generated and included as part of links from a previous response. It is not intended to be human readable. `page_size`: `typing.Optional[RequestPageSize]` — `include_total_count`: `typing.Optional[IncludeTotalCount]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Create new file under parent folder. `Create file (local upload)` and `Create file (remote upload)` have replaced this endpoint.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileCreateParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.create( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FileCreateParamsData( file_size=1137444, media_type="image/png", name="asset.png", ), ) ``` **Parameters** `account_id`: `Uuid` — `folder_id`: `Uuid` — `data`: `FileCreateParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Show file details. Use the include query parameter to selectively include additional properties in the response. If you include `media_links.original` and the user does not have permission to download the file then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't completed (i.e. the file's status is "uploaded" rather than "transcoded"), then the link will also be set to null in the response payload. In short, the client must handle null media links gracefully. Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.files.show( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", include="media_links", ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `include`: `typing.Optional[FileWithMediaLinksInclude]` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Delete file by ID.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.files.delete( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Update file details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileUpdateParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.update( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FileUpdateParamsData( name="asset.png", ), ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `data`: `FileUpdateParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Copy file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileCopyParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.copy( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", copy_metadata=True, copy_comments="none", data=FileCopyParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `copy_metadata`: `typing.Optional[bool]` — Whether to copy metadata values along with the file `copy_comments`: `typing.Optional[FilesCopyRequestCopyComments]` — Which comments to copy along with the file `data`: `typing.Optional[FileCopyParamsData]` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Create new file under parent folder through remote upload.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileCreateRemoteUploadParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.create_remote_upload( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FileCreateRemoteUploadParamsData( name="asset.png", source_url="https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png", ), ) ``` **Parameters** `account_id`: `Uuid` — `folder_id`: `Uuid` — `data`: `FileCreateRemoteUploadParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Move file to a folder or version\_stack.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileMoveParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.move( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FileMoveParamsData( parent_id="2e426fe0-f965-4594-8b2b-b4dff1dc00ec", ), ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `data`: `FileMoveParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Create new file under parent folder through local upload.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio from frameio.files import FileCreateLocalUploadParamsData client = Frameio( token="YOUR_TOKEN", ) client.files.create_local_upload( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", folder_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", data=FileCreateLocalUploadParamsData( file_size=1137444, name="asset.png", ), ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `data`: `FileCreateLocalUploadParamsData` `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. Show file upload status details.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.files.show_file_upload_status( account_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", file_id="b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ) ``` **Parameters** `account_id`: `Uuid` — `file_id`: `Uuid` — `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. #### Users Inspect details of the user associated with the bearer token.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```python usage from frameio import Frameio client = Frameio( token="YOUR_TOKEN", ) client.users.show() ``` **Parameters** `request_options`: `typing.Optional[RequestOptions]` — Request-specific configuration. *** ### PyPI View on [PyPI](https://pypi.org/project/frameio/) *** # TypeScript SDK Reference *** ### Installation ```curl npm i -s frameio ``` *** ### Usage Instantiate and use the client with the following: ```ts import { FrameioClient } from "frameio"; const client = new FrameioClient({ token: "YOUR_TOKEN" }); await client.metadataFields.metadataFieldDefinitionsCreate("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { field_type: "select", field_configuration: { enable_add_new: false, options: [ { display_name: "Option 1", }, { display_name: "Option 2", }, ], }, name: "Fields definition name", }, }); ``` *** ### Request And Response Types The SDK exports all request and response types as TypeScript interfaces. Simply import them with the following namespace: ```ts import { Frameio } from "frameio"; const request: Frameio.UpdateFieldDefinitionParams = { ... }; ``` *** ### Exception Handling When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error will be thrown. ```ts import { FrameioError } from "frameio"; try { await client.metadataFields.metadataFieldDefinitionsCreate(...); } catch (err) { if (err instanceof FrameioError) { console.log(err.statusCode); console.log(err.message); console.log(err.body); console.log(err.rawResponse); } } ``` *** ### Advanced #### Additional Headers If you would like to send additional headers as part of the request, use the headers request option. ```ts const response = await client.metadataFields.metadataFieldDefinitionsCreate(..., { headers: { 'X-Custom-Header': 'custom value' } }); ``` #### Additional Query String Parameters If you would like to send additional query string parameters as part of the request, use the queryParams request option. ```ts const response = await client.metadataFields.metadataFieldDefinitionsCreate(..., { queryParams: { 'customQueryParamKey': 'custom query param value' } }); ``` *** #### Retries The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long as the request is deemed retryable and the number of retry attempts has not grown larger than the configured retry limit (default: 2). A request is deemed retryable when any of the following HTTP status codes is returned: * 408 (Timeout) * 429 (Too Many Requests) * 5XX (Internal Server Errors)
Use the `maxRetries` request option to configure this behavior. ```ts const response = await client.metadataFields.metadataFieldDefinitionsCreate(..., { maxRetries: 0 // override maxRetries at the request level }); ``` *** #### Timeouts The SDK defaults to a 60 second timeout. Use the timeoutInSeconds option to configure this behavior. ```ts const response = await client.metadataFields.metadataFieldDefinitionsCreate(..., { timeoutInSeconds: 30 // override timeout to 30s }); ``` #### Aborting Requests The SDK allows users to abort requests at any point by passing in an abort signal. ```ts const controller = new AbortController(); const response = await client.metadataFields.metadataFieldDefinitionsCreate(..., { abortSignal: controller.signal }); controller.abort(); // aborts the request ``` *** #### Access Raw Response Data The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. ```ts const { data, rawResponse } = await client.metadataFields.metadataFieldDefinitionsCreate(...).withRawResponse(); console.log(data); console.log(rawResponse.headers['X-My-Header']); ``` #### Runtime Compatibility The SDK works in the following runtimes: * Node.js 18+ * Vercel * Cloudflare Workers * Deno v1.25+ * Bun 1.0+ * React Native *** #### Customizing Fetch Client The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an unsupported environment, this provides a way for you to break glass and ensure the SDK works. ```ts import { FrameioClient } from "frameio"; const client = new FrameioClient({ ... fetcher: // provide your implementation here }); ``` *** ### Reference #### Metadata Update metadata values across multiple files.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadata.bulkUpdate("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { file_ids: ["09b31c2a-04de-464a-a593-643a36ef0d98", "b967fc36-4e18-4b48-a3ab-c790100e2baa"], values: [ { field_definition_id: "ff41ce50-269b-4624-8306-aac10e28ab94", value: [ { id: "e60f47b4-cf8e-4273-96d5-3258a830a0aa", type: "user", }, { id: "24eeaf7e-ce27-4555-bc77-cce39900626d", type: "account_user_group", }, ], }, ], }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.BulkUpdateMetadataParams` `requestOptions`: `Metadata.RequestOptions` Show the metadata of a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadata.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { show_null: true, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.MetadataShowRequest` `requestOptions`: `Metadata.RequestOptions` #### Metadata Fields Delete account level custom field definitions.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadataFields.metadataFieldDefinitionsDelete( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fieldDefinitionId`: `Frameio.Uuid` — `requestOptions`: `MetadataFields.RequestOptions` Update account level custom field definitions.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadataFields.metadataFieldDefinitionsUpdate( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { field_type: "select", field_configuration: { enable_add_new: false, options: [ { display_name: "Option 1", }, { display_name: "Option 2", }, ], }, name: "Updated-Field-Name", }, }, ); ``` **Parameters** `accountId`: `Frameio.Uui`d\` — `fieldDefinitionId`: `Frameio.Uuid` — `request`: `Frameio.UpdateFieldDefinitionParams` requestOptions: MetadataFields.RequestOptions List account level field definitions.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadataFields.metadataFieldDefinitionsIndex("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `request`: `Frameio.MetadataFieldDefinitionsIndexRequest` `requestOptions`: `MetadataFields.RequestOptions` Create account level field definitions.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.metadataFields.metadataFieldDefinitionsCreate("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { field_type: "select", field_configuration: { enable_add_new: false, options: [ { display_name: "Option 1", }, { display_name: "Option 2", }, ], }, name: "Fields definition name", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `request`: `Frameio.CreateFieldDefinitionParams` `requestOptions`: `MetadataFields.RequestOptions` #### Project Permissions List user roles for a given project.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.projectPermissions.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.projectPermissions.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }, ); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.ProjectPermissionsIndexRequest` `requestOptions`: `ProjectPermissions.RequestOptions` Remove a user from a given project.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.projectPermissions.delete( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ); ``` **Parameters** `accountId`: `Frameio.Uui`d\` — `projectId`: `Frameio.Uuid` — `userId`: `Frameio.Uuid` — `requestOptions`: `ProjectPermissions.RequestOptions` Update user roles for the given project if the user is already added to the project. If the user is not added to the project, the user will be added with the given role.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.projectPermissions.projectUserRolesUpdate( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { role: "editor", }, }, ); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `UserId`: `Frameio.Uuid` — `request`: `Frameio.UpdateUserRolesParams` `requestOptions`: `ProjectPermissions.RequestOptions` #### Projects Show project details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.projects.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.ProjectsShowRequest` `requestOptions`: `Projects.RequestOptions` Delete a project.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.projects.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uui`d\` — `projectId`: `Frameio.Uuid` — `requestOptions`: `Projects.RequestOptions` Update project details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.projects.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "Project Name", restricted: true, status: "active", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.ProjectUpdateParams` `requestOptions`: `Projects.RequestOptions` List projects in a given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.projects.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.projects.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.ProjectsIndexRequest` `requestOptions`: `Projects.RequestOptions` Create project in a given workspace.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.projects.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "Project Name", restricted: true, }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.ProjectsParams` `requestOptions`: `Projects.RequestOptions` #### Folders Show folder details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.FoldersShowRequest` `requestOptions`: `Folders.RequestOptions` Delete folder by id.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `requestOptions`: `Folders.RequestOptions` Update folder details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "Folder name", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FolderUpdateParams` `requestOptions`: `Folders.RequestOptions` List the children in the given folder.\ Use the include query parameter to selectively include additional properties in the response. If you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's status is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully. Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", type: "file,folder,version_stack", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FolderIndexRequest` `requestOptions`: `Folders.RequestOptions` Copy folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.copy("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { copy_metadata: true, data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FolderCopyParams` `requestOptions`: `Folders.RequestOptions` List folders in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.folders.list("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FoldersListRequest` `requestOptions`: `Folders.RequestOptions` Create a new folder inside the given `folder_id` path param. Rate Limits: 3 calls per 1 second(s) per account\_user ```ts usage await client.folders.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "Folder name", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FolderCreateParams` `requestOptions`: `Folders.RequestOptions` Move folder to a folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.folders.move("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FolderMoveParams` `requestOptions`: `Folders.RequestOptions` #### Version Stacks List the children (files) in a given version stack.\ Use the include query parameter to selectively include additional properties in the response. If you include `media_links.original` and the user does not have permission to download files in the corresponding project, then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. `including media_links.video_h264_180` on a static image file) or transoding process hasn't finished (i.e. the file's status is "uploaded" rather than "transcoded"), then the a media link will also be set to null in the response payload. In short, the client must handle null media links gracefully. Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.versionStacks.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.VersionStacksIndexRequest` `requestOptions`: `VersionStacks.RequestOptions` Show version stack details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.versionStacks.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `versionStackId`: `Frameio.Uuid` — `request`: `Frameio.VersionStacksShowRequest` `requestOptions`: `VersionStacks.RequestOptions` Copy version stack.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.versionStacks.copy("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { copy_metadata: true, data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `versionStackId`: `Frameio.Uuid` — `request`: `Frameio.VersionStackCopyParams` `requestOptions`: `VersionStacks.RequestOptions` List version stacks in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.versionStacks.list("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.VersionStacksListRequest` `requestOptions`: `VersionStacks.RequestOptions` Create a new Version Stack under the parent folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.versionStacks.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { file_ids: ["dd2a3cdd-fc90-41bd-a7b8-8a0447aec6d4", "79fed48a-8372-496e-8dcb-5e959b9b9fcf"], }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.VersionStackCreateParams` `requestOptions`: `VersionStacks.RequestOptions` Move version stack to a folder.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.versionStacks.move("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.VersionStackMoveParams` `requestOptions`: `VersionStacks.RequestOptions` #### Account Permissions List user roles for a given account.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.accountPermissions.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.accountPermissions.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `request`: `Frameio.AccountPermissionsIndexRequest` `requestOptions`: `AccountPermissions.RequestOptions` #### Accounts List accounts for the current user.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.accounts.index({ after: "", page_size: 10, include_total_count: false, }); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.accounts.index({ after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `request`: `Frameio.AccountsIndexRequest` `requestOptions`: `Accounts.RequestOptions` #### Comments Show a single comment on a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.comments.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `commentId`: `Frameio.Uuid` — `request`: `Frameio.CommentsShowRequest` `requestOptions`: `Comments.RequestOptions` Delete comment from an asset.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.comments.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `commentId`: `Frameio.Uuid` — `requestOptions`: `Comments.RequestOptions` Update comment on given asset.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.comments.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { timestamp_as_timecode: true, data: { annotation: '[{"tool":"rect","color":"#F22237","size":8,"x":0.277726001863933,"y":0.12909555568499534,"w":0.3153168321877913,"h":0.5308131407269339,"ix":0.277726001863933,"iy":0.12909555568499534,"radius":8}]', completed: false, page: 4, text: "This is great!", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `commentId`: `Frameio.Uuid` — `request`: `Frameio.UpdateCommentParams` `requestOptions`: `Comments.RequestOptions` List comments on a given asset.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.comments.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.comments.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "owner", after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.CommentsIndexRequest` `requestOptions`: `Comments.RequestOptions` Create a comment on a file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.comments.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { timestamp_as_timecode: true, data: { annotation: '[{"tool":"rect","color":"#F22237","size":8,"x":0.277726001863933,"y":0.12909555568499534,"w":0.3153168321877913,"h":0.5308131407269339,"ix":0.277726001863933,"iy":0.12909555568499534,"radius":8}]', completed: false, page: 4, text: "This is great!", timestamp: "00:00:02:12", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.CreateCommentParams` `requestOptions`: `Comments.RequestOptions` #### Webhooks List webhooks for the given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.webhooks.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.webhooks.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.WebhooksIndexRequest` `requestOptions`: `Webhooks.RequestOptions` Creates a single webhook with secret.\ Valid events: `file.created`,\ `file.deleted`,\ `file.ready`, `file.updated`, `file.upload.completed`, `file.versioned`, `file.copied`, `folder.created`, `folder.deleted`, `folder.updated`, `folder.copied`, `comment.completed`, `comment.created`, `comment.deleted`, `comment.uncompleted`, `comment.updated`, `customfield.created`, `customfield.updated`, `customfield.deleted`, `metadata.value.updated`, `project.created`, `project.deleted`, `project.updated`, `collection.created`, `collection.updated`, `collection.deleted`, `share.created`, `share.updated`, `share.deleted`, `share.viewed`\ Rate Limits: 10 calls per 1.00 minute(s) per account ```ts usage await client.webhooks.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { events: [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name: "New Webhook", url: "https://url.example.com", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.WebhookCreateParams` `requestOptions`: `Webhooks.RequestOptions` Show webhook details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.webhooks.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `webhookId`: `Frameio.Uuid` — `request`: `Frameio.WebhooksShowRequest` `requestOptions`: `Webhooks.RequestOptions` Delete a webhook.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.webhooks.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `webhookId`: `Frameio.Uuid` — `requestOptions`: `Webhooks.RequestOptions` Update webhook details.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.webhooks.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { active: true, events: [ "file.created", "file.deleted", "file.ready", "file.updated", "file.upload.completed", "file.versioned", "file.copied", "folder.created", "folder.deleted", "folder.updated", "folder.copied", "comment.completed", "comment.created", "comment.deleted", "comment.uncompleted", "comment.updated", "customfield.created", "customfield.updated", "customfield.deleted", "metadata.value.updated", "project.created", "project.deleted", "project.updated", "collection.created", "collection.updated", "collection.deleted", "share.created", "share.updated", "share.deleted", "share.viewed", ], name: "Updated Webhook", url: "https://url.example.com", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `webhookId`: `Frameio.Uuid` — ` `request`: `Frameio.WebhookUpdateParams\` `requestOptions`: `Webhooks.RequestOptions` #### Workspace Permissions List user roles for a given workspace.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.workspacePermissions.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.workspacePermissions.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include_deactivated: true, after: "", page_size: 10, include_total_count: false, }, ); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.WorkspacePermissionsIndexRequest` `requestOptions`: `WorkspacePermissions.RequestOptions` Remove a user from a given workspace.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspacePermissions.workspaceUserRolesDelete( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `userId`: `Frameio.Uuid` — `requestOptions`: `WorkspacePermissions.RequestOptions` Update user roles for the given workspace if the user is already added to the workspace. If the user is not added to the workspace, the user will be added with the given role.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspacePermissions.workspaceUserRolesUpdate( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { role: "editor", }, }, ); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `userId`: `Frameio.Uuid` — `request`: `Frameio.UpdateUserRolesParams` `requestOptions`: `WorkspacePermissions.RequestOptions` #### Workspaces Show workspace details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspaces.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.WorkspacesShowRequest` `requestOptions`: `Workspaces.RequestOptions` Delete workspace from account.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspaces.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `requestOptions`: `Workspaces.RequestOptions` Update a workspace.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspaces.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "My Workspace", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `workspaceId`: `Frameio.Uuid` — `request`: `Frameio.WorkspaceParams` `requestOptions`: `Workspaces.RequestOptions` List workspaces for a given account.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.workspaces.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.workspaces.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "creator", after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `request`: `Frameio.WorkspacesIndexRequest` `requestOptions`: `Workspaces.RequestOptions` Create workspace from an account.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.workspaces.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "My Workspace", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `request`: `Frameio.WorkspaceParams` `requestOptions`: `Workspaces.RequestOptions` #### Shares Show a single Share.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `requestOptions`: `Shares.RequestOptions` Delete a share.\ Rate Limits: 60 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `requestOptions`: `Shares.RequestOptions` Update share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { access: "public", description: "A descriptive summary of the share", downloading_enabled: true, expiration: "2026-01-22T17:04:53Z", name: "Share Name", passphrase: "as!dfj39sd(*", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.UpdateShareParams` `requestOptions`: `Shares.RequestOptions` List share reviewers.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.shares.listReviewers( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.shares.listReviewers( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { after: "", page_size: 10, include_total_count: false, }, ); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.SharesListReviewersRequestreParams` `requestOptions`: `Shares.RequestOptions` Add reviewers to secure share by three identifier types: `adobe_user_id`, `email`, and `user_id`. A request can only include one identifier type parameter. `email` is the only identifier able to add reviewers to a Share who don't have a Frame account member on the account where the Share belongs.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.addReviewers("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { message: "Please join my share!", reviewers: { emails: ["email1@domain.com", "email2@domain.com"], }, }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.AddReviewersToShareParams` `requestOptions`: `Shares.RequestOptions` Removes reviewers from secure Share by three identifier types: `adobe_user_id`, `email`, and `user_id`. A request can only include one identifier type parameter.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.removeReviewers("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { reviewers: { adobe_user_ids: ["2A3C1A3D66C621B20A494021@176719f5667c82b4499999.e"], }, }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.RemoveReviewerParams` `requestOptions`: `Shares.RequestOptions` Remove an asset currently in the share from that share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.removeAsset( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", ); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `assetId`: `Frameio.Uuid` — `requestOptions`: `Shares.RequestOptions` Add new asset share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.addAsset("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { asset_id: "0cc1cb59-1d7c-4176-8532-afe099897318", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.AddAssetParams` `requestOptions`: `Shares.RequestOptions` List shares on a project.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage const response = await client.shares.index( "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { after: "", page_size: 10, include_total_count: false, }, ); for await (const item of response) { console.log(item); } // Or you can manually iterate page-by-page let page = await client.shares.index("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { after: "", page_size: 10, include_total_count: false, }); while (page.hasNextPage()) { page = page.getNextPage(); } ``` **Parameters** `accountId`: `Frameio.Uuid` — `shareId`: `Frameio.Uuid` — `request`: `Frameio.SharesIndexRequest` `requestOptions`: `Shares.RequestOptions` Create share.\ Rate Limits: 10 calls per 1.00 minute(s) per account\_user ```ts usage await client.shares.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { type: "asset", access: "public", asset_ids: ["12eb1446-5736-4f93-85fc-3b636f156211", "f23a3b3e-7b1f-4655-b91a-acf0566e5bb9"], downloading_enabled: true, expiration: "2026-01-22T17:04:53Z", name: "Share Name", passphrase: "as!dfj39sd(*", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `projectId`: `Frameio.Uuid` — `request`: `Frameio.CreateShareParams` `requestOptions`: `Shares.RequestOptions` #### Files List files in a given folder.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.list("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", after: "", page_size: 10, include_total_count: false, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FilesListRequest` `requestOptions`: `Files.RequestOptions` Create new file under parent folder. `Create file (local upload)` and `Create file (remote upload)` have replaced this endpoint.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.create("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { file_size: 1137444, media_type: "image/png", name: "asset.png", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FileCreateParams` `requestOptions`: `Files.RequestOptions` Show file details.\ Use the include query parameter to selectively include additional properties in the response. If you include `media_links.original` and the user does not have permission to download the file then this endpoint will respond with a `403 Forbidden` error. If the content is inaccessible because watermarking is required for this user and isn't supported by the requested media\_links, then the request will succeed but the unsupported media links will be set to null. Similarly, if a requested transcode link does not exist for a particular file (e.g. including `media_links.video_h264_180` on a static image file) or transoding process hasn't completed (i.e. the file's status is "uploaded" rather than "transcoded"), then the link will also be set to null in the response payload. In short, the client must handle null media links gracefully. Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.show("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { include: "media_links", }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FilesShowRequest` `requestOptions`: `Files.RequestOptions` Delete file by ID.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.files.delete("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `requestOptions`: `Files.RequestOptions` Update file details.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.files.update("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "asset.png", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.FileUpdateParams` `requestOptions`: `Files.RequestOptions` Copy file.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.files.copy("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { copy_metadata: true, copy_comments: "none", data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.FileCopyParams` `requestOptions`: `Files.RequestOptions` Create new file under parent folder through remote upload.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.createRemoteUpload("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { name: "asset.png", source_url: "https://upload.wikimedia.org/wikipedia/commons/e/e1/White_Pixel_1x1.png", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FileCreateRemoteUploadParams` `requestOptions`: `Files.RequestOptions` Move file to a folder or version\_stack.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.files.move("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { parent_id: "2e426fe0-f965-4594-8b2b-b4dff1dc00ec", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `request`: `Frameio.FileMoveParams` `requestOptions`: `Files.RequestOptions` Create new file under parent folder through local upload.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.createLocalUpload("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", { data: { file_size: 1137444, name: "asset.png", }, }); ``` **Parameters** `accountId`: `Frameio.Uuid` — `folderId`: `Frameio.Uuid` — `request`: `Frameio.FileCreateLocalUploadParams` `requestOptions`: `Files.RequestOptions` Show file upload status details.\ Rate Limits: 5 calls per 1 second(s) per account\_user ```ts usage await client.files.showFileUploadStatus("b2702c44-c6da-4bb6-8bbd-be6e547ccf1b", "b2702c44-c6da-4bb6-8bbd-be6e547ccf1b"); ``` **Parameters** `accountId`: `Frameio.Uuid` — `fileId`: `Frameio.Uuid` — `requestOptions`: `Files.RequestOptions` #### Users Inspect details of the user associated with the bearer token.\ Rate Limits: 100 calls per 1.00 minute(s) per account\_user ```ts usage await client.users.show(); ``` **Parameters** `requestOptions`: `Users.RequestOptions` *** ### npm View on [npm](https://www.npmjs.com/package/frameio) *** # Frame.io Camera to Cloud > Seamlessly integrate your devices and applications with Frame.io's cloud infrastructure

Camera to Cloud

Integrate your devices and applications with Frame.io's infrastructure.

Learn the foundations of device and application integration. Try endpoints in the API playground with interactive snippets. Checklist for integrating cameras and recording devices with Frame.io. Learn how to securely authenticate your devices with Frame.io's cloud services.

Need Help?

If you need additional support with Camera to Cloud integrations, please reach out to the Frame.io Support Team for assistance by chatting with us on our Support Site.

# Become a C2C Certified Connection ## Camera To Cloud The Camera to Cloud API provides a straightforward authentication protocol designed for devices with limited display capabilities. Once authenticated, your device can upload on-set data directly to the cloud. The system supports most standard file formats for video, audio, LUT/CDL, and timecode data. For more details about C2C Certified Connections, visit our [information page](https://frame.io/c2c/certified). ## Getting Started Sign up on our [developer site](/#start-building) and we'll contact you to guide you through the Cloud Devices integration process. After reviewing your device, we'll set up a shared Slack channel and work with you to create an integration plan and timeline. You'll receive a development package with all the materials needed to build a successful integration. ## Documentation Resources This article is the first in a series of guides to help with your C2C integration. These guides are starting points—we encourage you to reach out to our team with questions or suggestions for improving the documentation or API. Think of these as foundations for your integration journey, not comprehensive references. ## Developer Package Your development package will include: **1. Client Secret** Frame.io will create a configuration model in our backend for your device. Once completed, you'll receive a `client_secret` for your device, commonly called a device model identifier. **2. Reference Implementation** You'll receive a Python reference implementation with skeleton code that emulates hardware devices through a CLI tool. This includes commented code and documentation outlining key integration steps. **3. Validation Process** Before launch, you'll participate in a quality assurance process with Frame.io engineers to ensure your device performs as expected. Our goal is to help all integrators achieve consistent quality standards for end-users working with your cloud-connected device. This provides valuable feedback before public release. We'll provide a checklist of review items, but you can also refer to our [C2C Integration Checklist](./integrator-checklist) to understand what makes a successful integration. **4. Support Materials** You'll receive materials to help your team understand Frame.io's value proposition, demonstration techniques, and access to a dedicated Slack channel for working with our team. If you need additional support—such as a Frame.io platform demo or integration best practices workshop—let us know, and we'll arrange appropriate sessions. ## Planning Your Integration Before or during your conversations with our team, several technical details will need to be addressed. You don't need to have all this information ready before contacting us—this overview is to help you start thinking about these aspects. ### Device Information We'll need some basic information about your device: * The exact name of your device * A logo in SVG format, preferably monochromatic ### Authentication Method We now exclusively support the 6-digit code authentication flow. For applications, we offer an enhanced method using a special header parameter when requesting a device code to enable our URL pairing flow. This returns `verification_uri_complete` or `verification_uri` parameters you can use to generate a URL via hyperlink or a QR code for users to tap or scan. This starts a streamlined pairing process that connects directly to the user's selected project. For implementation details, see the [Enabling QR Code Pairing Guide](/camera-to-cloud/implementing-c2c-authentication-and-authorization#h3-section-enabling-qr-code-pairing). ## Marketing Collaboration Each new Cloud Devices integration offers innovative solutions to creative workflow challenges. We appreciate the significant investment required to develop and launch your integration. To support adoption, we'll work with you to create resources for our customers and the broader market. While marketing approaches are tailored to each integration, typical activities include: * Working with our Solutions team to design and document optimal use cases and workflows * Collaborating with mutual clients to develop case studies showing your integration in production * Creating sales materials for our team to connect users with your device and workflow solutions ## Next Steps We encourage you to contact our team to begin the partnership process, then continue to the next guide in this series. We look forward to working with you on your integration. # The Zen of Camera to Cloud ## What is the Camera to Cloud API? The Camera to Cloud (C2C) API provides a secure method for transmitting media directly to Frame.io immediately after recording completes, without requiring additional user input. At Frame.io, we aim to make media available for review and collaboration as soon as recording stops or metadata is entered. During development, we determined that to deliver the best experience for both integrators and users, the C2C API needed to function as its own specialized backend system, separate from Frame.io's main ecosystem. While this architectural decision may not seem intuitive at first, this document explains our reasoning by exploring the guiding principles behind C2C. ## Beyond Camera Footage While named "Camera to Cloud" for clarity and recognition, the API's capabilities extend beyond camera footage. The C2C API handles many types of digital content. Whether your device produces audio, video, PDFs, or other file types, Frame.io can accommodate them all. The API streamlines the transfer of any digital asset from creation to cloud storage with minimal friction. ## Write, but Don't Read Frame.io maintains strong security standards, and introducing device connectivity presents potential security considerations. Many media capture devices lack traditional security features like passwords or screen locks, as they weren't originally designed for network connectivity. Providing full Frame.io API access to these devices could create security vulnerabilities if left unattended. Additionally, device operators often need access only to specific elements rather than the entire project. Their role may be limited to creating particular media assets rather than managing the complete project. This led to our core design principle: recording devices exist primarily to create media, not to review or comment on content from other sources. The best security approach was to develop an API specifically limited to its essential function—uploading data to the cloud. By eliminating read capabilities entirely, we effectively prevented unauthorized access to sensitive project information. ## Designing for Devices with Limited Interfaces Frame.io's existing APIs were designed assuming they would interface with applications featuring graphical user interfaces. These applications could display options to users who would make selections that would then be sent to the server. The C2C ecosystem, however, includes physical devices with limited or no GUI capabilities, and potentially no user input mechanisms. This required a fundamentally different approach to user interaction. When designing C2C, we needed to create a system that could function effectively on devices with limited interface capabilities. This meant developing an interaction model that didn't require user input on the device itself, as such input might be impossible in many cases. This constraint eliminated the possibility of using our existing API architecture, which relied on web-based authentication flows and user selection of target folders. We needed to simplify not only the actions a device could perform but also the entire user experience surrounding those actions. ## Accommodating Intermittent Connectivity Beyond interface limitations, many devices in the C2C ecosystem operate in environments with unpredictable network connectivity. We designed our API to minimize backend communication, reducing the number of necessary calls during operation to ensure a reliable experience for professionals working in remote locations with limited WiFi or cellular service. ## Simplifying Integration Our priority was making integration as straightforward as possible. We developed a focused API with a minimal set of endpoints, limited server negotiation requirements, and a narrowly defined scope aligned with our objectives. We recognize that for some integrators, this may be their first experience implementing third-party network calls. Whether you're an experienced developer seeking efficient implementation or new to REST APIs, we've designed the experience to be accessible and straightforward. ## Next Steps We encourage you to contact our team with any questions and proceed to the next guide in this series. We look forward to supporting your C2C integration. For a technical overview, see the [integration architecture guide](./integration-architecture). # Concepts and Fundamentals ## Understanding Core Concepts The C2C API relies on several essential technologies that you should understand before beginning an integration project. Review the headings in this article—if any terms are unfamiliar, this guide will help address those knowledge gaps. If you encounter challenges with specific concepts, our team is available to provide additional resources and support. ## What You Need to Know To successfully integrate with the C2C API, you should have a basic understanding of: TLS/SSL, TCP/IP protocols and networking fundamentals Implementation of secure HTTPS requests Authentication and Authorization methodologies ## Networking Basics and Glossary At its core, the Frame.io API enables communication between Frame.io's servers and your device or application, requiring network interactions for every operation. Clear communication is essential in any relationship, including between servers and clients. Just as miscommunications occur in everyday conversation, similar challenges exist when computers exchange information. Beyond addressing standard communication issues, we need to ensure secure transmission of sensitive data. Frame.io requires encryption for all server communications, adding necessary security layers to the process. While implementing the C2C API, you'll likely use third-party libraries to handle networking details. However, since networking components often generate real-world errors, understanding the underlying processes when interacting with Frame.io's servers is valuable. Here's a concise glossary of essential terminology: Transmission Control Protocol / Internet Protocol - standardized components and layers that enable global data transfer. For more information, we recommend this [accessible, high-level resource](https://www.freecodecamp.org/news/what-is-tcp-ip-layers-and-protocols-explained/). Transport Layer Security / Secure Socket Layer - while technically different, they're commonly referenced interchangeably today. TLS represents the evolution of SSL, though the original acronym remains widely used. For more information about TLS, [consult this overview](https://www.internetsociety.org/deploy360/tls/basics/). ### Public and Private Keys A public key works like a lock, while a private key serves as the corresponding key. Think of this scenario: You want to send a confidential message to a colleague while ensuring privacy until delivery. First, ask your colleague to send you a lock for which only they have the key. Upon receiving this lock, secure your confidential message in a container using it. While anyone handling the container can see the lock, only your colleague has the key to access the contents. The lock provides no value to unauthorized parties trying to view the message. Even you cannot unlock it without the key. When your colleague receives the secured container, they simply use their key to access the contents. Public and private keys work the same way. You can share a public key widely. Recipients encrypt messages with this key, but only the private key holder can decrypt these communications. As long as the private key remains confidential, the public key cannot be used to decode the encrypted messages it creates. This public/private key mechanism underpins TLS functionality, allowing parties to communicate openly while establishing secure, private channels. ### Certificates Certificates contain public and private keys, authenticated by trusted certification authorities. When a Certificate Authority validates a key, it essentially vouches for the key's authenticity. Recipients of a public key—such as one from Google—can verify this endorsement from recognized certification authorities. Unendorsed keys are considered potentially fraudulent and trigger security alerts. Frame.io's certificates are validated by the Amazon Root CA 1 certificate authority. These certificates are available through various resources, including the Certifi library (used by Mozilla and the Python Requests library). For implementation, we recommend the Certifi [GitHub repository](https://github.com/certifi/python-certifi) and [certificate PEM bundle](https://github.com/certifi/python-certifi/blob/master/certifi/cacert.pem) to validate HTTPS requests to api.frame.io. A computer that provides or stores information for other computers. When you access Frame.io through a web browser, your browser requests content from Frame.io's server, which responds accordingly. Every action within Frame.io triggers a communication between your browser and our server, which processes your request and returns appropriate results. When uploading media to Frame.io, you're sending it to our servers. A client application requests information from or sends data to a server. When implementing the C2C API, you'll be developing a C2C client. Hypertext Transfer Protocol / Secure - operates within the application layer of the TCP/IP model. The difference between HTTP and HTTPS is security—HTTPS incorporates TLS/SSL verification into network communications. HTTP has evolved through various versions, establishing new standards over time. Version 1.1 remains the global standard and should be used for Frame.io API communications. REST (Representational State Transfer) is a design methodology for developing APIs based on HTTP request-response patterns. REST often serves as shorthand for the general approach of using HTTP for program-to-program interaction—as distinguished from browser-webpage communication—even when the API doesn't strictly adhere to REST principles. JavaScript Object Notation - a standardized data exchange format. Though initially developed for JavaScript objects, it has become a universal standard for networked communications. The C2C API delivers responses as JSON data. Amazon's Simple Storage Service provides cloud-based data storage solutions. S3 stores Frame.io's video and audio media, and serves as the destination for integration uploads. ## HTTP/S Requests HTTP is ubiquitous in web browsing—appearing at the beginning of nearly every website address. HTTP (Hypertext Transfer Protocol) establishes standardized computer-to-computer communication protocols. You can think of HTTP as a standardized form system for client-server interactions—similar to government forms required for information requests or program applications. Without properly completed forms, government agencies cannot process or respond to requests. HTTP requests facilitate all Frame.io application interactions. Within the C2C API framework, HTTP request types represent the available functional capabilities. For a comprehensive HTTP overview, see [this informative article](https://www.freecodecamp.org/news/http-and-everything-you-need-to-know-about-it/). Understanding these fundamentals is essential before proceeding. If you're new to HTTP requests, consider reviewing introductory materials. For optimal preparation, familiarize yourself with these HTTP concepts: * Protocol * Host * Port * Resource * Headers * Content-Type/Mimetype * Request and Response Payloads * HTTP verb applications: GET, POST, PUT, DELETE, etc. * Form Data While networking libraries typically handle request construction, the [HTTP/1.1 RFC](https://greenbytes.de/tech/webdav/rfc2616.html) provides a reference resource if needed. ## Authentication and Authorization We'll explore these concepts more thoroughly later, but understanding these foundational principles is important: Authentication verifies that requests come from claimed sources. When you log into websites with username/password credentials, you're authenticating yourself by demonstrating password knowledge. Multi-factor authentication—such as receiving verification codes via text message—represents additional authentication mechanisms. Authorization confirms permission to perform specific actions. When you add collaborators to Frame.io projects or Google documents, you're authorizing their access. Frame.io or Google have previously authenticated these users' identities, enabling you to confidently authorize their participation. OAuth (Open Authorization) provides a standardized framework for authorization management by integrating with third-party authentication services. Scopes define the authorized actions available to users. When connecting devices to Frame.io, you'll request and receive specific scopes that authorize particular operations. For example, the `asset_create` scope permits asset creation and uploading. Conceptually, scopes function as permission sets. ## Next Steps We encourage you to contact our team with any questions, then proceed to the next guide section. We look forward to supporting your integration efforts. For a technical overview, see the [integration architecture guide](./integration-architecture). If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). # Integration Architecture ## Introduction Before we begin making API requests, you need to understand the basic architecture of C2C integrations. (Don't worry—in the next article, you'll be working in the terminal. For now, let's cover these essential concepts.) The simplified data model for your integration will look something like this: ```text ┌───────────────────┐ ┌─────────┐ │ Project Device 01 │ -> │ Project │ ┌───────────┐ ┌──────────────┐ └───────────────────┘ └─────────┘ │ Oauth App │ -> │ Device Model │ ──────────⭥ └───────────┘ └──────────────┘ ┌───────────────────┐ ┌─────────┐ │ Project Device 02 │ -> │ Project │ └───────────────────┘ └─────────┘ ``` ## OAuth Apps Your integration is defined by an OAuth App, an entity registered with our backend that allows your devices to authorize themselves with Frame.io using [OAuth 2](https://oauth.net/2/). Your OAuth App defines the authorization strategy for your entire integration. Every device your users connect to Frame.io will authorize through the same OAuth App (though integrators with multiple device lines may want one OAuth App for each). For C2C integrations, we use a specialized OAuth flow designed specifically for devices with limited UI capabilities. ### C2C Device Authentication The C2C API is designed for devices with limited UI capabilities. These devices allow a user to connect them to Frame.io by displaying a 6-digit code, which the user then inputs on the Frame.io website using their own browser. Devices are issued a `client_secret` that must be supplied to our backend to receive a 6-digit authorization code. This streamlined approach ensures a consistent and secure authentication experience across all C2C integrations. ## Device Models The device model configures how your device behaves when interacting with the C2C backend, including which features it supports. The following settings are configured by your device model: The category of asset your device produces. May be "video," "audio," or "data." Note that "video" includes video files that are muxed with audio. The name of your integration as it should appear in any uploaded asset's path. C2C only allows uploading assets to specific root filepaths, but below that requirement your device can be configured to upload assets to a dynamically calculated filepath based on the asset's supplied metadata. What metadata will be required when you upload an asset to Frame.io, most notably to support the tokenized file path. Whether the integration will use low-latency sockets for communicating its current status, or higher-latency REST calls. The features your device supports can change across firmware versions. To enable backwards compatibility and a clean user experience — the configuration for your device is dynamically selected based on the detected firmware version. In the near future, an integration will be able to have more than one DeviceModel. Which Device model is used will be determined by comparing the firmware version of the device to the minimum firmware version requirement of a specific device model. ## Project Devices and Identification The `ProjectDevice` represents each physical instance of a device connected to Frame.io. A `ProjectDevice` identifies itself using a unique identification value called `client_id`. This value should be something guaranteed not to be shared between two devices. It can be the serial number of a device or a random string that the device generated once and saves. The `client_id` should NOT be a value your device does not own, like the MAC address of a computer. Our backend keeps track of each project device and saves information about it, such as its current firmware version. Each `ProjectDevice` will have a specific Frame.io `Project` associated with it and an `OauthAuthorization` granting the device access to the project and a set of scopes detailing what a device is allowed to do. For more on what scopes are available, see the detailed guides on implementing authentication and authorization. The `ProjectDevice` is what gets returned by the `/me` endpoint. A `Device` can only be actively linked to a single `ProjectDevice` at a time, and therefore to a single `Project` at a time. ## Firmware Versions Your device must supply its current firmware version with the `x-client-version` HTTP header whenever you call an endpoint at `https://api.frame.io`. Later API guides will include this header in each example. In some instances, our backend must sort multiple firmware versions, and to support this, we require that values MUST be a valid [semantic version](https://semver.org/). These include values like `0.1.2`, `2.1.3-preview.01`, and `2.1.3-preview.01+build_19770504.01`, among others. An error will be returned if firmware version values are not valid semantic versions. We understand that not all integrations track their firmware using semantic versioning, and in such cases, we ask that you keep track of a semantic version to supply our backend for each internal version you create. By supplying the header, different releases of your firmware can support different (and sometimes conflicting) features within Frame.io. The firmware version is only handled by calls to https://api.frame.io, when making calls to https://applications.frame.io, the header has no effect. The `x-client-version` is now a required HTTP header, and will be enforced by Frame's servers. ## Next Steps It's time to make some API calls! Let's learn how to authenticate and authorize with C2C. Follow the [setup guide](./implementing-c2c-setting-up) to get started. # How to: Setting up ## Introduction Before implementing your Camera to Cloud device, let's ensure you have everything needed for success. ## Register as a Developer You'll need a `client_secret` for your device to follow the implementation guides. If you haven't already, review our [getting started guide](./getting-started-with-cloud-device-integrations) for information on registering as a C2C developer. Our team will provide the credentials necessary for API interaction. ## Tools for Following Implementation Guides While not strictly required, having these tools available will help you follow along with our tutorials and test API interactions directly. ### cURL These tutorials demonstrate Frame.io API requests using `curl`. This widely-used library provides an excellent command-line interface for making HTTP requests. When implementing your device, you'll need to replicate these HTTP calls in your preferred programming language. Using `curl` in these examples allows you to test API interactions by simply copying commands into your terminal. To verify `curl` installation on your system, enter this command in your terminal: ```shell curl --version ``` You should see output similar to: ```text curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0 Release-Date: 2019-03-27 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets ``` If not installed, you can find installers for most operating systems [here](https://curl.se/download.html). MacOS or Linux users can install via [Homebrew](https://brew.sh/): ```shell brew install curl ``` ### Python We'll use Python to format JSON response payloads by piping `curl` results through: ```shell curl https://api.frame.io/health | python -m json.tool ``` To check for Python installation: ```shell python --version ``` Expected output: ```text Python 2.7.16 ``` If not installed, you can [download Python here](https://www.python.org/downloads/). Python 2.6+ or Python 3.x will work for these examples. While Python isn't required, it helps make the responses more readable. Alternatively, tools like [jq](https://stedolan.github.io/jq/) provide similar functionality. ## Reference Implementation Your developer package includes a Python reference implementation with an example CLI application for uploading media to Frame.io as a C2C Connection. After working through each section of these guides, you may find it helpful to examine the reference implementation to see the concepts applied in working code. ## Next Steps We encourage you to contact our team if you haven't already, then continue to the [authentication and authorization guide](./implementing-c2c-authentication-and-authorization). We look forward to supporting your implementation journey. # How to: Authorize ## Introduction This guide demonstrates the authentication and authorization process for Camera to Cloud (C2C) devices on a Frame.io project. We'll explore both the standard manual code entry method and the enhanced QR code pairing approach for optimal user experience. ## What Will I Need? Please review the [Before We Start Implementing](./implementing-c2c-setting-up) guide if you haven't already. You should have received a `client_secret` from our team to identify your integration. If not, please consult [this introduction](./getting-started-with-cloud-device-integrations) to the C2C ecosystem and contact our team. ### Prerequisites for URL & QR Code Pairing To implement URL & QR code pairing, ensure you meet these requirements: * **Device Compatibility**: Verify your device supports URL/QR code generation during the pairing process. ## Walking Through the Auth Flow To understand the authorization flow from a user perspective, please reference these resources: * [Support Article](https://help.frame.io/en/collections/8960335-frame-io-c2c) for adding new devices. * [Training video](https://help.frame.io/en/articles/5091124-camera-to-cloud-training-series) on authorizing a Teradek Cube. This authorization process minimizes implementation requirements. You won't need to: * Redirect to web browsers (unless using URL Code Pairing) * Handle Frame.io user authentication * Present account/project selection interfaces * Develop complex UI components beyond basic information displays ### Enhancing the User Experience with URL Code Pairing Modern users expect efficient device interactions. While the current manual pairing process functions adequately, it can be optimized. By implementing URL & QR code pairing—similar to streaming services like Netflix or Disney+—we can significantly streamline the process, minimize input errors, and reduce pairing time. ## Device Identification (client_id) Each physical device requires a unique identifier for connection tracking within a user's project. For devices, this identifier is the `client_id`, which is essential during authorization. When implementing, consider appropriate identifier sources such as device serial numbers, UUIDs, or other unique strings. If you are integrating on an Apple device, we recommend using a unique persistent UUID that is consistent across device reboots. Exercise caution regarding personally identifiable information. User email addresses are not appropriate `client_id` values. Additionally, ensure you control the identifier. Device MAC addresses are unsuitable as they aren't owned by your software and may constitute personally identifiable information. If you need guidance on selecting an appropriate identifier, our team can assist in determining a suitable value that simplifies integration. ## Step 1: Requesting a Device Code To begin implementation, request a device code through the `/v2/auth/device/code` endpoint: ### Traditional Pairing Method ``` curl -X POST https://api.frame.io/v2/auth/device/code \ --form 'client_id=[client_id]' \ --form 'client_secret=[client_secret]' \ --form 'scope=asset_create offline' \ | python -m json.tool ``` ### Enabling URL Code Pairing For URL code pairing, modify the API call with additional headers: ``` curl -X POST https://api.frame.io/v2/auth/device/code \ --header "x-client-version: 2.0.0" \ --header "x-client-platypus-enabled: true" \ # New header to enable URL pairing --form 'client_id=[client_id]' \ --form 'client_secret=[client_secret]' \ --form 'scope=asset_create offline' \ | python -m json.tool ``` **Note:** These authentication endpoints accept form data exclusively, not JSON. Post-authentication, other endpoints will accept JSON payloads, but authentication endpoints will reject JSON requests. #### Payload Parameters * **client_id**: The unique identifier for your physical device. This must be guaranteed unique, such as a serial number or UUID. * **client_secret**: Provided by Frame.io support to identify your device model. This confidential value should remain protected from users and encrypted when stored. * **scope**: The requested permissions, separated by spaces. Devices may request: * `asset_create`: Enables asset creation and uploading. * `offline`: Permits authorization refreshing via refresh token. Without this scope, users would need to re-authorize their device every 8 hours as authorization tokens expire. In practical implementations, devices typically request both scopes. ### Understanding the API Response The request generates a response similar to: #### Traditional Pairing Response ``` { "device_code": "[device_code]", "expires_in": 120, "interval": 5, "name": "MyDevice-[client_id]", "user_code": "573131" } ``` #### URL Pairing Response ``` { "device_code": "[device_code]", "expires_in": 120, "interval": 5, "name": "MyDevice-[client_id]", "user_code": "573131", "verification_uri": "https://next.frame.io/pair", "verification_uri_complete": "https://next.frame.io/pair/573131" } ``` #### Response Breakdown * **device_code**: This internal identifier should remain hidden from users and identifies the authorization request during polling. * **expires_in**: The code's validity period in seconds. * **interval**: The recommended polling interval in seconds. * **name**: The connecting device's identifier. * **user_code**: The six-digit code for manual entry into Frame.io for device pairing. * **verification_uri**: The base URL for manual entry if QR scanning is unavailable. * **verification_uri_complete**: The full URL containing the pairing code, intended for hyperlinking within a mobile app or QR code generation to streamline user navigation to the pairing interface. ### Displaying the QR Code to the User Using the `verification_uri_complete`, generate and display a QR code on the device screen for the user to scan, facilitating efficient pairing. #### Example: Device Screen with QR Code Displayed ![Example device QR code pairing screen](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/193d938af906dbcbc9699953e9da5ddbeeee8cd75fdfabf0661127c2b528cdb4/docs/pages/c2c/static/images/qr_code_example.png) Always provide fallback options: display the `user_code` and `verification_uri` for manual entry when QR scanning isn't possible. Alternatively, consider displaying the `verification_uri` as a static QR code for mobile scanning. For mobile app integrations, include the `verification_uri_complete` as a tappable hyperlink since users cannot scan QR codes from the device running the app. ## Step 2: Polling for User Authorization After providing the pairing code or URL code, verify user entry with this request: ``` curl -X POST https://api.frame.io/v2/auth/token \ --form 'client_id=[client_id]' \ --form 'device_code=[device_code]' \ --form 'grant_type=urn:ietf:params:oauth:grant-type:device_code' \ | python -m json.tool ``` ### Payload Parameters * **client_id**: The same identifier used in Step 1. * **device_code**: The `device_code` value returned previously. * **grant_type**: The OAuth grant type identifier, consistently `urn:ietf:params:oauth:grant-type:device_code` for this implementation. Initial polling attempts typically return: ``` { "error": "authorization_pending" } ``` This non-fatal error indicates the user hasn't completed code entry. Continue polling until completion. > **Note for iOS app devices:** If the user switches to the Frame.io iOS app to enter the pairing code, your app may move to the background. When your app becomes active again, such as in `applicationDidBecomeActive`, resume polling so the authorization flow can continue without requiring the user to restart pairing. If you receive: ``` { "error": "expired_token" } ``` The code expired before user entry. Generate a new code/QR code via Step 1, present it to the user, and resume polling. Successful authorization produces: ``` { "access_token": "[access_token]", "expires_in": 28800, "refresh_token": "[refresh_token]", "token_type": "bearer" } ``` Congratulations on successfully authorizing your Camera to Cloud device! Let's examine this response: * **access_token**: Your authentication credential for Frame.io backend access, required in headers for future API requests. * **expires_in**: The access token validity period in seconds, after which refreshing is necessary. * **refresh_token**: Used for access token management, primarily for refreshing authorization but also applicable for revocation. * **token_type**: Consistently `bearer` for C2C API implementations, requiring no action. ## Putting the Steps Together Now let's implement these API calls in Python-like pseudocode, handling potential device code expiration: ```python title="Python" def authorize_with_frame(): """ Handles authorizing our device with Frame.io. """ # Our client ID can be a serial number, UUID, or some other unique string. client_id = THIS_DEVICE.get_serial_number() while True: # Make the call to Frame.io to get our device codes. pairing_codes = c2c.get_device_codes(client_id) # We need to keep track of how long we have been polling for polling_started = datetime.now() # Now we are going to poll for authorization until the user enters the code. while True: # Re-write this output each time we poll. Note: This message will only update once # per `interval` (e.g., 5 seconds), so if a smooth countdown is desired, that will # need a different implementation. print( f"\rPAIRING CODE: {pairing_codes.user_code}, " f"EXPIRES IN: {pairing_codes.expires_in - (datetime.now() - polling_started).seconds} seconds" ) # Wait for `interval` before polling each time. sleep(pairing_codes.interval) # Make a call to Frame.io to see if the user has entered the code and authorized # the device. authorization, error = c2c.poll_for_authorization( client_id, pairing_codes.device_code ) if error and error.message == "authorization_pending": # If the authorization is pending, try again. continue elif error and error.message == "expired_token": # If the pairing codes have expired, break to generate new codes. break elif error: # If there was some other error, raise it. raise error else: # If there was no error, we have our authorization! return authorization # If we get here, our pairing codes expired. Let's try again. print("\nPairing code expired. Generating a new one...") ``` **Note:** The outer loop handles cases where pairing codes expire and new codes are required. As a final step, retrieve and display project information from Frame.io to confirm successful pairing to the intended project. We'll cover this in the next tutorial. ## Creating and Displaying QR Codes for Pairing When implementing URL/QR code pairing, you'll need to generate a QR code from the `verification_uri_complete` value in the response. Here are examples using popular libraries in different programming languages: ### Python Example using qrcode ```python title="Python" import qrcode from PIL import Image import io def generate_qr_code(verification_uri_complete, size=250): """ Generate a QR code from the verification_uri_complete URL. Args: verification_uri_complete (str): The complete verification URI returned by Frame.io size (int, optional): Size of the QR code in pixels. Defaults to 250. Returns: PIL.Image: QR code image that can be displayed or saved """ qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(verification_uri_complete) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") # Resize the image if needed img = img.resize((size, size)) return img # Example usage in authorization flow def display_qr_for_pairing(pairing_codes): """ Generate and display QR code along with manual pairing instructions. """ if hasattr(pairing_codes, 'verification_uri_complete'): # Generate QR code from the verification URI qr_img = generate_qr_code(pairing_codes.verification_uri_complete) # Display the QR code on screen # For GUI applications like Tkinter, PyQt, etc. # display_image(qr_img) # For headless devices or testing, save to file qr_img.save("frame_io_pairing_qr.png") print(f"Scan the QR code or visit: {pairing_codes.verification_uri}") print(f"Manual code: {pairing_codes.user_code}") else: # Fallback for devices that received traditional pairing response print(f"Enter code on Frame.io: {pairing_codes.user_code}") ``` ### JavaScript Example (Web or Electron) ```javascript import QRCode from 'qrcode'; /** * Generate and display a QR code from the verification URI * @param {string} verificationUriComplete - The complete verification URI from Frame.io * @param {string} elementId - ID of the HTML element to display the QR code in */ function displayQRCode(verificationUriComplete, elementId = 'qrcode-container') { const element = document.getElementById(elementId); if (!element) { console.error(`Element with ID ${elementId} not found`); return; } // Clear any existing content element.innerHTML = ''; // Generate QR code QRCode.toCanvas(element, verificationUriComplete, { width: 250 }, function(error) { if (error) { console.error('Error generating QR code:', error); // Fallback to displaying the URL as a link element.innerHTML = `Click here to pair`; } }); // Also display manual pairing information const manualInfoDiv = document.createElement('div'); manualInfoDiv.innerHTML = `

Scan the QR code or click here to pair your device.

Manual code: ${userCode}

`; element.parentNode.appendChild(manualInfoDiv); } // Example usage in authorization flow async function requestDeviceCode() { try { const response = await fetch('https://api.frame.io/v2/auth/device/code', { method: 'POST', headers: { 'x-client-version': '2.0.0', 'x-client-platypus-enabled': 'true' }, body: new URLSearchParams({ 'client_id': YOUR_CLIENT_ID, 'client_secret': YOUR_CLIENT_SECRET, 'scope': 'asset_create offline' }) }); const data = await response.json(); if (data.verification_uri_complete) { displayQRCode(data.verification_uri_complete); window.userCode = data.user_code; // Store for display purposes } else { // Fallback for traditional pairing displayManualPairingCode(data.user_code); } // Begin polling for authorization beginPollingForAuthorization(data.device_code, data.interval); } catch (error) { console.error('Error requesting device code:', error); } } ``` ### Android Example (Java) ```java import android.graphics.Bitmap; import android.widget.ImageView; import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.journeyapps.barcodescanner.BarcodeEncoder; public void generateAndDisplayQRCode(String verificationUriComplete, ImageView qrCodeImageView) { try { MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); BitMatrix bitMatrix = multiFormatWriter.encode(verificationUriComplete, BarcodeFormat.QR_CODE, 250, 250); BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix); // Display in ImageView qrCodeImageView.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); // Fallback to displaying the URL as text } } ``` ### iOS Example (Swift) ```swift import UIKit import CoreImage func generateQRCode(from string: String) -> UIImage? { let data = string.data(using: String.Encoding.utf8) if let filter = CIFilter(name: "CIQRCodeGenerator") { filter.setValue(data, forKey: "inputMessage") filter.setValue("H", forKey: "inputCorrectionLevel") if let outputImage = filter.outputImage { // Scale the image let transform = CGAffineTransform(scaleX: 10, y: 10) let scaledImage = outputImage.transformed(by: transform) // Convert to UIImage let context = CIContext() if let cgImage = context.createCGImage(scaledImage, from: scaledImage.extent) { return UIImage(cgImage: cgImage) } } } return nil } // Usage in your view controller func displayPairingQRCode(verificationUriComplete: String) { if let qrCodeImage = generateQRCode(from: verificationUriComplete) { qrCodeImageView.image = qrCodeImage // Also show manual pairing information pairingInstructionsLabel.text = "Scan the QR code or enter code manually" pairingCodeLabel.text = userCode } else { // Fallback to manual code display pairingInstructionsLabel.text = "Enter this code on Frame.io:" pairingCodeLabel.text = userCode } } ``` ## Best Practices for QR Code Display When implementing QR code pairing, consider these guidelines for the best user experience: 1. **Optimal Size**: Display QR codes at least 200-250 pixels square for reliable scanning. 2. **Contrast**: Ensure high contrast between QR code and background (black on white is ideal). 3. **Error Correction**: Use moderate error correction levels (L or M) to balance code density and reliability. 4. **Clear Instructions**: Provide clear guidance on how to scan the code, such as "Scan this code with your smartphone camera to pair your device." 5. **Multiple Options**: Always provide the manual pairing code alongside the QR code as a fallback: ``` Scan to pair: [QR CODE] Or enter code manually: 573131 ``` 6. **Hyperlink for Mobile Apps**: If your integration is a mobile application, include the `verification_uri_complete` as a tappable link since users cannot scan a QR code from the same device. 7. **Testing**: Test your QR codes with various devices and lighting conditions to ensure reliable scanning. ![Example QR Code Display](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/193d938af906dbcbc9699953e9da5ddbeeee8cd75fdfabf0661127c2b528cdb4/docs/pages/c2c/static/images/qr_code_example.png) ## Troubleshooting If you encounter issues, consult these common scenarios and solutions: * **"Connect Device" Button Not Visible**: When accessing the C2C management panel, this could indicate: * **Insufficient Permissions**: If you see a permissions message, contact your account manager to adjust permissions or assign an appropriate role. * **Existing Device Connection**: After connecting one device, the primary "Add New Device" button is replaced by a three-dot menu in the upper-right corner of the C2C Connections panel. * **Invalid Client Error**: An `invalid_client` response indicates device information mismatch, typically due to an incorrect `client_secret`. * **Bad Request Error**: A `bad_request` response indicates malformed request data. Verify field names and ensure all required fields are included. If your issue isn't addressed here, please share your experience so we can enhance this troubleshooting section. ## Next Steps We encourage you to contact our team and proceed to the [authorization management guide](./how-to-authorization-management). We look forward to your feedback! # How to: Manage Authorization ## Overview This guide outlines the procedures for managing device authorization tokens in Frame.io, including token refresh, revocation, and secure storage practices. ## Prerequisites Please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide to ensure proper configuration. Essential components required: - A valid `client_secret` issued by Frame.io - Your assigned `client_id` as detailed in the [authentication and authorization guide](./implementing-c2c-authentication-and-authorization) - Valid `access_token` and `refresh_token` credentials ## Understanding Authorization Tokens Our previous guide on [device authentication](./implementing-c2c-authentication-and-authorization) outlined the process of obtaining initial authorization tokens through user authentication. Access tokens maintain functionality for approximately 8 hours. To eliminate the need for frequent device re-pairing, we implement the `offline` scope to obtain a refresh token alongside the authorization. This refresh token enables the generation of new access tokens upon expiration. Refresh tokens remain valid for 14 days. This deliberate limitation on access token duration enhances security by minimizing potential vulnerabilities from compromised tokens. Note that if authorization is not renewed before the refresh token expires, user re-authentication will be necessary. ## Access Token Renewal Process Upon access token expiration, API requests will receive this response: ```json { "code": 401, "errors": [ { "code": 401, "detail": "You are not allowed to access that resource", "status": 401, "title": "Not Authorized" } ], "message": "Not Authorized" } ``` Execute the following command to obtain a new token: ```shell curl -X POST https://api.frame.io/v2/auth/token \ --header 'x-client-version: 2.0.0' \ --form 'client_id=[client_id]' \ --form 'client_secret=[client_secret]' \ --form 'grant_type=refresh_token' \ --form 'refresh_token=[refresh_token]' \ | python -m json.tool ``` Detailed documentation for `/v2/auth/token` is available [here](/camera-to-cloud/api-reference/authentication/auth-device-token) This implementation requires multiple authentication factors to enhance security. An unauthorized party would need to obtain both the `refresh_token` and `client_secret` to successfully impersonate your integration. A successful renewal generates this response: ```json { "access_token": "[access_token]", "expires_in": 28800, "refresh_token": "[refresh_token]", "token_type": "bearer" } ``` Upon successful token refresh, your previous credentials become invalid. Ensure proper storage of the new authorization tokens. Attempting to reuse an expired refresh token results in: ```json { "error": "invalid_request" } ``` This indicates the token has been previously processed and is no longer valid. Receipt of a `401 Not Authorized` response during token refresh indicates credential invalidation, necessitating a new authorization process. ## Handling Failed Refresh Responses Due to the single-use nature of `refresh_token` values, failing to capture the refresh response—whether due to network interruption or system shutdown—necessitates reinitiating the complete authentication/authorization sequence. This security protocol, while potentially inconvenient, is essential for maintaining system integrity. ## Token Revocation Process Circumstances may require termination of Frame.io access, such as project completion or application reset. Implement proper revocation procedures when discontinuing current authorization. Execute the following command to revoke authorization: Following revocation, you must reinitiate the authentication & authorization process as outlined in the [authentication and authorization guide](./implementing-c2c-authentication-and-authorization). ```shell curl -X POST https://api.frame.io/v2/auth/revoke \ --include \ --header 'x-client-version: 2.0.0' \ --form 'client_id=[client_id]' \ --form 'client_secret=[client_secret]' \ --form 'token=[refresh_token]' ``` Complete documentation for `/v2/auth/revoke` is available [here](/camera-to-cloud/api-reference/authentication/auth-device-revoke-token) The system returns headers without a payload. Success is indicated by a `200` status code: ```text HTTP/2 200 ... ``` Post-revocation, Frame.io operations requiring `access_token` authentication will return `Not Authorized`. Access restoration requires device re-pairing to the project. ## Token Storage Implementation Maintaining persistent authorization across system restarts requires secure token storage. Adhere to these essential guidelines: **Implement User Access Controls:** Restrict token visibility and access exclusively to application processes. **Enable Storage Encryption:** Implement encryption for stored tokens, including `client_secret` and authorization credentials. Never maintain authorization keys in plaintext format. **Maintain Credential Separation:** While our demonstration Python application consolidates storage, production environments should separate authorization tokens from `client_secret`. Consider these factors: - `client_secret` and `client_id` represent permanent device credentials—loss results in permanent device failure - Authorization tokens undergo regular updates throughout device operation - Segregated storage ensures that token storage corruption only requires device re-pairing rather than complete authentication reset While SQLite provides optimal token storage capabilities, at minimum implement separate storage for authorization data and core credentials. ## Next Steps We welcome your progress and invite you to proceed to the [connection status and heartbeats guide](./how-to-heartbeats-connection-info-and-status). Please contact our team with any questions or concerns. # How to: Manage Status and State ## Introduction This guide explains how to manage device status and maintain synchronization with Frame.io. We use a websocket protocol that enables real-time communication between Frame.io and your device. If you're unfamiliar with websockets, this guide will help you understand their implementation for C2C integrations. Websockets allow Frame.io to push messages to your device and, by maintaining a persistent connection, provide a more efficient communication channel than traditional HTTP requests. In this guide, we'll cover: * Opening a socket connection to indicate your device is 'online' * Retrieving information about your device connection * Verifying Frame.io backend availability ## Prerequisites If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). Be aware that tokens expire after 8 hours, so you may need to refresh your token or go through the authorization process again. For this guide's websocket connection examples, we recommend using [websocat](https://github.com/vi/websocat), a CLI tool with comprehensive installation instructions for various operating systems. Install with: `brew install websocat` ## Retrieving Connection Information After any new authorization or token refresh, your device should immediately query the `identity` endpoint. This provides crucial information about your connection: ```shell curl -X GET https://api.frame.io/v2/devices/me \ --header 'Authorization: Bearer [access_token]' \ --header 'x-client-version: 2.0.0' \ | python -m json.tool ``` The response will resemble this (with some data abbreviated): ``` { "_type": "project_device", "id": "a7e95254-8cd6-4d59-b54d-28c58570a8de", "asset_type": "video", "authorization": { "_type": "project_device_authorization", "creator": { "_type": "user", "id": "e7e96254-8bd6-4d59-b54d-28c58570a8de", "name": "Harry Potter" }, "expires_at": null, "id": "7b2b68e5-788d-497c-8597-f9362cb1a75e", ... "project_device_id": "14856308-46e0-4d7d-8438-320262eec74e", "scopes": { ... "asset_create": true, ... "id": "0fe0accb-447f-44f6-b2af-177d913b3a29", "offline": true, ... } }, ... "name": "Frameio-BPEAKE-TEST-DEVICE", "project": { "_type": "project", "id": "2ad59fe6-77b6-4fbc-a9d2-3dd0413ed4a3", "name": "Testbed" }, "project_id": "2ad59fe6-77b6-4fbc-a9d2-3dd0413ed4a3", "status": "online", ... } ``` This endpoint helps verify connection details. Your device should display this information to users: * `project.name` - The connected project name * `authorization.creator.name` - The user who authorized the device * `authorization.expires_at` (optional) - Connection expiration time, if set * `status` (optional) - Device status, which may be: * `online` - Device is online and paired * `offline` - Device hasn't communicated in over 5 minutes (querying this endpoint will change status to `online`) * `paused` - Device has been temporarily disabled in the Frame.io C2C Connections panel Since expiration and pause status can change at any time within Frame.io, consider polling this information periodically if displaying it to users. We recommend limiting polling frequency to no more than once every 60 seconds. Note the `id` value as you'll need it for websocket connection in the next section ## Establishing the Websocket Connection The C2C Connections panel in Frame.io displays each device's connection status. When a device has an active socket connection, it shows as `online` with a green indicator in the card's top-left corner. Devices without active connections appear `offline` with a grayed-out display. The server automatically terminates socket connections after 60 seconds without a "heartbeat" message. While this interval is sufficient, we recommend sending heartbeats every 15 seconds for reliability. If the connection unexpectedly closes, simply reestablish it. Connecting to Frame.io's websocket involves two steps: 1. Establishing the TCP/IP handshake and opening the physical websocket connection 2. Joining the device's specific channel to identify your device to our backend To open the websocket connection: ```shell websocat -n "wss://api.frame.io/devices/websocket?Authorization=Bearer ACCESS_TOKEN" ``` Unlike standard API endpoints where the access token goes in the `Authorization` header, for websocket connections it's included as a URL-encoded query parameter. Note that you must still include `Bearer ` (with a space) before your access token. In URL-encoded strings, spaces appear as `%20`, so this formatting is expected. A successful connection returns a `101` status code, indicating protocol switching to `wss`. Your websocket library may handle this automatically. An expired token will produce a `403` response. Next, join your device's channel by sending this JSON message, using the `id` from your connection information: ```json {"topic":"devices:YOUR_DEVICE_ID", "event":"phx_join", "payload":"", "ref":"channel_connect"} ``` You'll receive a confirmation: ```json {"event":"phx_reply","payload":{"response":{},"status":"ok"},"ref":"channel_connect","topic":"devices:YOUR_DEVICE_ID"} ``` The `ref` field correlates responses with their initiating events. Since event ordering isn't guaranteed, this identifier helps pair server responses with the triggering events. Frame.io doesn't use this field for incoming events—it's solely for client reference. The `payload` field must always be present but can often be an empty string (we'll specify when a payload requires specific content). Check the C2C dashboard—your device should now appear online! We recommend implementing a background process to maintain this connection: ```python title="Python" def heartbeat_task(): """ Task that emits heartbeats every 15 seconds. """ while True: c2c.emit_socket_heartbeat() sleep(15) ``` The heartbeat message format: ```json {"topic":"phoenix", "event":"heartbeat", "payload":"", "ref":"heartbeat"} ``` Which receives this response: ```json {"event":"phx_reply","payload":{"response":{},"status":"ok"},"ref":"heartbeat","topic":"phoenix"} ``` With an active socket connection and channel subscription, your device will show as online in Frame.io's C2C Connections panel. When the connection terminates, it will appear offline. ## Displaying Device Status Rather than displaying the raw status values (`online`, `offline`, `paused`), we recommend translating them into more meaningful user-facing indicators: * **Paused**: true/false - Show `true` if the status is `paused`, otherwise `false` * **Connected**: true/false - Indicates whether the device can reach the Frame.io backend (see backend connection testing below) ## Managing the Paused Status While displaying pause status is optional, understanding its function is important. The pause feature is designed to temporarily block sensitive content from being uploaded. It doesn't block network traffic but prevents specific media from reaching Frame.io. This is useful in situations like filming scenes containing sensitive material where immediate cloud storage might be inappropriate. Pausing is controlled through the Frame.io interface, not through your integration. When a device is paused, only media created during the paused period is blocked—previously captured media remains eligible for upload. Important considerations: * Don't rely solely on the identity endpoint to validate upload eligibility—our backend handles this automatically * Socket events will notify you of status changes with `event: "status_updated"` and `payload: "paused"` or `"resumed"` * Although events can help manage status, they may be missed or delivered out of order * Receiving a `409` error during upload doesn't necessarily mean the device is currently paused—it may indicate the media was created during a previous pause window * If displaying a paused status, verify its accuracy by periodically checking the connection info ## Verifying Backend Connectivity To check Frame.io backend availability, use this endpoint: ```shell curl -X GET https://api.frame.io/health \ | python -m json.tool ``` This endpoint requires no authorization. A successful response indicates connectivity: ```json { "ok": true } ``` This health check is particularly valuable as it confirms connectivity specifically with Frame.io, rather than general network availability. There may be scenarios where your network functions but Frame.io is unreachable due to service issues or routing problems. ## Next Steps We encourage you to contact our team with any questions and proceed to the [basic upload guide](/camera-to-cloud/how-to-basic-upload). We look forward to supporting your integration progress. For more information on managing device authorization, see the [authorization management guide](./how-to-authorization-management). # How to: Upload (Basic) ## Introduction We've now reached an exciting milestone in our integration journey: uploading assets to Frame.io. This guide will walk you through the basic upload process. ## Prerequisites If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). For this guide, we'll use a sample test asset available at [this Frame.io link](https://f.io/Rq1q5CzB). Download this file to follow along with our examples, as it will allow you to match the values in our sample commands. ## Step 1: Creating an Asset Let's upload [our sample file](https://f.io/Rq1q5CzB), which we'll assume was created 10 seconds ago. First, we need to create an asset reference in Frame.io: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": 10 } __JSON__ } | python -m json.tool ``` Documentation for `/v2/devices/assets` can be [found here](/camera-to-cloud/api-reference/device-asset-create). While the legacy endpoint `/v2/assets` still functions, we recommend new integrations use `/v2/devices/assets`. Unlike the authentication endpoints we've used previously, this endpoint accepts `application/json` encoding rather than `form/multipart`. It also accepts `application/x-www-form-urlencoded`. This example uses [heredoc](https://linuxize.com/post/bash-heredoc/) to provide the JSON payload to `curl` in a readable multi-line format. The `--data-binary @-` parameter instructs `curl` to read raw data from stdin. Learn more about this approach [here](https://unix.stackexchange.com/questions/88490/how-do-you-use-output-redirection-in-combination-with-here-documents-and-cat). Let's examine the JSON payload parameters: `name`: The displayed asset name in Frame.io. This doesn't need to match the filename on disk. `filetype`: The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) of the file. Most programming languages provide utilities for MIME type detection (examples: [Go](https://golangcode.com/get-the-content-type-of-file/), [Python](https://docs.python.org/3/library/mimetypes.html)). `filesize`: The file size in bytes. Our sample file is approximately 21.1 MB. `offset`: The number of seconds since the file was created. Defaults to 0 if omitted. This parameter must be provided as it helps determine whether files should be rejected due to device pausing. We'll cover this in more detail in the [advanced uploading guide](./how-to-advanced-uploads). The response will look similar to this (with some fields omitted): ```json { "_type": "file", ... "id": "9a280f99-8f4f-46b0-a4b4-ec4c2f95138e", ... "upload_urls": [ "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path]", "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path]" ], ... } ``` At this point, we've only informed Frame.io of our intention to upload a file; no actual file data has been transferred. If you check your device's folder in your project, you'll see a placeholder asset in the "uploading" state. The `upload_urls` field contains the URLs where we'll upload our file chunks. For our test file, we should receive two upload URLs. ## Step 2: Splitting the File into Chunks The response contained multiple upload URLs. When uploading to Frame.io, we divide files into chunks and upload them separately, which provides several benefits: * **Improved reliability**: If one chunk fails, we don't need to restart the entire upload * **Faster uploads**: We can upload multiple chunks in parallel (covered in the [advanced uploads guide](./how-to-advanced-uploads)) To determine the optimal chunk size, use this formula: ```python title="Python" # We use math.ceil() to ensure we get the upper bound in the division chunk_size = math.ceil(float(file.size) / float(len(response.upload_urls))) ``` For our sample file, the calculation is: ```python title="Python" math.ceil(21136250 / 2) # 10568125 ``` This means each chunk should be 10,568,125 bytes. Chunk sizes typically target around 25MB, with exact calculations covered in the [advanced uploads guide](./how-to-advanced-uploads). Since file sizes rarely divide evenly, the final chunk may be smaller than the calculated `chunk_size`. Your implementation should account for this when reading file chunks. For this demonstration, we'll use the [head](https://man7.org/linux/man-pages/man1/head.1.html) and [tail](https://man7.org/linux/man-pages/man1/tail.1.html) commands to extract the file chunks. ## Step 3: Uploading the Chunks To upload the first chunk: ```shell head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @- ``` The `--data-binary @-` parameter instructs `curl` to use raw data from stdin, which comes from the `head` command. The request requires these headers: `content-type`: The same MIME type value used when creating the asset `x-amz-acl`: For AWS S3 permissions, always set to `private` A successful upload returns: ```text HTTP/1.1 100 Continue HTTP/1.1 200 OK ... ``` Similarly, upload the second chunk: ```shell tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @- ``` After both uploads complete, your asset should be playable in Frame.io! 🎉 When uploading chunks, you're sending data directly to AWS S3, not to Frame.io's API. The error responses will follow AWS S3 formats rather than standard Frame.io errors. We'll cover handling S3 errors in the [error handling guide](/camera-to-cloud/how-to-handle-errors). Although conceptually simpler to upload chunks sequentially, they can actually be uploaded in any order. The system will assemble them correctly regardless of upload sequence. ## Putting It All Together Here's a simplified Python-like pseudocode example for the complete upload process: ```python title="Python" file = open("~/Downloads/C2C_TEST_CLIP.mp4") mimetype = mimetypes.for_file("~/Downloads/C2C_TEST_CLIP.mp4")[0] created_at = time.ctime(file.stat.ST_CTIME) asset = c2c.asset_create( name="C2C_TEST_CLIP.mp4", filetype=mimetype, filesize=file.size, offset=datetime.now() - created_at, channel=0, ) chunk_size = math.ceil(float(file.size) / float(len(asset.upload_urls))) for chunk_url in asset.upload_urls: chunk = file.read(bytes=chunk_size) c2c.upload_chunk(chunk, chunk_url, mimetype) ``` This example demonstrates the basic flow without error handling or parallel uploads, which will be covered in the [error handling](/camera-to-cloud/how-to-handle-errors) and [advanced uploads](./how-to-advanced-uploads) guides. ## Next Steps Congratulations on successfully uploading your first asset to Frame.io! The [advanced uploads guide](./how-to-advanced-uploads) will cover more sophisticated techniques and requirements for production-ready implementations. We encourage you to contact our team with any questions and proceed to the [real-time uploads guide](./how-to-upload-realtime) to learn about uploading assets as they're being created. # How to: Upload (Real-time) ## Introduction Building on our basic upload knowledge, let's explore uploading assets in real-time as they're being created. This approach enables uploading files during recording, rendering, or streaming before their final size is known. The Real-time Uploads API allows assets to become playable in Frame.io just seconds after recording completion, significantly enhancing workflow efficiency. ## Demo Video For a quick preview of this functionality, watch our [video demonstration](https://f.io/qjwfGmTa). The demo shows a render being uploaded from Adobe Media Encoder in real-time, with the video playable in Frame.io only 5 seconds after rendering completes. ## Prerequisites If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). We'll use the same [test asset](https://f.io/Rq1q5CzB) from the basic upload guide for our examples. Familiarity with the [Basic Upload guide](./how-to-basic-upload) is recommended, as we'll build on those concepts. ## Creating a Real-time Asset Real-time uploads begin with a modified asset creation process. When creating the asset, set `is_realtime_upload` to `true` and omit the `filesize` parameter (or set it to `null`), since the final size isn't known during creation: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "is_realtime_upload": true } __JSON__ } | python -m json.tool ``` Documentation for `/v2/devices/assets` can be [found here](/camera-to-cloud/api-reference/device-asset-create). Real-time assets require a file extension. If the filename isn't known when creating the asset, you can use the `extension` field instead (format: `'.mp4'`). This approach is preferred when you plan to update the asset name later. The response for real-time assets is simplified compared to standard asset creation: ```json { "id": "{asset_id}", "name": "C2C_TEST_CLIP.mp4" } ``` Note that `upload_urls` is absent—for real-time uploads, we'll generate upload URLs on demand as the file is created. ## Requesting Upload URLs Let's request a URL for the first half of our file (10,568,125 bytes), using the `asset_id` from the previous response: ```shell { curl -X POST https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "parts": [ { "number": 1, "size": 10568125, "is_final": false } ] } __JSON__ } | python -m json.tool ``` Documentation for `/v2/devices/assets/{asset_id}/realtime_upload/parts` can be [found here](/camera-to-cloud/api-reference/device-create-realtime-upload-parts). Understanding the request parameters: * `parts`: A list of upload parts for which we need URLs. Requesting multiple URLs in a single call improves efficiency. * `number`: The sequential part number, starting at 1. Numbers can be skipped and parts uploaded in any order, but they'll be assembled sequentially. Cannot exceed 10,000 (AWS limit). * `size`: Part size in bytes. Must comply with [AWS Multi-Part upload restrictions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html). * `is_final`: Indicates whether this is the final file part. The response contains the requested upload URLs: ```json { "upload_urls": [ "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path]" ] } ``` The `upload_urls` list corresponds directly to the `parts` request order. Now upload the first chunk as in the basic upload guide: ```shell head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @- ``` Next, request a URL for the second and final part: ```shell { curl -X POST https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "asset_filesize": 21136250, "parts": [ { "number": 2, "size": 10568125, "is_final": true } ] } __JSON__ } | python -m json.tool ``` Note these important additions: * `is_final` is set to `true` for the last part, signaling that the upload will complete after this chunk * `asset_filesize` provides the total file size, which is required when any part has `is_final: true` After receiving the URL in the response: ```json { "upload_urls": [ "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path]" ] } ``` Upload the final chunk: ```shell tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @- ``` When the final part is uploaded, Frame.io begins assembling the complete file. This process includes a 60-second grace period for any remaining parts to complete. We recommend uploading the final part only after all other parts have been successfully uploaded. That's it! Navigate to Frame.io to see your successfully uploaded real-time asset. 🎉 ## Managing Asset Names If the filename isn't known during asset creation, you can use the `extension` field without a `name`: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "extension": ".mp4", "filetype": "video/mp4", "is_realtime_upload": true } __JSON__ } | python -m json.tool ``` The system will assign a default name: ```json { "id": "{asset_id}", "name": "[new file].mp4" } ``` You can update this name by including an `asset_name` field when requesting upload URLs: ```shell { curl -X POST https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "asset_name": "C2C_TEST_CLIP.mp4", "asset_filesize": 21136250, "parts": [ { "number": 2, "size": 10568125, "is_final": true } ] } __JSON__ } | python -m json.tool ``` The name will only update if the asset still has its default name; if it's been renamed in the Frame.io UI or previously updated, the request will be ignored. ## Optimizing URL Requests For efficiency, request URLs for as many parts as you currently have data available, rather than individually. This approach is particularly valuable for large files where upload speed might lag behind data generation. ## Handling Media File Headers Some media formats require headers at the beginning of the file that aren't written until the entire file is complete. This creates a challenge when the header is smaller than AWS's minimum part size of 5 MiB (5,242,880 bytes). Our recommendation: 1. Reserve the first 5,242,880 bytes of media data without uploading 2. Begin uploading parts starting with `part_number=2` 3. When the file is complete, prepend the header to the reserved data 4. Request a URL for `part_number=1` and upload this combined chunk This approach ensures your first chunk meets the minimum size requirement while preserving proper file structure. ## Scaling Part Size for Optimal Performance AWS imposes limits that affect upload strategy: - Maximum file size: 5 TiB (5,497,558,138,880 bytes) - Maximum number of parts: 10,000 - Minimum part size: 5 MiB (5,242,880 bytes) A fixed part size creates trade-offs: - Using the minimum size (5 MiB) for all 10,000 parts limits total file size to ~52.4 GB - Evenly distributing the maximum file size would require ~550 MB chunks, too large for efficient streaming of smaller files We need a formula that balances these constraints, starting with small parts for responsive uploads while ensuring we can handle very large files if needed. ### Recommended Part Size Formula Here's our suggested approach in Python: ```python title="Python" import math from typing import Callable # Constants MINIMUM_PART_SIZE = 5_242_880 MAXIMUM_PART_COUNT = 10_000 MAXIMUM_FILE_SIZE = 5_497_558_138_880 # Maximum uniform data rate that allows for 10,000 parts MAXIMUM_DATA_RATE = MAXIMUM_FILE_SIZE // MAXIMUM_PART_COUNT def part_size(part_number: int, format_bytes_per_second: int) -> int: """ Returns the payload size for a specific part number given the file's expected data rate. """ if part_number < 1: raise ValueError("part_number must be greater than 0") if part_number > 10_000: raise ValueError("part_number must be less than 10,000") # Make sure we never go above the maximum data rate or fall below the # minimum part size, even if the data rate is lower. data_rate = min(format_bytes_per_second, MAXIMUM_DATA_RATE) data_rate = max(data_rate, MINIMUM_PART_SIZE) # Calculate a scalar given our data rate. We will explain this step # futher on in the guides. scalar = -(2 * (125 * data_rate - 68_719_476_736)) / 8_334_583_375 part_size = math.floor(scalar * pow(part_number, 2)) + data_rate return part_size ``` ... where `part_number` is between `1` and `10_000`, inclusive and `format_bytes_per_second` is the expected average number of bytes your file is expected to consume per second. We'll go over how the formula was reached [further in](/camera-to-cloud/how-to-upload-realtime#showing-our-work). The `scalar` variable and calculation might be a little perplexing at first glance, but it is a mathematical tool that ensures no matter what value we use for `format_bytes_per_second`, if we feed all allowed `part_number` values from `1` to `10_0000` into the function, we will receive a set of values that totals to *exactly* our 5 TiB filesize limit — well, as exactly as possible. We [show our work](/camera-to-cloud/how-to-upload-realtime#showing-our-work) further in on how we came to this formula. By using floor rounding, we leave some bytes on the table, but ensure that regular rounding over 10,000 part does not accidentally cause us to exceed our maximum allowed filesize. At most, 10,000 bytes, or 10 KB will be left on the table this way, an acceptable tradeoff. The important characteristics of this formula are: - When uploading 10,000 parts, the total amount of data uploaded will be within 10 KB of our 5 TiB filesize limit. - Optimizes for smaller, more efficient payloads at the beginning to increase responsiveness for short and medium-length clips. - Very long clips will have reduced responsiveness between the end of a file being written and it becoming playable in frame. The tradeoff between the second and their point is mitigated by the fact that most clips will not reach the size where point three comes into play. We are trading increased responsiveness of *MOST* files for decreased responsiveness of very few. A more advanced and efficient version of our formula (that generates an anonymous `part_size_calculator` function with our static scalar and data rate precomputed and baked in) might look like this: ```python title="Python" def create_part_size_calculator(format_bytes_per_second: int) -> Callable[[int], int]: """ Returns a function that takes in a `part_number` and returns a `part_size` based on `data_rate`. """ # Make sure we never go above the maximum data rate or fall below the # minimum part size, even if the data rate is lower. data_rate = min(format_bytes_per_second, MAXIMUM_DATA_RATE) data_rate = max(data_rate, MINIMUM_PART_SIZE) static_scalar = -(2 * (125 * data_rate - 68_719_476_736)) / 8_334_583_375 def part_size_calculator(part_number: int) -> int: """Calculates size in bytes of upload for `part_number`.""" if part_number < 1: raise ValueError("part_number must be greater than 0") if part_number > 10_000: raise ValueError("part_number must be less than 10,000") return math.floor(static_scalar * pow(part_number, 2) + data_rate) return part_size_calculator ``` ### How the formula performs. Let's examine the output characteristics of the formula above over several common file types. **Example 1**: Web format For web-playable formats with a rate of ~5.3MB/s or less (most H.264/H.265/HEVC files), we will get a payload-size progression that looks like so: | Total Parts | Payload Bytes | Payload MB | Total File Bytes | Total File GB | | ----------: | ------------: | ---------: | ----------------: | -------------: | | 1 | 5,242,896 | 5.2 MB | 5,242,896 | 0.0 GB | | 1,000 | 21,575,817 | 21.6 MB | 10,695,361,357 | 10.7 GB | | 5,000 | 413,566,329 | 413.6 MB | 706,957,655,928 | 707.0 GB | | 10,000 | 1,638,536,679 | 1,638.5 MB | 5,497,558,133,921 | 5,497.6 GB | **Table columns key** - `Total Parts`: the total number of file parts uploaded to AWS. - `Payload Bytes`: the size of the AWS PUT payload when `part_number` is equal to `Total Parts`. - `Payload MB`: As `Payload Bytes`, but in megabytes. - `Total File Bytes`: the total number of bytes uploaded for the file when `Total Parts` sequential parts have been uploaded. - `Total File GB`: As `Total File Bytes`, but in GB. These values are nicely balanced for real-time uploads, especially of web-playback codecs like H.264; most will be under 10.7 GB, and therefore be completed within 1,000 parts. The payload size would never exceed 21.6 MB. If we chewed halfway through our parts, the payload size would still never exceed 413.5 MB. The upload would total 707 GB, more than enough for the vast majority of web files. It is only once we near the end of our allowed part count that the file size begins to balloon. However, it never exceeds 1.7 GB, well below the AWS limit of 5 GiB per part. **Example 2**: Prores 422 LT Prores 422 LT [has a data-rate of 102 Mbps](https://www.wolframalpha.com/input?i=-%282+%28-68%2C719%2C476%2C736+%2B+125+12%2C750%2C000%29%29%2F8%2C334%2C583%2C375) and generates a table like so: | Total Parts | Payload Bytes | Payload MB | Total File Bytes | Total File GB | | ----------: | ------------: | ---------: | ----------------: | -------------: | | 1 | 12,750,016 | 12.8 MB | 12,750,016 | 0.0 GB | | 1,000 | 28,857,758 | 28.9 MB | 18,127,308,783 | 18.1 GB | | 5,000 | 415,443,954 | 415.4 MB | 735,107,948,432 | 735.1 GB | | 10,000 | 1,623,525,817 | 1,623.5 MB | 5,497,558,133,958 | 5,497.6 GB | This table reveals useful properties compared to our web-optimized formula. Within the first 1,000 parts, we are able to upload 8 GB more of file. Larger initial payloads mean we will not need to request URLs too quickly at the beginning, making the upload more efficient for the higher data rate. Our payload size at the tail of the upload process remains large. **Example 2**: Camera raw Finally, let's try a camera RAW format that has a data rate of 280 MB/s. With data coming this fast, trying to upload in 5 MiB chunks at the beginning just doesn't make sense: | Total Parts | Payload Bytes | Payload MB | Total File Bytes | Total File GB | | ----------: | ------------: | ---------: | ----------------: | -------------: | | 1 | 280,000,008 | 280.0 MB | 280,000,008 | 0.3 GB | | 1,000 | 288,091,460 | 288.1 MB | 282,701,200,139 | 282.7 GB | | 5,000 | 482,286,516 | 482.3 MB | 1,737,245,341,542 | 1,737.2 GB | | 10,000 | 1,089,146,065 | 1,089.1 MB | 5,497,558,133,870 | 5,497.6 GB | Not only are early payloads more efficient, but we are saving over half a gig at the upper end, which will make those network calls less susceptible to adverse network events. ### Showing our work Before we pull everything together into an example uploader, let's see how we arrived at our formula. What we needed to do was come up with a formula that traded large, heavy payloads at the end of our allowed parts — which most uploads will never reach — for light, efficient payloads near the beginning, where every upload can take advantage. At the same time, we wanted to ensure that our algorithm will land in the ballpark of the 5 TiB filesize limit *right at* part number 10,000. It was time to break out some calculus. We want our graph to grow exponentially, so our formula should probably look something like: ```math n^2 ``` ... where `n` is the part number. We also want to ensure each part is, at minimum, the data rate for our formula, which we will call `r`: ```math n^2 + r ``` Now we need to find a formula which can tell us the sum of *this* formula for the first 10,000 natural numbers (1, 2, 3, ...). The sigma `Σ` symbol denotes summation. Let's add it to our formula: ```math Σxn^2 + r ``` ... and redefine `n` as the series of natural numbers between 1 and 10,000, inclusive. The equation is not very useful to us yet. It has the right intuitive shape, but if we set `n=10,000` and `r=5,242,880` like we want to, it just [spits out a result](https://www.wolframalpha.com/input?i=%CE%A3n%5E2+%2B+r+where+n+%3D+1+to+10%2C000+and+r+%3D+5%2C242%2C880): `385,812,135,000` (385 GB). Not only is the result far below our filesize limit of 5 TiB, there is no way to manipulate the formula to spit out that result. Lets give ourselves a dial to spin: ```math Σxn^2 + r ``` ... where `x` is scalar we can solve for to get 5 TiB as the result. Now we can set the equation equal to our filesize limit and solve for `x`: ```math Σxn^2 + r = 5,497,558,138,880 ``` Often, summations must be solved iteratively, as in a `for` or `while` loop. But it turns out there is a perfect formula for us: [a known way](https://www.math-only-math.com/sum-of-the-squares-of-first-n-natural-numbers.html) of cheaply computing the sum of the square for the first `n` natural numbers: ```math Σn^2 = n(n+1)(2n+1)/6 ``` Rearranging it into a polynomial makes it easier to look at: ```math Σn^2 = (2n^3 + 3n^2 + n)/6 ``` We can add our variables, `x` and `r`, to both sides: ```math Σxn^2 + r = x(2n^3 + 3n^2 + n)/6 + rn ``` And finally we set our new formula equal to 5 TiB: ```math x(2n^3 + 3n^2 + n)/6 + rn = 5,497,558,138,880 ``` Now all we need to do is solve for `x` by setting `n=10,000`, our total part count. This will give us a way to compute a static scalar for a given data rate. Rather than doing this by hand lets [plug it into Wolfram Alpha](https://www.wolframalpha.com/input?i=x%282n%5E3+%2B+3n%5E2+%2B+n%29%2F6+%2B+r+*+n+%3D+5%2C497%2C558%2C138%2C880+solve+for+x+where+n+%3D+10%2C000): ```math x = -(2 (125 r - 68719476736)) / 8334583375 ``` Now we're getting somewhere! If our data rate was the minimum part size (5 MiB), [we would get](https://www.wolframalpha.com/input?i=x%282n%5E3+%2B+3n%5E2+%2B+n%29%2F6+%2B+r+*+n+%3D+5%2C497%2C558%2C138%2C880+solve+for+x+where+n+%3D+10%2C000+and+r+%3D+5%2C242%2C880) a static scalar of: ```math 136,128,233,472 / 8,334,583,375 ``` In computerland, this represents a float64 value of `16.33293799427617`. Our formula to determine part size in this instance would be: ```math s = 16.33293799427617n^2 + 5,242,880 ``` Where `s` is our part size. We still have one more problem. In the real world, we can't have a payload with non-whole bytes. We need to round each value. We'll use Python, and round down: ```python title="Python" math.floor(16.33293799427617 * pow(part_number, 2)) + 5_242_880 ``` We have arrived at a concrete example of the original function given in this guide. ## Building a basic uploader Let's take a look at some simple python-like pseudocode for uploading a file being rendered in real time, using everything we have learned in this guide: ```python title="Python" import math from datetime import datetime, timezone from typing import Callable # The minimum size, in bytes, for a single, non-final part upload. MINIMUM_PART_SIZE = 5_242_880 # The maximum filesize in MAXIMUM_PART_COUNT = 10_000 # The maximum size, in bytes, for an AWS upload. MAXIMUM_FILE_SIZE = 5_497_558_138_880 # The data rate at which every part is an equal size, and could not # be any uniformly larger without violating the maximum total file # size if 10_000 parts were to be uploaded. it works out to # ~549.8 MB per payload. By enforcing this we actually never need # to check if a part exceeds the maximum allowed part size, as our # parts will never exceed ~549.8 MB. MAXIMUM_DATA_RATE = MAXIMUM_FILE_SIZE // MAXIMUM_PART_COUNT def create_part_size_calculator(format_bytes_per_second: int) -> Callable[[int], int]: """ Returns a function that takes in a `part_number` and returns a `part_size` based on `data_rate`. """ ... def upload_render(data_stream: DataStream, channel: int = 0) -> None: """ Uploads an asset for data_stream, which is a custom IO class that pulls remaining upload data from an internal buffer or file, depending on how well the upload is keeping pace with the render. Uploads to `channel` """ asset = c2c.asset_create( extension=data_stream.extension, filetype=data_stream.mimetpye, channel=channel, offset=datetime.now(timezone.utc) - data_stream.created_at() ) calculate_part_size = create_part_size_calculator(data_stream.data_rate()) next_part_number = 0 while True: next_payload_size = calculate_part_size(next_part_number) # Waits until one or more chunks worth of data is ready for upload. Cache # whether our data stream has completed writing the file, and the current # number of bytes we have remaining to upload at this time. available_bytes, stream_complete = data_stream.wait_for_available_data( minimum_bytes=next_payload_size ) # Build the list of parts to request based on our available data. parts = [] while available_bytes > 0: payload_size = calculate_part_size(next_part_number) if available_bytes < payload_size and not stream_complete: break payload_size = min(payload_size, available_bytes) parts.append( c2c.RealtimeUploadPart( part_number=next_part_number, part_size=payload_size, is_final=False ) ) available_bytes -= payload_size next_part_number += 1 # If our stream is done writing, mark the last part as final. if stream_complete: parts[-1].is_final = True # Create the part URLs using the C2C endpoint. response = c2c.create_realtime_parts( asset_id=asset.id, asset_name=None if not stream_complete else data_stream.filename, asset_filesize=None if not stream_complete else data_stream.size(), parts=parts ) # Upload each part to its URL. for part, part_url in zip(parts, response.upload_urls): part_data = data_stream.read(bytes=part.size) c2c.upload_chunk(part_data, part_url, data_stream.mimetype) if stream_complete: break ``` The code above only demonstrates the basic flow of uploading a file in real time. In reality, this logic will need to be enhanced with [error handling](/camera-to-cloud/how-to-handle-errors) and [advanced upload](/camera-to-cloud/how-to-advanced-uploads) techniques. ## Next Up Real-time uploads offer a way to make your integration as responsive as possible, with assets becoming playable in Frame.io seconds after they have finished recording. [A later guide](/camera-to-cloud/how-to-advanced-uploads) will cover advanced uploading techniques and requirements. Although it is written with basic uploads in mind, the majority of the guide will still be applicable to real-time uploads. If you haven't already, we encourage you to reach out to our team, then continue to the next guide. We look forward to hearing from you! # How to: Handle Errors ## Introduction This guide covers error handling when interacting with the C2C API. Gracefully handling HTTP errors is an essential component of a robust integration with any third-party service. ## Types of Errors Errors in your integration can originate from various sources, which we can categorize into four main groups: * **I/O Errors:** Originate from hardware operations on your device, such as failed read/write operations * **Application Errors:** Arise from issues within your application code * **Network Errors:** Occur within the networking stack and are communicated by your networking library * **API Errors:** Generated by Frame.io's backend services Each error category requires specific handling considerations. This guide primarily focuses on API errors, though we'll address general strategies for the other categories as well. ## How API Errors are Returned Frame.io's API communicates errors through two primary mechanisms: * **Status Codes:** HTTP error codes that indicate the nature of the problem * **Error Messages:** Payload content that provides additional error details, especially when multiple error conditions share the same status code ### Error Status Codes HTTP status codes are standardized numerical responses that communicate the outcome of an HTTP request. For more information, see [Mozilla's HTTP status code documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) or [HTTP Cats](https://http.cat/) for a more visual approach. Each Frame.io API endpoint specifies an expected success status code—typically `200 (OK)`, `201 (Created)`, or `204 (No Content)`. You can verify success either by checking for these specific codes or by confirming the code falls within the 200-299 range. Status codes above 399 indicate errors. Most API errors return 4XX codes (400-499), signifying client-side issues. Errors outside this range typically originate from network infrastructure between your device and our service, with the notable exception of `500 (Internal Server Error)`, which indicates an unexpected issue within our server. Similarly, a `404 (Not Found)` response might be generated by intermediate services rather than our backend, despite being a 4XX code. If you encounter unexpected status codes, please notify our team. ### Error Payload Schemas Frame.io returns error details in two formats: *simple* and *detailed*. Your error handling logic should accommodate both formats. ### Simple Error Schema Here's an example of a failed request with an incorrect `client_secret`: ```shell curl -X POST https://api.frame.io/v2/auth/device/code \ --include \ --header 'x-client-version: 2.0.0' \ --form 'client_id=Some-Client-ID' \ --form 'client_secret=bad_secret' \ --form 'scope=asset_create offline' ``` Response: ```text HTTP/2 400 ... {"error":"invalid_client"} ``` The simple schema contains just a single field for error identification. ### Detailed Error Schema For comparison, here's a request without proper authorization: ```shell curl -X POST https://api.frame.io/v2/devices/heartbeat \ --header 'Authorization: Bearer bad-token' \ --header 'x-client-version: 2.0.0' \ | python -m json.tool ``` Response: ```json { "code": 409, "errors": [ { "code": 409, "detail": "The channel you're uploading from is currently paused.", "status": 409, "title": "Channel Paused" } ], "message": "Channel Paused" } ``` Detailed errors contain a `message` field that identifies the error type. ### Determining Error Type When handling Frame.io errors, first check for an error payload and then fall back to the HTTP status code if no payload is present. Here's a basic error handling implementation: ```python title="Python" # Dict of known error codes: native errors. ERROR_STATUS_MAP = { 429: SlowDownError, ... } # Dict of known error messages: native errros. ERROR_MESSAGE_MAP = { "Channel Paused": ChannelPausedError, "invalid_client": InvalidClientError, "slow_down": SlowDownError, ... } def _c2c_extract_error_message(response): """ Gets the error message from an error payload. Returns `None` if an error payload is not found. """ # Try to decode the payload, if it is not JSON return `None` try: payload = response.json() except JSONDecodeError: return None # Try the simple error schema first. message = payload.get("error", default=None) if message is not None: return message # Now try the detailed schema. Return None if we do not find one. return payload.get("message", default=None) def _c2c_error_type_from_response(response): """ Converts a bad HTTP response into an error. """ error_message = _c2c_extract_error_message(response) # try to do a lookup of the error type by message. error_type = ERROR_MESSAGE_MAP.get(error_message, default=None) if error_type is not None: return error_type() # If not, try to do a lookup by error code. error_type = ERROR_STATUS_MAP.get(response.status_code, default=None) if error_type is not None: return error_type() # Otherwise we are going to return an `UnknownAPIError` to signal that we # encoutnered an error from Frame.io's backend servers, but do not know the # message and/or status code. return UnknownAPIError(message=error_message) def raise_on_frameio_error(response, expected_status): """ Raises a native error from an HTTP response if the response indicates an error occured. Expected status should be the status we expect to get (200, 201, 204, etc). """ # If the status code is less than `400`, then it is not an error status code. if response.status < 400: # Check that the status code is the one we expected, otherwise raise an # error. if response.status != expected_status: raise UnexpectedStatusError( expected=expected_status, received=response.status ) return None # Otherwise convert and raise a native error. raise _c2c_error_type_from_response(response) ``` The error lookup tables referenced in this example are provided at the end of this guide. ### AWS Errors When uploading file chunks, you interact directly with AWS S3, which has its own error format. See [AWS's common error documentation](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList) for details. As a general rule, non-fatal AWS errors should be retried at least once. AWS errors are returned as XML: ```xml NoSuchKey The resource you requested does not exist /mybucket/myfoto.jpg 4442587FB7D0A2F9 ``` The `Code` element identifies the error type. ## Retrying Errors ### When to Retry The error tables in this guide indicate which API errors should be retried. For non-API errors from I/O operations, networking libraries, or AWS, consider retrying those that may result from transient conditions. Network congestion, temporary server outages, or packet loss typically warrant retry attempts. Most networking libraries raise `TimeoutError` when a request takes too long, which is a prime candidate for retry. ### When in Doubt, Retry Once Computing environments can experience unpredictable issues. Even with errors that appear fatal, it's often worth making one retry attempt. Temporary system states, hardware anomalies (such as [cosmic ray bit flips](https://www.youtube.com/watch?v=AaZ_RSt0KP8)), or rare memory conditions can cause seemingly fatal errors that resolve on a second attempt. Some errors, however, should not be retried. For example, a `409: CHANNEL PAUSED` response when creating an asset indicates the device is paused and should not upload. This state is deliberate and unlikely to change from a retry. ### Exponential Backoff Frame.io implements rate limiting, and exceeding these limits produces either a `429: Slow Down` error or a `400` status with this payload: ```text HTTP/2 400 {"error":"slow_down"} ``` When you receive these responses, implement exponential backoff for retries. A recommended formula for calculating delay (in seconds) is: ```python title="Python" delay = min(2 ** attempt / 2, 32.0) ``` Where `attempt` starts at 0. This produces delays of 0.5s, 1s, 2s, 4s, 8s, 16s, 32s, with all subsequent attempts waiting 32 seconds. We recommend adding randomness (jitter) to your backoff timing to prevent request synchronization across multiple devices recovering from the same error condition. This helps mitigate the [thundering herd problem](https://medium.com/@venkteshsubramaniam/the-thundering-herd-distributed-systems-rate-limiting-9128d20e1f00) where many devices retry simultaneously after an outage. A good approach is to add a random offset between 0 and half the calculated delay: `math.rand(0, delay // 2)`. While exponential backoff is essential for rate-limiting errors, it's also beneficial for handling network and I/O failures generally. This approach allows temporary resource constraints to resolve without additional load from your retry attempts. ### Detecting Disconnected Status When network errors occur, they may indicate that Frame.io is unreachable because: * Your local network is down * Frame.io's services are experiencing issues * An intermediate network component is failing It's important to detect these conditions. When an error suggests connectivity issues, implement a monitoring task that checks for service restoration and informs the user of the disconnection. ### Waiting for Connection and Authorization Design your application to avoid making unnecessary requests when the device is refreshing authorization, awaiting user authorization, or unable to reach Frame.io. This reduces network overhead and improves user experience. Block all API calls (except to `https://api.frame.io/health`) when you detect a disconnected state. When connectivity issues arise, start a background task that polls the health endpoint and blocks further API calls until connectivity is restored. Similarly, if token expiration occurs, block authorization-dependent calls until a new token is issued. If token refresh fails, alert the user to re-authenticate. When polling for connection status, apply the same exponential backoff approach described earlier. ### Request Timeouts Configure appropriate timeout values for different types of requests: * **Default**: 15 seconds for basic requests * **Authorization Refresh**: 2 minutes to account for potential backend processing * **File Chunk Upload**: 5 minutes to accommodate slow networks when transferring larger data ### Example Retry Handler Here's a pseudocode implementation showing error handling with exponential backoff: ```python title="Python" # List of errors we know are fatal and should not be retried. FATAL_ERRORS = ( ChannelPausedError, DevicesDisabledError, ... ) # List of errors we know should be retried more than once. RETRY_ERRORS = ( TimeoutError, NotFoundError, SlowDownError, UnknownAPIError, ... ) # List of errors that could be the result of Frame.io being unreachable. DISCONNECTED_ERRORS = ( TimeoutError, HttpClientError, ... ) def retry_with_backoff(next_handler): """ Middleware for retrying errors with exponential backoff. """ def retry_handler(call, retry_count): """ Handler for retrying c2c API calls with exponential backoff. """ error = None # We will retry the call 8 times here, totalling 63.5 seconds +- ~32 seconds. for attempt in range(start=1, stop=retry_count + 1): # If we are attempting to reach an endpoint that requires authorization # we should wait unil we have valid authorization before attempting # a call. We need to do this each time in case our access_token # expires between attempts. C2C.wait_for_authorized(call) # Likewise, we should wait until we are connected to Frame.io to attempt # a call if we are not calling `https://api.frame.io/health` C2C.wait_for_connected(call) try: # Return the result on a success. return next_handler(call) except FATAL_ERRORS as error: # If we hit an error we know is fatal, raise the error without # retrying it. raise error except RETRY_ERRORS as error: # If we hit an error we know we should retry many times, continue, # but notify our client if we think we may have been disconnected. if type(error) in DISCONNECTED_ERRORS: C2C.notify_disconnected() except BaseException as error: # Otherwise, do not retry the call more than once. if attempt > 1: raise error # The delay for the next attempt should be no more than 32 seconds. # This algorithm will go: 0.5s, 1s, 2s, 4s, 8s, 16s, 32s, 32s, ... delay = min(2 ** attempt / 2, 32.0) # Add some randomness (jitter) to the delay (up to half the value of # the delay in either direction). delay += math.random(-delay, delay) / 2 # Wait between retries sleep(delay) # If we have exhausted all retries, raise error return retry_handler ``` ## Error Tables The following tables categorize Frame.io API errors and provide handling guidance. Here's what each column represents: `message`: The error payload message identifier `http code`: The HTTP status code `error type`: A conceptual error category (detailed in the [descriptions](#descriptions) section) `schema`: The error payload format ([simple](#simple-error-schema) or [detailed](#detailed-error-schema)) `retry`: Retry recommendation (`yes` for multiple attempts, `once` for a single retry, `no` for fatal errors) Asterisks (*) indicate special considerations detailed in the [descriptions](#descriptions) section. ### Frame.io Error Messages | Message | Error Type | HTTP Code | Schema | Retry | | ----------------------------- | ---------------------------------------------------------- | ------------------ | ----------------- | ------- | | "access_denied" | [AccessDenied](#accessdenied) | 401 | [simple](#simple-error-schema) | once | | "authorization_pending" | [AuthorizationPending](#authorizationpending) | 400 | [simple](#simple-error-schema) | yes | | "Channel Paused" | [ChannelPaused](#channelpaused) | 409 | [simple](#simple-error-schema) | no | | "expired_token" | [ExpiredToken](#expiredtoken) | 400 | [simple](#simple-error-schema) | no | | "Invalid Argument" | [InvalidArgument](#invalidargument) | 422 | [detailed](#detailed-error-schema) | no | | "invalid_client" | [InvalidClient](#invalidclient) | 400 | [simple](#simple-error-schema) | no | | "Invalid client version" | [InvalidClientVersion](#invalidclientversion) | 400 | [simple](#simple-error-schema) | no | | "invalid_grant" | [InvalidGrant](#invalidgrant) | 400 | [simple](#simple-error-schema) | no | | "invalid_request" | [InvalidRequest](#invalidrequest) | 400 | [simple](#simple-error-schema) | once | | "Not Authorized" | [UnauthorizedClient](#unauthorizedclient) | 401 | [detailed](#detailed-error-schema) | no | | "slow_down" | [SlowDown](#slowdown) | 400 | [simple](#simple-error-schema) | yes | | "unauthorized_client" | [UnauthorizedClient](#unauthorizedclient) | 401 | [simple](#simple-error-schema) | yes* | ### Frame.io Status Codes | HTTP Code | Error Type | Retry | | --------------- | ------------------------------------------------------ | ------- | | 400 | [InvalidRequest](#invalidrequest) | once | | 401 | [UnauthorizedClient](#unauthorizedclient) | no | | 422 | [InvalidContentType](#invalidcontenttype) | no | | 429 | [SlowDown](#slowdown) | yes | | 500 | [InternalServerError](#internalservererror) | yes | ### AWS Errors [See AWS's documentation](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList) for detailed descriptions. | Error | Retry | | ------------------------- | ------- | | InternalError | yes | | OperationAborted | yes | | RequestTimeout | yes | | ServiceUnavailable | yes | | SlowDown | yes | | [All Other Errors] | once | Both `SlowDown` and `ServiceUnavailable` from AWS indicate request rate issues and can be treated similar to Frame.io's `SlowDown` error, implementing exponential backoff. Similarly, AWS's `InternalError` corresponds conceptually to `InternalServerError` in our API. ### Descriptions #### AccessDenied Returned when a user declines authorization during device pairing. #### AuthorizationPending Indicates a user hasn't yet entered the device pairing code. Continue polling after the `interval` period specified in the device code response. #### ChannelPaused The device channel was paused when the asset was created. *Do not attempt to upload this asset again.* #### ExpiredToken The device pairing code has expired. Generate a new code and restart the pairing process. #### InternalServerError Indicates an unexpected backend issue. Retry once, and please report `500` errors to our team for investigation. Note that some known issues return `500` errors when they should return `InvalidRequest`: * Attempting to upload to a non-existent device channel * Requesting an invalid custom chunk count #### InvalidArgument A payload parameter contained an invalid value. Verify the parameter values match API expectations. #### InvalidContentType The request's `Content-Type` header is unsupported. The API generally accepts: * `form/multipart` (authorization endpoints only) * `application/x-www-form-urlencoded` (all endpoints) * `application/json` (non-authorization endpoints) #### InvalidClient The provided credentials (`client_id`, `client_secret`, etc.) were not recognized. Verify your integration credentials. ### InvalidClientVersion The `x-client-version` header was either duplicated or contains an invalid [semantic version](https://semver.org/). #### InvalidGrant The authorization grant type is invalid. Review the authorization guides for correct values. #### InvalidRequest The request parameters or payload format is incorrect. Verify field names and value formats. If received during token refresh, your refresh token has expired and you must restart the authorization process. #### SlowDown You've exceeded request rate limits. Implement exponential backoff for subsequent requests. Note that making multiple device code requests on the same TCP connection can trigger this error—create new connections for each pairing request. #### UnauthorizedClient Typically indicates an expired or missing `access_token`. If you receive this error, refresh your token before retrying. If encountered during token refresh, you must restart the authorization process and prompt the user to reconnect. This error can also occur when accessing resources outside your device's authorization scope or when a project has disabled C2C devices. Verify that you've requested appropriate scopes during authorization. *If this error occurs during token refresh, the entire authorization process must be restarted with user intervention.* ## Next Steps We encourage you to contact our team with any questions and proceed to the [advanced uploads guide](./how-to-advanced-uploads). We look forward to supporting your integration progress. If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). This guide builds on the [Basic Upload guide](./how-to-basic-upload) and [Advanced Uploads guide](./how-to-advanced-uploads). # How to: Manage Channels What happens when you have devices in your ecosystem that cannot connect to the internet and speak directly to Frame.io, but that can talk to your C2C-enabled device? Some integrations might wish to take actions on behalf of such devices, a Sound Recorder that uploads on behalf of a Microphone, or a Camera that makes realtime-comments on behalf of an attachment's buttons. These requests are fulfilled by understanding a device's channels. If your integration will not be managing sub devices, you can skip this guide. ## What will I need? If you haven't read the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide, give it a quick glance before moving on! You will need the `access_token` you received during the [device authentication and authorization guide](./how-to-authorization-management-hardware). You will also need a list of Device Model IDs for the sub-devices that should be able to connect to Frame.io through your primary device. ## What is a Channel? Channels are briefly discussed in our [Architecture Overview](./integration-architecture). Every project device has at least one channel, and while we have generally been treating them as one and the same, we now need to separate their concepts. Let's dig deeper. A project device has the ability to communicate directly with frame.io. A channel collects data for the project device to communicate. In most cases, the ProjectDevice and the first channel are one-in-the-same. Let's consider a camera: conceptually, the project device represents the camera's networking card, which sends data directly to Frame.io, while the channel represents the Camera's CMOS sensor, collecting video data to send through the network card (project device). Most importantly, the Project Device is authenticated with Frame through an OauthApp, while channels are not. They use their parent project device's authentication. Our model allows a project device to have multiple channels, which may or may not be part of the physical device. Channels may be pieces of hardware that communicate to the primary device over TCP/IP, Bluetooth, SDI, etc. The project device acts a router to send this data to frame.io. How that data is supplied from the channels to the project device is up to you, the integrator. Imagine a sound recorder, connected to Frame.io as a project device, with many microphones each connected as separate channels. The recorder may send the mix file on its primary channel, and individual microphone's tracks on its sub-device's channels. How you use channels and what each represents is up to you! Channels are not authenticated, they can be added and subtracted by the device at any time. Since channels can belong to a separate, physical sub-devices, each channel will be associated with a device model, like any other hardware or software integration. This allows frame.io to display the model of the sub-device, which may be different from the host device, and allows integrations to define behavior for each sub-device separately. What device models can be added to a given integration as channels must be defined ahead of time. There are a few reasons for why you might want to connect new channels to your C2C device: - Allow for multiple configurations for an integration depending on the channel + device model. This included asset fixed folder structure, tokenized folder paths, file extension routing, etc. Imagine a DIT station which uses different channels to upload editorial proxies or Camera Raw. - Gives the user in frame.io visibility into your sub-devices. - Channels can be configured with human inputs, aka buttons, which can be configured for real-time logging functions. Let's go a bit deeper into how to manage channels with the C2C API. ## Listing Channels A list of existing channels can be fetched by the [identity endpoint](./how-to-heartbeats-connection-info-and-status#fetching-connection-information) in the channels field. Let's take a look at the `"channels"` field of the response payload: ```json { "_type": "project_device", ... "channels": [ { "_type": "project_device_channel", "actor_id": null, "asset_type": "video", "device_id": "98e9367a-b26b-4c60-8e64-da83dfd9540b", "external_index": 0, "id": "5919e9bc-7fc2-4629-97e5-852ce27cfa1a", "inserted_at": "2023-07-14T19:11:43.217565Z", "name": "Test Host Device", "project_device_id": "bf30fc66-f126-4336-bdfc-75d3e659b95a", "project_id": "1eb3587f-6bca-4e8d-a2f6-e7413d82c1ad", "real_time_logging_capable": false, "status": "online", "updated_at": "2023-07-14T19:11:43.217565Z" }, { "_type": "project_device_channel", "actor_id": null, "asset_type": "video", "device_id": "057b33c4-9f92-4eeb-a3d5-2fd0f4932292", "external_index": 0, "id": "0b17e1e3-588c-4365-be51-5cf097c8f004", "inserted_at": "2023-07-14T19:11:43.217565Z", "name": "Test Client Device 01234", "project_device_id": "bf30fc66-f126-4336-bdfc-75d3e659b95a", "project_id": "1eb3587f-6bca-4e8d-a2f6-e7413d82c1ad", "real_time_logging_capable": false, "status": "offline", "updated_at": "2023-07-14T19:11:43.217565Z" } ], ... "device_id": "98e9367a-b26b-4c60-8e64-da83dfd9540b", ... "id": "bf30fc66-f126-4336-bdfc-75d3e659b95am" } ``` Notice that the `device_id` for the first channel matches the `device_id` of our Project Device as a whole. ## Connecting a Channel We can connect a new channel with the following request: ```shell curl -X POST https://api.frame.io/v2/devices/channels/connect \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__'{ "client_id": [client_id], "device_model_id": [device_model_id] } __JSON__ | python -m json.tool ``` We get the following response: ```json { "_type": "project_device_channel", "actor_id": null, "asset_type": "video", "device_id": "057b33c4-9f92-4eeb-a3d5-2fd0f4932292", "external_index": 0, "id": "0b17e1e3-588c-4365-be51-5cf097c8f004", "inserted_at": "2023-07-14T19:11:43.217565Z", "name": "Test Client Device 01234", "project_device_id": "bf30fc66-f126-4336-bdfc-75d3e659b95a", "project_id": "1eb3587f-6bca-4e8d-a2f6-e7413d82c1ad", "real_time_logging_capable": true, "status": "offline", "updated_at": "2023-07-14T19:11:43.217565Z" } ``` This response mirrors the channels field from the [identity](./how-to-heartbeats-connection-info-and-status#fetching-connection-information) endpoint. The client_id is what governs uniqueness, so it must be a stable value, such as the serial number. The device_model_id is what tells Frame.io, the underlying type of hardware device this channel represents, such as a specific model of microphone. These will have been setup by your partner manager. If a channel has already been declared, you will receive a 409 error with the error title Already Exists. When creating a channel with the same identifiers of one that was previously connected, and then disconnected, all previous user configuration for the channel will be restored. ## Disconnecting a Channel A channel is disconnected by the Frame.io defined id. Not by client_id or device_model_id. ```shell curl -X POST https://api.frame.io/v2/devices/channels/:channel_id/disconnect \ --header 'Authorization: Bearer [access_token]' \ --header 'x-client-version: 2.0.0' \ | python -m json.tool ``` Which returns a `204` response with a blank payload. When deleting a channel that does not exists, you will get a 404. You cannot disconnect the first, primary channel for the parent device. ## Disconnecting all Sub-Device Channels You can disconnect all current sub-device channels on a Project Device with the following call: ```shell curl -X POST https://api.frame.io/v2/devices/channels/disconnect \ --header 'Authorization: Bearer [access_token]' \ --header 'x-client-version: 2.0.0' \ | python -m json.tool ``` Which returns a `204` response with a blank payload. This call will always succeed, even if the project device has no client device channels. We can now list all our channels using the [identity](./how-to-heartbeats-connection-info-and-status#fetching-connection-information) endpoint; only the host device's primary channel will remain. ## Channel Management Flow We do not recommend that ProjectDevice's manage channel state internally to avoid data integrity issues that could be a result of power cycles happening at less-than-ideal times. For instance: - Powering off after a Channel Connect call has been processed, but before the returned `id` can be committed to a data store - Sub devices being plugged/unplugged from the host device while the device is off. Instead, it is recommended that all host devices execute the following steps when first booted: - Call the Bulk Channel Disconnect endpoint to clear all existing sub-device channels - Call the Channel Connect endpoint for each sub-device currently connected After initial setup, a host device MUST call the Channel Disconnect endpoint whenever a sub device is disconnected, and the Channel Connect endpoint whenever a new sub device is added. Host devices MAY NOT clear sub-devices each time a new device is connected. Host devices MUST correctly handle poor network conditions when managing devices, and properly add / remove currently connected devices upon connection to the network being re-established. ## Next Up If you haven't already, we encourage you to reach out to our team, then continue to the next guide. We look forward to hearing from you! # How to: Log Footage in Real Time ## Introduction Real-time logging allows devices to register comments, asset status, and other data while a piece of media is being recorded on set, before it is registered with Frame.io, for any C2C assets being generated by any device in the same project. Imagine a director watching their feed in Video Village, being able to hit a button whenever the actor gives a good performance, or a Smart Slate that can mark the clap point on all assets. ## What will I need? If you haven't read the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide, give it a quick glance before moving on! You will need the `access_token` you received during the hardware device or C2C Application authentication and authorization guide. ## Timecode requirements To line up real-time logging events with assets, we expect both the asset being captured and the device being used to log to be [jam-syned or gen-locked](https://www.bhphotovideo.com/explora/video/tips-and-solutions/timecode-versus-sync-how-they-differ-and-why-it-matters). Both the recording device and the logging device will then be responsible for sending timecode to our backend, where we will do a timecode sync operation to line up the logging event with the correct frame. ## Setting up your input configurations Real-time logging operates on a new concept in the data model: Inputs. An input represents a physical button on your device that can be configured to send data to Frame.io. The first thing you will need to decide is the number of buttons you will allow to do this sort of operation, then assign an index, starting at 0, to each button. This index will be used to identify which button has been pressed when the event is sent to our servers. Inputs belong directly to channels, and so each button press message will need to target a specific channel endpoint. For more on channels, see the [channel management guide]. Configuration of what each button does is handled by the user through Frame.io's UI, allowing integrations to be a simple as possible. You won't be required for any special UI affordances on your end, besides being able to assign a button to be a "Frame.io action", if your button / triggers / etc are configurable. We will work with you to determine following configuration for each of your device's inputs: - Index: An 0-indexed integer that will be used to identify the input. - Display name: The name of the input to be displayed to the user in Frame.io's configuration screen. - Supported actions: Right now the only action type is "single press", but in the future we may allow additional action types such as "long press" or "double press" to allows each input to support multiple actions, each having a different meaning. - Button color: If your button has a color associated with it, we can display that to help users orient themselves when configuring the device's input settigs. - Default event type: The type of event this input generates by default: - Comment: This input generates a comment - Status: The input updates the asset status - Default comment text: The default text that should be used on comments generated by this input - Default status: The default status to update assets with when this input is being used for status. Can be: - `in_progress` - `needs_review` - `approved` By supplying this information ahead of time, we keep the demands on your actual device as low as possible. ## Sending a real-time logging event Real-time logging events can be sent with the following call ```shell { curl -X POST https://api.frame.io/v2/devices/channels/{channel_id}/inputs/{input_index}/trigger \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "action_type": "single_press", "offset": 0, "start": { "smpte_timecode": "01:00:00:00", "rate": { "playback": [24_000, 1001], "ntsc": "non_drop" } }, "duration": { "smpte_timecode": "00:00:00:01", "rate": { "playback": [24_000, 1001], "ntsc": "non_drop" } } } __JSON__ } | python -m json.tool ``` On a success, you will receive a `204` with a blank payload. **URL Parameters** - `channel_id`: The UUID of the channel this input is registered to. This ID will have been received by the [channel create](link) call or from the [identity endpoint](/camera-to-cloud/how-to-heartbeats-connection-info-and-status#fetching-connection-information). - `input_index`: The index of the input making the call **JSON Body** - `action_type`: The type of action to perform. Currently the only supported action is `single_press`. - `offset`: The offset from the start of the asset to log the event at. - `start`: Start time, as represented by the [SMPTE timecode](https://workflow.frame.io/guide/timecode) + framerate of when the input was triggered. - `smpte_timecode`: Timecode represented as a SMPTE string. - `rate`: Framerate of the timecode stream. - `playback`: Playback speed of the framerate, represented as a `[numerator, denominator]` pair in an array. Optionally, this field also accepts fractions in string format, `"numerator/denominator"`. NTSC framerates like 23.98 should be sent as they're fully qualified rational value: [`24000, 1001]`. - `ntsc`: The NTSC standard of the timecode. Can be "`non_drop"` or `null`. If `null`, `playback` must represent a whole-number value, such as `[24, 1]`. If `"non_drop"`, `playback` must represent a valid NTSC framerate, such as `[24000, 1001]`. - `duration`: Duration of the event, as represented by a [SMPTE timecode](https://workflow.frame.io/guide/timecode) + framerate of when the input was triggered. Conform to the same object definition as `start`. For `single_press`, events, must be exactly 1 frame (`"01:00:00:00"`). ## Reliability requirements Realtime upload triggers must apply the same [reliability guidelines](/camera-to-cloud/how-to-advanced-uploads#h2-section-uploading-reliably) as uploads, and respect the [device paused status](/camera-to-cloud/how-to-advanced-uploads#h3-section-offset---handling-paused-devices). ## Next up If you haven't already, we encourage you to reach out to our team, then continue to the next guide. We look forward to hearing from you! # How to: Upload (Advanced) ## Introduction Reliable asset uploading is the core function of every C2C integration. This guide provides advanced techniques and best practices for creating a robust, resilient, and efficient upload system that performs well even in challenging environments. ## Prerequisites If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). We'll continue using the [same test asset](https://f.io/Rq1q5CzB) from the [Basic Uploads guide](./how-to-basic-upload). ## Advanced Asset Parameters When creating assets in Frame.io, you can use several advanced parameters to customize upload behavior. The `offset` parameter is particularly important for proper integration. ### Offset - Handling Paused Devices Providing an accurate `offset` value is critical. This parameter specifies when a piece of media was created and ensures your device doesn't upload content that shouldn't be shared. When a device is paused in Frame.io, the user is indicating that media created during the pause should not be uploaded. For more details, see our [guide on pause functionality](./how-to-heartbeats-connection-info-and-status#handling-the-paused-status). ### Additional Benefits of the offset Parameter The `offset` parameter provides another significant advantage for organizing media withing Frame.io. When uploading content captured at an earlier date—for example, when a user selects a photo taken the previous week during playback—the `offset` parameter ensures this media appears in folders corresponding to its original capture date rather than the current upload date. This chronological organization maintains a logical timeline in the Frame.io project structure. Without the `offset` parameter, historical media would incorrectly appear grouped with today's content, potentially causing confusion for editors and other collaborators. You may wish to provide users with a choice in this matter through your interface. If users prefer to organize all uploads by the current date regardless of when the media was captured, you can simply omit the `offset` parameter, as it defaults to `0` when not specified. Our API design eliminates the need for your device to track pause status. Instead, when uploading a file, you indicate how many seconds ago the file was created. Our server compares this against pause windows and rejects the upload if it was created during a pause. To demonstrate this feature, pause your device from the three-dot menu in the C2C Connections tab. Now attempt to upload an asset: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": 0 } __JSON__ } | python -m json.tool ``` Documentation for `/v2/devices/assets` can be [found here](/camera-to-cloud/api-reference/device-asset-create). You'll receive this error: ```json { "code": 409, "errors": [ { "code": 409, "detail": "The channel you're uploading from is currently paused.", "status": 409, "title": "Channel Paused" } ], "message": "Channel Paused" } ``` If you unpause the device and retry with the same request, the asset will be created. However, if the asset was created during the pause window, you need to set the `offset` to reflect when it was actually created: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": 60 } __JSON__ } | python -m json.tool ``` This tells Frame.io the asset was created 60 seconds ago (during the pause), which properly triggers the `Channel Paused` error. *Accurate `offset` values are essential* to prevent uploading sensitive content against the user's wishes, including protected intellectual property, sensitive footage, or other restricted material. When retrying a failed asset creation call, remember to update the `offset` value. During extended retry periods, a static offset might drift out of the relevant pause window, potentially allowing uploads that should be blocked. ### Uploading to a Specific Channel If your device has multiple channels, you can specify which one to use: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": -10, "channel": 2 } __JSON__ } | python -m json.tool ``` If not specified, the default channel is `0`. Most integrations won't need to change this value. ### Requesting a Custom Chunk Count By default, Frame.io's backend divides files into approximately 25MB chunks. For networks with high congestion, you might prefer smaller chunks. You can request a specific number of chunks with the `parts` parameter: ```shell { curl -X POST https://api.frame.io/v2/devices/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "C2C_TEST_CLIP.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": 0, "parts": 4 } __JSON__ } | python -m json.tool ``` The response will include four upload URLs: ```json { ... "upload_urls": [ "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-01-path]", "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-02-path]", "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-03-path]", "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-04-path]" ], ... } ``` The chunk size will be: ```python title="Python" math.ceiling(float(21136250) / float(4)) # 5284063 bytes ``` The last chunk will be 5,284,061 bytes (calculated as `21136250 - 5284063 * 3`). When requesting custom chunk counts, be aware of [AWS S3 multipart upload limitations](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html): - Each part must be at least 5 MiB (5,242,880 bytes), except for the final part - There can be no more than 10,000 parts If your request violates these constraints, you'll receive a `500: INTERNAL SERVER ERROR`: ``` { "code": 500, "errors": [ { "code": 500, "detail": "There was a problem with your request", "status": 500, "title": "Something went wrong" } ], "message": "Something went wrong" } ``` Always verify your custom part count conforms to S3's requirements. ## Uploading Efficiently C2C devices often operate in challenging network environments, so efficiency is crucial. Here are strategies to maximize throughput. ### TCP Connection Reuse/Pooling Establishing encrypted connections requires significant negotiation overhead. For efficient operation, reuse TCP connections when making multiple requests. Most HTTP libraries provide a `Client` or `Session` abstraction that maintains persistent connections. The negotiation process for a new HTTPS connection includes cryptographic handshakes and certificate validation. By reusing connections, you only perform this overhead once rather than for each request. For technical details on TLS handshake processes, see [Cloudflare's explanation](https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/). To demonstrate connection reuse with `curl`, first create a new asset in Frame.io as described in the [basic upload guide](/camera-to-cloud/how-to-basic-upload#step-1-creating-an-asset). Next, split the file into separate chunks for testing: ```shell head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 > "C2C_TEST_CLIP-Chunk01" tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 > "C2C_TEST_CLIP-Chunk02" ``` Now upload both chunks over a single TCP connection using curl's `--next` parameter: ```shell curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-1-path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk01 \ --next -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-2-path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk02 ``` Compare this to separate connections: ```shell curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-1-path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk01 \ && curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-2-path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk02 ``` You can upload to the same chunk URL multiple times, so feel free to reuse URLs between examples. In testing, connection reuse typically improves performance by 15-20% for sequential uploads. ### Parallel Uploads For even greater throughput, upload multiple chunks simultaneously: ```shell curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-1-path] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk01 \ & \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part-2-path]\ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk02 \ & ``` With sufficient bandwidth, parallel uploads complete in approximately the time of the slowest individual upload. For optimal parallelism, a good rule of thumb is two concurrent uploads per CPU core. Exceeding this ratio can lead to resource contention and diminishing returns. Network conditions significantly impact parallel upload performance. In some environments, sequential uploads may outperform parallel ones. Advanced implementations might monitor throughput and dynamically adjust concurrency. Always profile performance in your actual production environment rather than relying on example timing. ### Combining Both Approaches For maximum efficiency, combine connection pooling with parallel uploads. Create multiple processes, each using connection pooling for its own sequence of uploads: ```shell curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[asset01-chunk01] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk01 \ --next -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[asset01-chunk02] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk02 \ & \ curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[asset02-chunk01] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk01 \ --next -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[asset02-chunk02] \ --include \ --header 'content-type: video/mp4' \ --header 'x-amz-acl: private' \ --data-binary @C2C_TEST_CLIP-Chunk02 \ & ``` Most HTTP libraries provide abstractions for connection pooling and parallel requests. Experiment with your library's options to determine the optimal configuration for your environment. ## Tracking Upload Progress Your integration must provide basic progress indication to users. Chunk-level granularity is acceptable—for a three-chunk upload, progress might increment from 0% → 33% → 66% → 100% as each chunk completes. Finer-grained progress reporting depends on your HTTP library's capabilities. Contact our team if you need guidance on implementing more detailed progress tracking. ## Uploading Reliably For robust error handling, review our [errors guide](/camera-to-cloud/how-to-handle-errors). The following sections assume you've implemented the error handling strategies described there. Creating a production-quality uploader requires additional considerations beyond handling individual request errors. ### Creating an Upload Queue In real-world scenarios, your device may generate media faster than it can upload, or it might experience extended connection interruptions. Implementing a queuing system separates media creation from upload management. Consider a two-queue architecture: 1. A **media queue** for registering local files with Frame.io 2. A **chunk queue** for uploading individual file chunks Here's a simplified implementation: ```python title="Python" # Where we are going to queue new files. FILE_QUEUE = Queue() # Where we are going to queue new chunks. CHUNK_QUEUE = Queue() # The http session that will handle TCP # connection pooling for us. HTTP_SESSION = http.Session() def take_picture(): """Snaps a picture for the user.""" image = MY_DEVICE.capture() file_path = MY_DEVICE.write_image(image) FILE_QUEUE.add(file_path) def task_register_assets(): """ Pulls snapped pictures from the FILE_QUEUE, registers with Frame.io, and adds the chunks to the CHUNK_QUEUE. """ while True: # Get the latest file added to the queue and register # a C2C Asset for it. new_file = FILE_QUEUE.get() asset = c2c.crete_asset_for_file(HTTP_SESSION, new_file) # Calculate the size for each chunk chunk_size = c2c.calculate_chunk_size(asset, new_file) # Create a message for each chunk with it's parameters # and add it to the # queue. chunk_start = 0 for chunk_url in asset.upload_urls: message = { "file_path": new_file, "chunk_url": chunk_url, "chunk_start": chunk_start, "chunk_size": chunk_size, } # Put the message in the queue and CHUNK_QUEUE.put(message) chunk_start += chunk_size def task_upload_chunk(): """Takes a chunks and uploads them.""" while True: info = CHUNK_QUEUE.get() c2c.upload_chunk(HTTP_SESSION, info) def launch_upload_tasks(): """Lauches our Frame.io upload tasks.""" # Create a list to hold all of our tasks. tasks = list() # Create one task for registering assets. asset_task = run_task_in_thread(task_register_assets) tasks.append(asset_task) # Create 2 tasks per CPU core for uploading chunks. for _ in range(0, GET_CPU_COUNT() * 2): chunk_task = run_task_in_thread(task_upload_chunk) tasks.append(chunk_task) # Run these tasks until shutdown run_forever(tasks) ``` In the above example, we assume that the functions invoked for c2c calls are handling errors as discussed in the [errors guide](/camera-to-cloud/how-to-handle-errors). ### Persistent Queuing Across Power Cycles The in-memory queue approach works well while the device remains powered on, but what happens if power is lost before uploads complete? To create a truly resilient integration, we need to ensure the device can resume from where it left off after restarting. This requires persisting the queue state to storage between power cycles. An embedded database such as [SQLite](https://www.sqlite.org/index.html) provides an excellent foundation for this functionality. Your persistent queue implementation should support these key operations: * Adding newly created files to the upload queue * Tracking when assets are successfully created in Frame.io * Recording when asset creation fails due to errors * Storing file chunk information for upload tasks * Retrieving the next chunk to be uploaded * Marking chunks as successfully uploaded * Logging chunk upload failures * Providing file status information for user display Here's how we might adapt our previous example to use a persistent storage system: ```python title="Python" # Our persistence layer for queuing uploads, potentially using SQLite # or another embedded database C2C_UPLOAD_STORE = NewC2CUploadStore() # HTTP session for connection pooling HTTP_SESSION = http.Session() def take_picture(): """Captures an image and adds it to the upload queue.""" image = MY_DEVICE.capture() file_path = MY_DEVICE.write_image(image) # Register the file with our persistent store C2C_UPLOAD_STORE.add_file(file_path) def task_register_assets(): """ Processes files from persistent storage and registers them with Frame.io for upload. """ while True: # Get the next available file from our store file_record = C2C_UPLOAD_STORE.get_file() try: # Register the asset with Frame.io asset = c2c.create_asset_for_file(HTTP_SESSION, file_record) chunk_size = c2c.calculate_chunk_size(asset, file_record) # Create entries for each chunk in our persistent store chunk_start = 0 for chunk_url in asset.upload_urls: message = { "file_path": file_record, "chunk_url": chunk_url, "chunk_start": chunk_start, "chunk_size": chunk_size, } C2C_UPLOAD_STORE.new_chunk(message) chunk_start += chunk_size except BaseException as error: # Record the error in our persistent store C2C_UPLOAD_STORE.file_asset_create_error(file_record, error) else: # Mark the asset as successfully created C2C_UPLOAD_STORE.file_asset_created(file_record) def task_upload_chunk(): """Uploads individual file chunks from the persistent queue.""" while True: # Get the next chunk, marking it as "in progress" to prevent # other tasks from processing it simultaneously chunk_record = C2C_UPLOAD_STORE.get_chunk() try: c2c.upload_chunk(HTTP_SESSION, chunk_record) except BaseException as error: # Record the error for potential retry C2C_UPLOAD_STORE.chunk_error(chunk_record, error) else: # Mark successful completion C2C_UPLOAD_STORE.chunk_success(chunk_record) def launch_upload_tasks(): """Launches Frame.io upload processing tasks.""" tasks = [] # Asset registration task asset_task = run_task_in_thread(task_register_assets) tasks.append(asset_task) # Multiple parallel chunk upload tasks worker_count = GET_CPU_COUNT() * 2 for _ in range(worker_count): chunk_task = run_task_in_thread(task_upload_chunk) tasks.append(chunk_task) # Run indefinitely run_forever(tasks) ``` With this persistent storage approach, your integration becomes resilient to power interruptions. When the device restarts, it simply continues processing from its last saved state. This architecture also provides the foundation for implementing more advanced features, like error tracking and stalled upload detection. ### Tracking Upload Errors A robust upload system must carefully track errors. After retrying an operation using the strategies in the [errors guide](/camera-to-cloud/how-to-handle-errors), record these failures in your persistence store. This allows your system to: 1. Deprioritize problematic uploads to prevent them from blocking the entire queue 2. Provide accurate status information to users 3. Enable administrative intervention for persistent issues When a fatal error occurs, mark the item to prevent unnecessary retry attempts. ### Managing Stalled Uploads Implement safeguards against indefinitely stalled uploads. Set a maximum duration (e.g., 30 minutes) after which a chunk upload task should be terminated and restarted. This prevents scenarios where all upload workers become blocked by non-responsive operations. ### Recovering From Silent Failures System crashes, power loss, or process termination can prevent normal error reporting. When retrieving items from your queue, record the checkout time. If an item remains in the "in progress" state beyond a reasonable threshold (e.g., 30 minutes) without reporting success or failure, automatically return it to the available pool for processing by another worker. ### Mitigating Poisoned Uploads A "poisoned" queue item consistently fails due to inherent problems with the data or environment. If these items continuously requeue, they can effectively block your entire upload system. Consider these strategies for handling such cases: * After multiple failures, deprioritize the item so newer content can proceed * Track both explicit errors and the number of processing attempts * Follow connection and authorization best practices to distinguish between transient environmental issues and intrinsic file problems * Implement escalating retry limits (e.g., retry individual operations 10 times within each of 3 job attempts, for 30 total attempts) * Provide a user interface for manually resetting problematic uploads once environmental issues are resolved Poisoned uploads can result from: * Corrupted file data causing I/O errors * Catastrophic process failures that prevent error reporting * Normally retriable errors triggered by permanent underlying conditions ### Retry After System Restart Before permanently abandoning problematic uploads, flag them for one final retry after the next system restart. This addresses cases where uploads fail due to temporary system state issues with memory, drivers, or resource allocation. If an upload continues to fail after a clean restart, you can more confidently mark it as permanently problematic. ## Clearing Your Queue Remember to remove unavailable files from your queue. When media is physically removed or files are deleted, purge corresponding entries from your upload queue to prevent unnecessary errors. *Importantly, you must clear your upload queue when connecting to a new project.* Media queued for one project should never appear in another. When a user pairs the device with a different project, verify whether the project has changed and, if so, completely clear the existing queue. ## Next Steps We encourage you to contact our team with any questions and proceed to the [advanced uploads guide](/camera-to-cloud/how-to-advanced-uploads). We look forward to supporting your integration progress. # How to: Organize Assets ## Introduction In this guide we will learn how and to what degree we can control *where* assets from your integration are uploaded. ## What will I need? If you haven't read the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide, give it a quick glance before moving on! You will also need the `access_token` you received during the [C2C hardware](./implementing-c2c-authentication-and-authorization-hardware) or [C2C Application](./implementing-c2c-authentication-and-authorization-c2c-application) authentication and authorization guide. ## Asset folder structure By default, assets are created with the following folder structure: `Cloud Devices` > `{YYYY}_{MM}_{DD}` > `{ASSET_TYPE}` > `{YOUR_DEVICE}` > `{ASSET_NAME}` Where `{ASSET_TYPE}` is either `VIDEO`, `AUDIO`, or `DATA` (configured for your device model per-channel), `{YOUR_DEVICE}` is the name of the project device connected to the user's project, and `{ASSET_NAME}` is the name of the asset you uploaded and is the actual playable asset in Frame.io. ### Extension routing You can set your device up to route different assets to custom `{ASSET_TYPE}` folders based on a file extension in `{ASSET_NAME}`. For instance, let's say your integration has a number of different file types it produces that each belong to a specific provenance. You can tell us to map those assets like so: ```text .mov -> VIDEO .mp4 -> VIDEO .raw -> STILLS .jpeg -> STILLS .pdf -> CAMERA REPORTS .las -> LiDAR Scans ``` Now when you crete the following asset: ```shell { curl -X POST https://api.frame.io/v2/assets \ --header 'Authorization: Bearer [access_codes]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "IMAGE_0001.jpeg", "filetype": "image/jpeg", "filesize": 21136250, "offset": 10 } __JSON__ } | python -m json.tool ``` Docs for `/v2/assets` can be [found here](/camera-to-cloud/api-reference/device-asset-create) ... it will be routed to a location like: `Cloud Devices` > `2022_04_01` > `STILLS` > `MY_DEVICE` > `IMAGE_0001.jpeg`. If the file were instead called `A001_C001.mov`, it would be routed to: `Cloud Devices` > `2022_04_01` > `VIDEO` > `MY_DEVICE` > `A001_C001.mov`. ### Tokenized upload paths Some integrations may wish to have more control over the folder structure their device creates. In turn, we at [Frame.io](http://frame.io/) need to make sure that there is some level of consistency in how files are uploaded to [Frame.io](http://frame.io/) from a C2C device, and specifically make guarantees to [Frame.io](http://frame.io/) customers about what part of their project a C2C device can interact with. To that end, we allow integrators to customize their asset upload locations within the `{YOUR_DEVICE}` folder, but do not allow assets to be uploaded outside of that folder. To upload to a custom folder structure, you will need to work with your Partner Manager. Custom folder structures are a set of tokenized metadata that must be supplied on asset creation. Let's do a simple example: Let's say we have a 3D camera rig that has `reel_name` values like `"A001"`, `"A002"`, `"A003"`, etc, and `clip_number` values like `"C001"`, `"C002"`, etc. We want to create folders for each clip and populate those with the left and right eye files, so the files would look like this in a project: ![Tokenized Folder Path - 3D Rig Example](https://files.buildwithfern.com/frame-io.docs.buildwithfern.com/e40b09128d1cbf3c876fd14169a6406642d50d13ce7ab802baff4bbaf50bfd4a/docs/pages/c2c/images/Screen_Shot_2022-04-11_at_10.03.43_AM.png) To do this, we will need to configure two settings: * Required metadata fields * Tokenized file path Required metadata fields are a simple list of keys that must be set on asset creation for your integration: ```text [reel_name, clip_number] ``` You can then use any of these keys to create a `/`-delimitated path, using `{field_name}` to denote where a field's value should be injected: ```text REEL_{reel_name}/{reel_name}_{clip_number} ``` Both of these settings will have to be given to our team at [Frame.io](http://frame.io/) to add as part of your integration's details. After we set that up, when you create an asset, those values will have to be supplied at the root of the payload in order for the asset creation to be successful: ```shell { curl -X POST https://api.frame.io/v2/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "A001_C001_LEFT.mp4", "filetype": "video/mp4", "filesize": 21136250, "offset": 10, "metadata": { "reel_name": "A001", "clip_number": "C001" }, } __JSON__ } | python -m json.tool ``` The above will create a file with a full path like: `Cloud Devices` > `2022_04_01` > `VIDEO` > `MY_DEVICE` > `REEL_A001` > `A001_C001` > `A001_C001_LEFT.mp4` If your device has not been explicitly set up to allow these fields, you will receive an error if you try to make the same call. Likewise, if you set up required metadata fields, you MUST supply them in the asset create payload or an error will be returned. The payload will accept any valid JSON value. Non-string values are rendered in the following way: * **integers**: Rendered in base-10: `10` -> `"10"` * **floats**: Uses the shortest representation according to algorithm described in "Printing Floating-Point Numbers Quickly and Accurately" in Proceedings of the SIGPLAN '96 Conference on Programming Language Design and Implementation. * **booleans**: `true` and `false` are rendered as `"true"` and `"false"` * **null**: Rendered as an empty string. If `reel_name` where set to `null`, then the first custom folder would be rendered as `REEL_` In general we suggest that you limit your values to strings, and format other values as you see fit (for instance, integers will always be printed without leading zeroes, something you may want to change). In general, only fields which have a valid value for every clip should be used; if a field does not always have a valid value, you should have a plan for how to represent unset or null values. ## Version stacking [Frame.io](http://frame.io/) supports [version stacks](https://support.frame.io/en/articles/4431-version-stacking-and-comparison) — a way to bundle multiple iterations of the same content in the UI. The C2C API allows for devices to upload new iterations of an asset that will be put into a version stack with its previous versions. In order to create a version stack, you must supply an `autoversion_id` to identify what version stack the assets belong to. This value can be anything: a UUID, a filename, etc. Be careful to only use values that will never be unintentionally repeated in an asset folder. For instance, if it's possible your integration may create the same filename more than once, then filename is *not* a good candidate to use for `autoversion_id`. We supply an autoversion_id like so: ```shell { curl -X POST https://api.frame.io/v2/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "A001_C001_v01.mov", "filetype": "video/webm", "filesize": 21136250, "offset": 10, "autoversion_id": "033e22ae-8544-4c9b-a84c-fcc140b0dd16" } __JSON__ } | python -m json.tool ``` Now, whenever you upload a new asset, if you use the same autoversion_id, the asset will be added as the latest version in a stack with the original asset: ```shell { curl -X POST https://api.frame.io/v2/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "A001_C001_v02_with_color.mov", "filetype": "video/webm", "filesize": 21136250, "offset": 10, "autoversion_id": "033e22ae-8544-4c9b-a84c-fcc140b0dd16" } __JSON__ } | python -m json.tool ``` *Assets will only stack if they are uploaded to the same folder*, so you will need to keep a couple things in mind if you wish to implement version stacking: * Tokenized metadata must resolve to the same parent folder for the version stack to be created. * Because the creation date is part of the file path, new versions created after midnight UTC may not stack correctly unless you supply an offset for the original upload's creation time. This second point is important. Let's say 48 hours after the initial upload, a new version of the asset is created. In order to stack with the original asset, we must supply an offset that is 48 hours in the past: 172800 seconds. ```shell { curl -X POST https://api.frame.io/v2/assets \ --header 'Authorization: Bearer [access_token]' \ --header 'Content-Type: application/json' \ --header 'x-client-version: 2.0.0' \ --data-binary @- <<'__JSON__' { "name": "A001_C001_v03_with_color.mov", "filetype": "video/webm", "filesize": 21136250, "offset": 172800, "autoversion_id": "033e22ae-8544-4c9b-a84c-fcc140b0dd16" } __JSON__ } | python -m json.tool ``` If the current asset *would* have been uploaded to `2022_04_03`, it will now be uploaded to `2022_04_01` and stack with the correct asset. ## Next up This is the last guide for creating a great C2C integration! Take a moment to pat yourself on the back! Maybe get a snack. The only thing left to do is review the integrator checklist, where you will find a summary of everything needed to create a bulletproof integration. If you haven't already, we encourage you to reach out to our team, then continue to the next guide. We look forward to hearing from you! # Integrator Checklist ## C2C Integration Requirements This checklist outlines the best practices and requirements for joining the C2C ecosystem. While not every item applies to all C2C devices or applications, the C2C Partnerships team will work with you to define specific requirements during the C2C Certification Program. ## Basic Integration Requirements All integrations must include: Display a 6-digit code to the user. For web interfaces or QR code-capable devices, use the `verification_url_complete` to provide users a hyperlink option for logging in and selecting a project to connect to. Shows the connected project name so users can quickly verify their connection without searching through [Frame.io](http://frame.io/)'s UI Clear indicators for: * Remaining file count * Total remaining file size * Current file upload progress * Status of completed, queued, and failed uploads Network connection status display and automatic access token refresh after 8 hours with no user interaction or alerts (unless there's a refresh error) Additional requirements: - Cancellable authorization flow at each step - Socket status for real-time communication - Firmware version header in all HTTPS endpoint calls ## Security Requirements At [Frame.io](http://frame.io/), security is paramount. Our requirements include: * HTTPS-only requests (HTTP requests are rejected) * Direct device/application connection to [Frame.io](http://frame.io/) (no intermediary services) * Protected `client_secret` and `client_id` (not user-accessible) * Protected `access_token` and `refresh_token` credentials * Encrypted storage of secrets and tokens (optional but recommended) ## Uploader Requirements Reliable media upload is crucial, especially in challenging conditions. Integrations must: * Support automatic uploads either in real-time during recording (preferred) or upon file completion * Show clear upload status, including queue and results * Write files to user-accessible local storage Maintain a robust upload queue that handles: * Concurrent uploads * Network interruptions * Power cycles Implement automatic retry for: * Network issues * Power interruptions * Non-fatal errors (timeouts, network errors, expired tokens) * Resume uploads from last successful chunk * Honor **PAUSED** state * Handle AWS non-fatal errors * Manage corrupted media without blocking other uploads Provide flexible upload options: * Toggle automatic/manual uploads * Individual/bulk file selection * File type prioritization (optional) * Queue prioritization (optional) * Parallel uploads (optional) * Allow cancellation of individual or all uploads ## Networking Requirements Integrations must: * Achieve minimum 50Mbps upload speeds (network conditions permitting) * Support WPA2 WiFi security (Ethernet optional but recommended) * Handle DHCP and static IP * Display clear network status (connection type, speed, health) * Switch networks without project re-pairing * Save known WiFi networks ## Testing Requirements C2C is designed for challenging conditions, requiring thorough testing across: Test all applicable connection types: * Commercial router with: - Hardline WAN - Bonded cellular modem - Commercial cellular modem - Hotspot-style modem * Meshed router setups (including 802.11r FT protocol) * Direct connections to various modem types * Unexpected power outages * Network disconnections * ISP issues * Corrupted media handling * Offline asset creation and reconnection ## Workflow Requirements C2C is an ecosystem, not just a feature. Device/application-specific requirements include: * Automatic recording trigger from camera * Flexible camera options * Timecode offset adjustment * Manual recording capability * Consistent filename handling * Accurate timecode synchronization * Matching filename/timecode/metadata with hero file/OCF * LTE-optimized (1-12Mbps bitrate) * Standard codec support for video and audio * Timecode streams for video/audio * Multi-format upload support (Proxy, OCF, LUT, WAV, RAW, JPG, HEIF, TIFF) * Project name change handling (use `project_id` instead of name strings) ## Quality Assurance At [Frame.io](http://frame.io/), quality is essential. Key test areas include: * Stable launch and operation * Project connection * Hardware code generation * Login/logout capability * Project/user info display * Device management * Asset upload * Format support * Upload resumption after interruptions * Progress display * Network status indication * 8-hour connection persistence * Cancellable authorization * Direct Frame.io connection * Credential security * Network speed optimization ## Future Improvements The [Frame.io](http://frame.io/) Camera to Cloud API evolves continuously. While maintaining backward compatibility, we welcome ongoing dialogue about future developments to keep our API aligned with real-world usage. ## That's all, folks! Congratulations on completing the UC2CIG (University of C2C Integration Guides)! We hope you found this guide valuable. Please share any feedback about unclear or missing information, or reach out with C2C-related questions. We're here to help! If you haven't already, please review the [Implementing C2C: Setting Up](./implementing-c2c-setting-up) guide before proceeding. You'll need the `access_token` obtained during the [authentication and authorization process](./implementing-c2c-authentication-and-authorization). This checklist builds on the [Basic Upload guide](./how-to-basic-upload) and [Advanced Uploads guide](./how-to-advanced-uploads). # Device Information GET https://api.frame.io/v2/devices/me Fetches information about the current device connection. Can be used to verify authorization token and returns information useful to present useful information in your user interface. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-identify ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/me: get: operationId: device-identify summary: Device Information description: >- Fetches information about the current device connection. Can be used to verify authorization token and returns information useful to present useful information in your user interface. tags: - subpackage_accounts parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: Device information response content: application/json: schema: $ref: '#/components/schemas/ProjectDevice' '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' servers: - url: https://api.frame.io components: schemas: ProjectDeviceStatus: type: string enum: - offline - online title: ProjectDeviceStatus ProjectDeviceAuthorizationType: type: string enum: - project_device_authorization title: ProjectDeviceAuthorizationType ProjectDeviceAuthorizationCreatorType: type: string enum: - user title: ProjectDeviceAuthorizationCreatorType ProjectDeviceAuthorizationCreator: type: object properties: _type: $ref: '#/components/schemas/ProjectDeviceAuthorizationCreatorType' id: type: string format: uuid name: type: string required: - _type - id - name title: ProjectDeviceAuthorizationCreator ProjectDeviceAuthorizationScopes: type: object properties: account_read: type: boolean action_create: type: boolean action_delete: type: boolean action_read: type: boolean action_update: type: boolean asset_create: type: boolean asset_delete: type: boolean asset_read: type: boolean asset_update: type: boolean auditlog_read: type: boolean comment_create: type: boolean comment_delete: type: boolean comment_read: type: boolean comment_update: type: boolean device_connect: type: boolean id: type: string offline: type: boolean presentation_create: type: boolean presentation_delete: type: boolean presentation_read: type: boolean presentation_update: type: boolean project_create: type: boolean project_delete: type: boolean project_read: type: boolean project_update: type: boolean reviewlink_create: type: boolean reviewlink_delete: type: boolean reviewlink_read: type: boolean reviewlink_update: type: boolean team_create: type: boolean team_read: type: boolean team_update: type: boolean webhook_create: type: boolean webhook_delete: type: boolean webhook_read: type: boolean webhook_update: type: boolean required: - account_read - action_create - action_delete - action_read - action_update - asset_create - asset_delete - asset_read - asset_update - auditlog_read - comment_create - comment_delete - comment_read - comment_update - device_connect - id - offline - presentation_create - presentation_delete - presentation_read - presentation_update - project_create - project_delete - project_read - project_update - reviewlink_create - reviewlink_delete - reviewlink_read - reviewlink_update - team_create - team_read - team_update - webhook_create - webhook_delete - webhook_read - webhook_update title: ProjectDeviceAuthorizationScopes ProjectDeviceAuthorization: type: object properties: _type: $ref: '#/components/schemas/ProjectDeviceAuthorizationType' creator: $ref: '#/components/schemas/ProjectDeviceAuthorizationCreator' creator_id: type: string format: uuid expires_at: type: - string - 'null' format: date-time id: type: string format: uuid inserted_at: type: string format: date-time project_device_id: type: string format: uuid scopes: $ref: '#/components/schemas/ProjectDeviceAuthorizationScopes' required: - _type - creator - creator_id - id - inserted_at - project_device_id - scopes description: Authorization details for a project device title: ProjectDeviceAuthorization ProjectArchiveStatus: type: string enum: - standard - archiving - unarchiving - archived description: Archival status for this Project title: ProjectArchiveStatus ProjectPreferences: type: object properties: collaborator_can_download: type: boolean collaborator_can_invite: type: boolean collaborator_can_share: type: boolean notify_on_new_asset: type: boolean notify_on_new_collaborator: type: boolean notify_on_new_comment: type: boolean notify_on_updated_label: type: boolean notify_slack: type: boolean title: ProjectPreferences Asset0: type: object properties: '': type: string title: Asset0 Asset: oneOf: - $ref: '#/components/schemas/Asset0' description: Accepts arbitrary key/value pairs for storing information on an asset title: Asset TeamAccess: type: string enum: - private - public - restricted title: TeamAccess TeamUserRole: type: object properties: {} title: TeamUserRole SessionWatermarkDataPointType: type: string enum: - email - username - ip_address - timestamp - custom_text - user_input title: SessionWatermarkDataPointType SessionWatermarkDataPoint: type: object properties: order: type: integer type: $ref: '#/components/schemas/SessionWatermarkDataPointType' value: type: string title: SessionWatermarkDataPoint SessionWatermarkBlockFontSize: type: string enum: - small - medium - large - huge default: medium title: SessionWatermarkBlockFontSize SessionWatermarkBlockPosition: type: string enum: - top_left - top_center - top_right - middle_left - middle_center - middle_right - bottom_left - bottom_center - bottom_right default: top_left title: SessionWatermarkBlockPosition SessionWatermarkBlockPositionReferencePoint: type: string enum: - top_left - top_center - top_right - middle_left - middle_center - middle_right - bottom_left - bottom_center - bottom_right title: SessionWatermarkBlockPositionReferencePoint SessionWatermarkBlockScrollText: type: string enum: - none - ltr - rtl default: none title: SessionWatermarkBlockScrollText SessionWatermarkBlockTextAlignment: type: string enum: - left - right - center default: left title: SessionWatermarkBlockTextAlignment SessionWatermarkBlock: type: object properties: alpha: type: number format: double default: 0.5 data_points: type: array items: $ref: '#/components/schemas/SessionWatermarkDataPoint' font_size: $ref: '#/components/schemas/SessionWatermarkBlockFontSize' default: medium name: type: string position: $ref: '#/components/schemas/SessionWatermarkBlockPosition' default: top_left position_reference_point: $ref: '#/components/schemas/SessionWatermarkBlockPositionReferencePoint' position_x: type: integer position_y: type: integer scroll_text: $ref: '#/components/schemas/SessionWatermarkBlockScrollText' default: none text_alignment: $ref: '#/components/schemas/SessionWatermarkBlockTextAlignment' default: left text_color: type: string default: '#FFFFFF' text_shadow: type: boolean default: false title: SessionWatermarkBlock SessionWatermarkTemplate: type: object properties: account_id: type: string format: uuid app_default: type: boolean default: false creator_id: type: string format: uuid id: type: string format: uuid name: type: string watermark_blocks: type: array items: $ref: '#/components/schemas/SessionWatermarkBlock' title: SessionWatermarkTemplate AdminOnlyAction: type: object properties: lifecycle: type: boolean default: false title: AdminOnlyAction TeamSlackWebhook: type: object properties: {} title: TeamSlackWebhook UserRoles: type: object properties: admin: type: boolean id: type: string sales: type: boolean support: type: boolean service_desk: type: boolean title: UserRoles User: type: object properties: digest_frequency: type: string features_seen: description: Any type profile_image_original: description: Any type image_32: type: string image_128: type: string from_google: type: boolean mfa_enforced_at: type: string email: type: string bio: description: Any type name: type: string image_64: type: string timezone_value: type: string account_id: type: string updated_at: type: string image_256: type: string _type: type: string user_hash: type: string context: description: Any type upload_url: type: string location: description: Any type phone: description: Any type deleted_at: description: Any type profile_image: type: string first_login_at: type: string joined_via: type: string email_confirm_by: description: Any type id: type: string next_digest_date: type: string email_preferences: description: Any type last_seen: type: string inserted_at: type: string from_adobe: type: boolean avatar_color: type: string highest_account_role: type: string integrations: type: array items: type: string roles: $ref: '#/components/schemas/UserRoles' user_default_color: type: string description: User model title: User AvailableFeatures: type: object properties: archival_storage: type: boolean custom_branded_emails: type: boolean custom_branded_presentations: type: boolean reel_player: type: boolean secure_sharing: type: boolean session_based_watermarking: type: boolean team_only_comments: type: boolean title: AvailableFeatures PlanPaymentMethod: type: string enum: - stripe - check title: PlanPaymentMethod PlanPeriod: type: string enum: - monthly - yearly - semiannually title: PlanPeriod PlanTier: type: string enum: - free - starter - pro - team - business - enterprise title: PlanTier Plan: type: object properties: archived_storage_limit: type: integer autoscaling: type: boolean available_features: $ref: '#/components/schemas/AvailableFeatures' collaborator_limit: type: integer cost: type: integer default_plan: type: boolean deleted_at: type: string format: date-time enterprise: type: boolean file_limit: type: integer id: type: string format: uuid inserted_at: type: string format: date-time lifetime_file_limit: type: integer member_limit: type: integer name: type: string payment_method: $ref: '#/components/schemas/PlanPaymentMethod' period: $ref: '#/components/schemas/PlanPeriod' project_limit: type: integer storage_limit: type: integer team_limit: type: integer tier: $ref: '#/components/schemas/PlanTier' title: type: string updated_at: type: string format: date-time user_limit: type: integer user_max: type: integer version: type: integer title: Plan Image: type: object properties: bucket: type: string key: type: string type: type: string default: image/jpeg uploaded: type: boolean default: false title: Image WatermarkImagePosition: type: string enum: - top_left - top_right - bottom_left - bottom_right default: top_left title: WatermarkImagePosition WatermarkImage: type: object properties: alpha: type: number format: double default: 0.5 image: $ref: '#/components/schemas/Image' position: $ref: '#/components/schemas/WatermarkImagePosition' default: top_left title: WatermarkImage WatermarkTextPosition: type: string enum: - top - center - bottom default: top title: WatermarkTextPosition WatermarkText: type: object properties: alpha: type: number format: double default: 0.5 lines: type: array items: type: string position: $ref: '#/components/schemas/WatermarkTextPosition' default: top title: WatermarkText Watermark: type: object properties: image: $ref: '#/components/schemas/WatermarkImage' text: $ref: '#/components/schemas/WatermarkText' title: Watermark Subscription: type: object properties: account_id: type: string format: uuid archived_storage_limit: type: integer balance: type: integer cancellation_option: type: string cancellation_reason: type: string cancelled_at: type: string format: date-time deleted_at: type: string format: date-time id: type: string format: uuid inserted_at: type: string format: date-time last_payment_at: type: string format: date-time member_limit: type: integer next_bill_at: type: string format: date-time on_trial: type: boolean plan: $ref: '#/components/schemas/Plan' plan_id: type: string format: uuid promotion_expires_at: type: string format: date-time promotion_id: type: string format: uuid requires_autoscaling: type: boolean storage_limit: type: integer subscription_end_at: type: string format: date-time total_archived_storage_limit: type: integer total_lifetime_file_limit: type: integer total_member_limit: type: integer total_project_limit: type: integer total_storage_limit: type: integer total_user_limit: type: integer updated_at: type: string format: date-time user_limit: type: integer title: Subscription AccountMemberRole: type: string enum: - admin - billing_manager - account_manager - member title: AccountMemberRole AccountMember: type: object properties: accepted_at: type: string format: date-time account_id: type: string format: uuid declined_at: type: string format: date-time deleted_at: type: string format: date-time inserted_at: type: string format: date-time role: $ref: '#/components/schemas/AccountMemberRole' updated_at: type: string format: date-time user_id: type: string format: uuid title: AccountMember Account: type: object properties: invoice_emails: type: array items: type: string city: type: string account_default_color: type: string company_name: type: string storage: type: integer file_count: type: integer owner: $ref: '#/components/schemas/User' upload_url: type: string deleted_at: type: string format: date-time line1: type: string postal_code: type: string vat: type: string company_address: type: string lifetime_file_count: type: integer state: type: string teams: type: array items: $ref: '#/components/schemas/Team' image_64: type: string archived_storage: type: integer image_128: type: string owner_id: type: string format: uuid user_count: type: integer locked_at: type: string format: date-time image: type: string team_count: type: integer collaborator_role_count: type: integer billing_emails: type: string image_32: type: string unpaid_at: type: string format: date-time inserted_at: type: string format: date-time updated_at: type: string format: date-time project_count: type: integer duration: type: integer delinquent_at: type: string format: date-time collaborator_count: type: integer plan: $ref: '#/components/schemas/Plan' watermark: $ref: '#/components/schemas/Watermark' folder_count: type: integer id: type: string format: uuid display_name: type: string country: type: string subscription: $ref: '#/components/schemas/Subscription' account_members: type: array items: $ref: '#/components/schemas/AccountMember' frames: type: integer member_count: type: integer image_256: type: string title: Account EmailBranding: type: object properties: accent_color: type: string background_color: type: string image: $ref: '#/components/schemas/Image' title: EmailBranding Team: type: object properties: account_id: type: string format: uuid disable_sbwm_internally: type: boolean default: false creator_id: type: string format: uuid storage: type: integer default: 0 default_font_color: type: string access: $ref: '#/components/schemas/TeamAccess' font_color: type: string user_role: $ref: '#/components/schemas/TeamUserRole' file_count: type: integer default: 0 default_session_watermark_template: $ref: '#/components/schemas/SessionWatermarkTemplate' link: type: string asset_lifecycle_policy: type: integer upload_url: type: string admin_only_actions: $ref: '#/components/schemas/AdminOnlyAction' deleted_at: type: string format: date-time default_background_color: type: string storage_limit: type: integer location: type: string name: type: string default_color: type: string slack_webhook: $ref: '#/components/schemas/TeamSlackWebhook' image_64: type: string archived_storage: type: integer default: 0 image_128: type: string solo: type: boolean default: false account: $ref: '#/components/schemas/Account' image_32: type: string inserted_at: type: string format: date-time updated_at: type: string format: date-time project_count: type: integer default: 0 duration: type: integer default: 0 team_image: type: string collaborator_count: type: integer default: 0 bio: type: string color: type: string email_branding: $ref: '#/components/schemas/EmailBranding' folder_count: type: integer default: 0 dark_theme: type: boolean default: false default_session_watermark_template_id: type: string format: uuid session_watermark_templates: type: array items: $ref: '#/components/schemas/SessionWatermarkTemplate' id: type: string format: uuid member_limit: type: integer frames: type: integer default: 0 member_count: type: integer default: 0 image_256: type: string background_color: type: string title: Team UserPermissions: type: object properties: can_download: type: boolean can_modify_template: type: boolean can_public_share_presentation: type: boolean can_public_share_review_link: type: boolean can_share_downloadable_presentation: type: boolean can_share_downloadable_review_link: type: boolean can_share_unwatermarked_presentation: type: boolean can_share_unwatermarked_review_link: type: boolean title: UserPermissions Project: type: object properties: archive_status: $ref: '#/components/schemas/ProjectArchiveStatus' description: Archival status for this Project archived_at: type: string format: date-time description: When a Project was archived archived_file_count: type: integer default: 0 archived_storage: type: integer default: 0 collaborator_count: type: integer default: 0 deleted_at: type: string format: date-time description: If deleted, when this Project was deleted description: type: string file_count: type: integer default: 0 folder_count: type: integer default: 0 id: type: string format: uuid ignore_archive: type: boolean default: false inserted_at: type: string format: date-time description: When was this Project created invite_url: type: string name: type: string description: Name of this Project owner_id: type: string format: uuid private: type: boolean default: false project_preferences: $ref: '#/components/schemas/ProjectPreferences' read_only: type: boolean default: false root_asset: $ref: '#/components/schemas/Asset' root_asset_id: type: string format: uuid shared: type: boolean default: false storage: type: integer default: 0 team: $ref: '#/components/schemas/Team' team_id: type: string format: uuid updated_at: type: string format: date-time user_permissions: $ref: '#/components/schemas/UserPermissions' user_preferences: $ref: '#/components/schemas/ProjectPreferences' watermark: $ref: '#/components/schemas/Watermark' title: Project ProjectDeviceChannelAssetType: type: string enum: - audio - video - data title: ProjectDeviceChannelAssetType ProjectDeviceChannelStatus: type: string enum: - offline - online title: ProjectDeviceChannelStatus ProjectDeviceChannel: type: object properties: _type: type: string default: project_device_channel id: type: string format: uuid actor_id: type: string format: uuid asset_type: $ref: '#/components/schemas/ProjectDeviceChannelAssetType' device_id: type: string format: uuid external_index: type: number format: double inserted_at: type: string format: date-time name: type: string description: Auto-generated name, based on the device model project_id: type: string description: The Project ID that this device is linked to project_device_id: type: string real_time_logging_capable: type: boolean default: false status: $ref: '#/components/schemas/ProjectDeviceChannelStatus' updated_at: type: string format: date-time title: ProjectDeviceChannel ProjectDevice: type: object properties: _type: type: string default: project_device description: Resource type identifier id: type: string format: uuid asset_type: type: string description: The type of asset that this device will be producing creator_id: type: string format: uuid deleted_at: type: string format: date-time device_id: type: string format: uuid inserted_at: type: string format: date-time last_seen_at: type: string format: date-time last_known_firmware_version: type: string description: The last known firmware version reported by the device name: type: string description: Name of this device as shown in the iOS app and web app project_id: type: string format: uuid description: The Project ID that this device is linked to updated_at: type: string status: $ref: '#/components/schemas/ProjectDeviceStatus' timezone: type: string authorization: $ref: '#/components/schemas/ProjectDeviceAuthorization' project: $ref: '#/components/schemas/Project' channels: type: array items: $ref: '#/components/schemas/ProjectDeviceChannel' channel_count: type: integer path_asset_type: type: string path_name: type: string required_metadata_attributes: type: array items: type: string description: >- Represents the correlation between a physical device and a Frame.io project. title: ProjectDevice HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python Device information with channels and authorization import requests url = "https://api.frame.io/v2/devices/me" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript Device information with channels and authorization const url = 'https://api.frame.io/v2/devices/me'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Device information with channels and authorization package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/me" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Device information with channels and authorization require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/me") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java Device information with channels and authorization import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v2/devices/me") .header("Authorization", "Bearer ") .asString(); ``` ```php Device information with channels and authorization request('GET', 'https://api.frame.io/v2/devices/me', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp Device information with channels and authorization using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/me"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift Device information with channels and authorization import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/me")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Heartbeat ping POST https://api.frame.io/v2/devices/heartbeat Ommit heartbeat event to Frame.io. This powers the device "online" status in the C2C Connections tab on iOS and Web. This should be called no more then once a minute, and no less than once every 5 minutes. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-heartbeat ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/heartbeat: post: operationId: device-heartbeat summary: Heartbeat ping description: >- Ommit heartbeat event to Frame.io. This powers the device "online" status in the C2C Connections tab on iOS and Web. This should be called no more then once a minute, and no less than once every 5 minutes. tags: - subpackage_devices parameters: - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: No Content content: application/json: schema: type: object properties: {} '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' servers: - url: https://api.frame.io components: schemas: HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/heartbeat" response = requests.post(url) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/heartbeat'; const options = {method: 'POST'}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/heartbeat" req, _ := http.NewRequest("POST", url, nil) res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/heartbeat") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/heartbeat") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/heartbeat'); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/heartbeat"); var request = new RestRequest(Method.POST); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/heartbeat")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create C2C asset POST https://api.frame.io/v2/devices/assets Content-Type: application/json Asset upload initiation specifically for C2C devices and applications. Note: This endpoint used to be `/v2/assets`, and while that endpoint will continue to function as normal, we suggest you use this one instead. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-asset-create ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/assets: post: operationId: device-asset-create summary: Create C2C asset description: >- Asset upload initiation specifically for C2C devices and applications. Note: This endpoint used to be `/v2/assets`, and while that endpoint will continue to function as normal, we suggest you use this one instead. tags: - subpackage_devices parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: >- Asset create success response. When `is_realtime_asset` was set to `true` in the request, a simplified payload will be returned. content: application/json: schema: $ref: '#/components/schemas/Devices_deviceAssetCreate_Response_200' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/HTTPError' '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/DeviceAssetCreateRequestConflictError' '429': description: Standard frame.io API error response. content: application/json: schema: $ref: '#/components/schemas/HTTPError' requestBody: description: >- While supported, we encourage you to switch from `application/x-ww-form-urlencoded` to `application/json` in order to support future workflows that will only be supported through JSON. When `is_realtime_upload` is `true`, call must be made in `application/json`. content: application/json: schema: type: object properties: name: type: string default: '' description: >- The name the asset should have in Frame.io. This value does not have to match the name of the file on disk; it can be whatever you want it to be in Frame.io. Required if `is_realtime_upload` is `false`. If `is_realtime_upload` is `true`, must containa valid extension in the form of `".[ext]"`, unless `extension` is provided, in which case this field may be `null` or omitted. extension: type: string description: >- Required when `is_realtime_upload` is `true`, when `name` is not known at time of asset creation. If `name` is provided, must match extension of that value. Ignored when `is_realtime_upload` is `false`. When supplied, asset will be creted with `name` value of `"[new file].extension"`. filetype: type: string description: >- MIME type like `video/quicktime`. Many languages have built in utilities for detecting file mimetype (see Go and Python for examples). Required if `is_realtime_upload` is `true`. auto_version_id: type: string format: uuid description: The asset you'd like this to be the next version of is_realtime_upload: type: boolean default: false description: >- If `true`, File data for this asset is to be uploaded through the Real-time Uploads API. If `false`, File data for this asset will be uploaded through the default API. Must be `false` if `filetype` is not `file`. filesize: $ref: >- #/components/schemas/V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaFilesize channel: $ref: >- #/components/schemas/V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaChannel offset: $ref: >- #/components/schemas/V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaOffset parts: $ref: >- #/components/schemas/V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaParts servers: - url: https://api.frame.io components: schemas: V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaFilesize: oneOf: - type: string - type: integer title: V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaFilesize V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaChannel: oneOf: - type: string - type: integer default: 0 title: V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaChannel V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaOffset: oneOf: - type: string - type: integer title: V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaOffset V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaParts: oneOf: - type: string - type: integer title: V2DevicesAssetsPostRequestBodyContentApplicationJsonSchemaParts Asset0: type: object properties: '': type: string title: Asset0 Asset: oneOf: - $ref: '#/components/schemas/Asset0' description: Accepts arbitrary key/value pairs for storing information on an asset title: Asset RealtimeAssetResponse: type: object properties: id: type: string format: uuid description: >- The ID for this asset, can be used in places like `https://app.frame.io/player/:id` to go directly to an asset. name: type: string description: Represents the name of the asset (filename). required: - id - name title: RealtimeAssetResponse Devices_deviceAssetCreate_Response_200: oneOf: - $ref: '#/components/schemas/Asset' - $ref: '#/components/schemas/RealtimeAssetResponse' title: Devices_deviceAssetCreate_Response_200 HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError V2DevicesAssetsPostResponsesContentApplicationJsonSchemaCode: type: string enum: - '409' title: V2DevicesAssetsPostResponsesContentApplicationJsonSchemaCode V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsCode: type: string enum: - '409' title: V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsCode V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsStatus: type: string enum: - '409' title: >- V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsStatus V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItems: type: object properties: code: $ref: >- #/components/schemas/V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsCode detail: type: string status: $ref: >- #/components/schemas/V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItemsStatus title: type: string required: - code - detail - status - title title: V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItems V2DevicesAssetsPostResponsesContentApplicationJsonSchemaMessage: type: string enum: - Channel Paused - invalid_client - slow_down title: V2DevicesAssetsPostResponsesContentApplicationJsonSchemaMessage DeviceAssetCreateRequestConflictError: type: object properties: code: $ref: >- #/components/schemas/V2DevicesAssetsPostResponsesContentApplicationJsonSchemaCode errors: type: array items: $ref: >- #/components/schemas/V2DevicesAssetsPostResponsesContentApplicationJsonSchemaErrorsItems message: $ref: >- #/components/schemas/V2DevicesAssetsPostResponsesContentApplicationJsonSchemaMessage required: - code - errors - message title: DeviceAssetCreateRequestConflictError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript Regular Upload const response = await fetch('https://api.frame.io/v2/devices/assets', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'my-video.mov', filetype: 'video/quicktime', filesize: 1073741824, is_realtime_upload: false }) }); const asset = await response.json(); console.log(asset); ``` ```python Regular Upload import requests headers = { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json' } data = { 'name': 'my-video.mov', 'filetype': 'video/quicktime', 'filesize': 1073741824, 'is_realtime_upload': False } response = requests.post( 'https://api.frame.io/v2/devices/assets', headers=headers, json=data ) asset = response.json() print(asset) ``` ```go Regular Upload package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/assets" payload := strings.NewReader("{\n \"body\": {\n \"name\": \"my-video.mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": false\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Regular Upload require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/assets") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"body\": {\n \"name\": \"my-video.mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": false\n }\n}" response = http.request(request) puts response.read_body ``` ```java Regular Upload import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/assets") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"body\": {\n \"name\": \"my-video.mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": false\n }\n}") .asString(); ``` ```php Regular Upload request('POST', 'https://api.frame.io/v2/devices/assets', [ 'body' => '{ "body": { "name": "my-video.mov", "filetype": "video/quicktime", "filesize": 1073741824, "is_realtime_upload": false } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Regular Upload using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/assets"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"body\": {\n \"name\": \"my-video.mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": false\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Regular Upload import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["body": [ "name": "my-video.mov", "filetype": "video/quicktime", "filesize": 1073741824, "is_realtime_upload": false ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/assets")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ```typescript Real-time Upload const response = await fetch('https://api.frame.io/v2/devices/assets', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json' }, body: JSON.stringify({ extension: '.mov', filetype: 'video/quicktime', filesize: 1073741824, is_realtime_upload: true, parts: 100 }) }); const asset = await response.json(); console.log(asset); ``` ```python Real-time Upload import requests headers = { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json' } data = { 'extension': '.mov', 'filetype': 'video/quicktime', 'filesize': 1073741824, 'is_realtime_upload': True, 'parts': 100 } response = requests.post( 'https://api.frame.io/v2/devices/assets', headers=headers, json=data ) asset = response.json() print(asset) ``` ```go Real-time Upload package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/assets" payload := strings.NewReader("{\n \"body\": {\n \"extension\": \".mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": true,\n \"parts\": 100\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Real-time Upload require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/assets") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"body\": {\n \"extension\": \".mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": true,\n \"parts\": 100\n }\n}" response = http.request(request) puts response.read_body ``` ```java Real-time Upload import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/assets") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"body\": {\n \"extension\": \".mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": true,\n \"parts\": 100\n }\n}") .asString(); ``` ```php Real-time Upload request('POST', 'https://api.frame.io/v2/devices/assets', [ 'body' => '{ "body": { "extension": ".mov", "filetype": "video/quicktime", "filesize": 1073741824, "is_realtime_upload": true, "parts": 100 } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Real-time Upload using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/assets"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"body\": {\n \"extension\": \".mov\",\n \"filetype\": \"video/quicktime\",\n \"filesize\": 1073741824,\n \"is_realtime_upload\": true,\n \"parts\": 100\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Real-time Upload import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["body": [ "extension": ".mov", "filetype": "video/quicktime", "filesize": 1073741824, "is_realtime_upload": true, "parts": 100 ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/assets")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Request upload URLs for real-time upload POST https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts Content-Type: application/json Register real-time upload parts and generate presigned AWS S3 upload PUT URLs. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-create-realtime-upload-parts ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/assets/{asset_id}/realtime_upload/parts: post: operationId: device-create-realtime-upload-parts summary: Request upload URLs for real-time upload description: >- Register real-time upload parts and generate presigned AWS S3 upload PUT URLs. tags: - subpackage_devices parameters: - name: asset_id in: path required: true schema: type: string - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: Returns array of upload URLs for created parts. content: application/json: schema: $ref: >- #/components/schemas/Devices_deviceCreateRealtimeUploadParts_Response_200 '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/HTTPError' '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '429': description: Standard frame.io API error response. content: application/json: schema: $ref: '#/components/schemas/HTTPError' requestBody: description: Enumerates parts that upload URLs should be created for. content: application/json: schema: type: object properties: parts: type: array items: $ref: >- #/components/schemas/V2DevicesAssetsAssetIdRealtimeUploadPartsPostRequestBodyContentApplicationJsonSchemaPartsItems description: List of file upload parts to register with Frame. asset_name: type: string description: >- Updates the asset name if only `extension` was supplied to assetCreate, and the default name is still in use. Otherwise, will be ignored. asset_filesize: type: integer description: >- The full filesize for the upload in bytes. This field is required when an object in `parts` has `is_final` set to `true`. Must be no more than 5 TiB. required: - parts servers: - url: https://api.frame.io components: schemas: V2DevicesAssetsAssetIdRealtimeUploadPartsPostRequestBodyContentApplicationJsonSchemaPartsItems: type: object properties: number: type: integer description: >- The part number/index, starting at 1. Part numbers may be skipped, and may be uploaded in any order, but will be used to concatinate the final file in sequentual order. Cannot be greater than 10,000 (the maximum number of parts that AWS allows). size: type: integer description: >- The size of the part in bytes. If the size does not abide by the [AWS Multi-Part upload restrictions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html), an error will be returned. For instance, must be greater than or equal to 5 MiB, (5,242,880 bytes) is `is_final` is not t`true`. is_final: type: boolean description: Whether this is the final part of the file. required: - number - size - is_final title: >- V2DevicesAssetsAssetIdRealtimeUploadPartsPostRequestBodyContentApplicationJsonSchemaPartsItems Devices_deviceCreateRealtimeUploadParts_Response_200: type: object properties: upload_urls: type: array items: type: string format: uri description: |- Array of AWS S3 presigned upload PUT URLs. Returned in the same order as the `parts` field of the request. required: - upload_urls title: Devices_deviceCreateRealtimeUploadParts_Response_200 HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript Request non-final part const response = await fetch('https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts', { method: 'POST', headers: { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' }, body: JSON.stringify({ parts: [ { number: 1, size: 10568125, is_final: false } ] }) }); const result = await response.json(); console.log(result); ``` ```python Request non-final part import requests headers = { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' } data = { 'parts': [ { 'number': 1, 'size': 10568125, 'is_final': False } ] } response = requests.post( 'https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts', headers=headers, json=data ) result = response.json() print(result) ``` ```go Request non-final part package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts" payload := strings.NewReader("{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Request non-final part require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}" response = http.request(request) puts response.read_body ``` ```java Request non-final part import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}") .asString(); ``` ```php Request non-final part request('POST', 'https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts', [ 'body' => '{ "parts": [ { "number": 1, "size": 10568125, "is_final": false } ] }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Request non-final part using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Request non-final part import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["parts": [ [ "number": 1, "size": 10568125, "is_final": false ] ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` ```typescript Request final part with filesize const response = await fetch('https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts', { method: 'POST', headers: { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' }, body: JSON.stringify({ asset_filesize: 21136250, parts: [ { number: 2, size: 10568125, is_final: true } ] }) }); const result = await response.json(); console.log(result); ``` ```python Request final part with filesize import requests headers = { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' } data = { 'asset_filesize': 21136250, 'parts': [ { 'number': 2, 'size': 10568125, 'is_final': True } ] } response = requests.post( 'https://api.frame.io/v2/devices/assets/{asset_id}/realtime_upload/parts', headers=headers, json=data ) result = response.json() print(result) ``` ```go Request final part with filesize package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts" payload := strings.NewReader("{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby Request final part with filesize require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}" response = http.request(request) puts response.read_body ``` ```java Request final part with filesize import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}") .asString(); ``` ```php Request final part with filesize request('POST', 'https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts', [ 'body' => '{ "parts": [ { "number": 1, "size": 10568125, "is_final": false } ] }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp Request final part with filesize using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"parts\": [\n {\n \"number\": 1,\n \"size\": 10568125,\n \"is_final\": false\n }\n ]\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Request final part with filesize import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["parts": [ [ "number": 1, "size": 10568125, "is_final": false ] ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/assets/:asset_id/realtime_upload/parts")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Create a Comment from a C2C device POST https://api.frame.io/v2/devices/assets/{asset_id}/comments Content-Type: application/json Leave a comment on an Asset from a paired C2C device. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/create-comment-c-2-c ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/assets/{asset_id}/comments: post: operationId: create-comment-c-2-c summary: Create a Comment from a C2C device description: Leave a comment on an Asset from a paired C2C device. tags: - subpackage_devices parameters: - name: asset_id in: path required: true schema: type: string - name: Authorization in: header description: Bearer authentication required: true schema: type: string responses: '200': description: C2C Comment success response content: application/json: schema: $ref: '#/components/schemas/Devices_createCommentC2C_Response_200' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/HTTPError' '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '429': description: Standard frame.io API error response. content: application/json: schema: $ref: '#/components/schemas/HTTPError' requestBody: description: Comment to create or update content: application/json: schema: type: object properties: text: type: string description: The body of the comment. timestamp: type: number format: double description: >- Timestamp for the comment, in frames, starting at 0. Comments can be "global" to an asset in which you don't provide the timestamp. required: - text servers: - url: https://api.frame.io components: schemas: UserRoles: type: object properties: admin: type: boolean id: type: string sales: type: boolean support: type: boolean service_desk: type: boolean title: UserRoles User: type: object properties: digest_frequency: type: string features_seen: description: Any type profile_image_original: description: Any type image_32: type: string image_128: type: string from_google: type: boolean mfa_enforced_at: type: string email: type: string bio: description: Any type name: type: string image_64: type: string timezone_value: type: string account_id: type: string updated_at: type: string image_256: type: string _type: type: string user_hash: type: string context: description: Any type upload_url: type: string location: description: Any type phone: description: Any type deleted_at: description: Any type profile_image: type: string first_login_at: type: string joined_via: type: string email_confirm_by: description: Any type id: type: string next_digest_date: type: string email_preferences: description: Any type last_seen: type: string inserted_at: type: string from_adobe: type: boolean avatar_color: type: string highest_account_role: type: string integrations: type: array items: type: string roles: $ref: '#/components/schemas/UserRoles' user_default_color: type: string description: User model title: User Devices_createCommentC2C_Response_200: type: object properties: annotation: type: string completed: type: boolean completed_at: type: string completer_id: type: string format: uuid has_replies: type: boolean id: type: string format: uuid like_count: type: integer owner: $ref: '#/components/schemas/User' owner_id: type: string format: uuid text: type: string timestamp: type: integer _type: type: string anonymous_user_id: type: string format: uuid aspect_ratio: type: number format: double asset_id: type: string format: uuid comment_entities: type: array items: description: Any type deleted_at: type: string device_channel_input_id: type: string duration: type: integer fov: type: integer frame: type: number format: double inserted_at: type: string page: type: integer parent_id: type: string format: uuid pitch: type: integer private: type: boolean read_count: type: integer review_link_id: type: string format: uuid target_asset_id: type: string format: uuid text_edited_at: type: string thumb: type: string timestamp_microseconds: type: integer updated_at: type: string yaw: type: integer title: Devices_createCommentC2C_Response_200 HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python response import requests url = "https://api.frame.io/v2/devices/assets/asset_id/comments" payload = { "text": "Great shot! The lighting here really enhances the mood." } headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript response const url = 'https://api.frame.io/v2/devices/assets/asset_id/comments'; const options = { method: 'POST', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '{"text":"Great shot! The lighting here really enhances the mood."}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go response package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/assets/asset_id/comments" payload := strings.NewReader("{\n \"text\": \"Great shot! The lighting here really enhances the mood.\"\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby response require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/assets/asset_id/comments") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"text\": \"Great shot! The lighting here really enhances the mood.\"\n}" response = http.request(request) puts response.read_body ``` ```java response import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/assets/asset_id/comments") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"text\": \"Great shot! The lighting here really enhances the mood.\"\n}") .asString(); ``` ```php response request('POST', 'https://api.frame.io/v2/devices/assets/asset_id/comments', [ 'body' => '{ "text": "Great shot! The lighting here really enhances the mood." }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp response using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/assets/asset_id/comments"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"text\": \"Great shot! The lighting here really enhances the mood.\"\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift response import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["text": "Great shot! The lighting here really enhances the mood."] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/assets/asset_id/comments")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Request device code POST https://api.frame.io/v2/auth/device/code Content-Type: multipart/form-data Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/authentication/device-request-code ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/auth/device/code: post: operationId: device-request-code summary: Request device code description: '' tags: - subpackage_authentication parameters: - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 - name: x-client-platypus-enabled in: header description: >- Enable URL Pairing mode for C2C device code requests. Set to 'true' to enable. required: false schema: $ref: >- #/components/schemas/V2AuthDeviceCodePostParametersXClientPlatypusEnabled responses: '200': description: Successful request content: application/json: schema: $ref: >- #/components/schemas/Authentication_deviceRequestCode_Response_200 requestBody: description: '' content: multipart/form-data: schema: type: object properties: client_id: type: string description: >- A unique identifier for the physical hardware device. This value needs to be guaranteed to be unique for the device. This could be a serial number or a randomly generated UUID. client_secret: type: string description: >- This will be issued to you by Frame.io support and identifies the your device model. This value should be kept secret from the user, and should be encrypted at rest scope: type: string description: >- Space-delimited list of permissions being requested. Hardware devices can request the following scopes: 'asset_create' (create assets), 'offline' (refresh tokens). Typically both are requested together. required: - client_id - client_secret - scope servers: - url: https://api.frame.io components: schemas: V2AuthDeviceCodePostParametersXClientPlatypusEnabled: type: string enum: - 'true' title: V2AuthDeviceCodePostParametersXClientPlatypusEnabled Authentication_deviceRequestCode_Response_200: type: object properties: device_code: type: string description: >- The device code should be hidden from the user, and is used to identify this authorization request when polling to see if the user has entered their code successfully. expires_in: type: number format: double description: The number of seconds until this code expires. interval: type: number format: double description: >- How long the we should wait between polling requests to see if the user has entered the code. name: type: string description: The name of the device we are trying to connect. user_code: type: string description: >- The six-digit code the user will enter into Frame.io to pair the device to a project. verification_uri: type: string format: uri description: The URL where the user should go to enter the pairing code. verification_uri_complete: type: string format: uri description: >- A complete URL with the user code pre-filled, which can be used to streamline the pairing process. required: - device_code - expires_in - interval - name - user_code - verification_uri title: Authentication_deviceRequestCode_Response_200 ``` ## SDK Code Examples ```typescript const formData = new FormData(); formData.append('client_id', 'your-client-id'); formData.append('client_secret', 'your-client-secret'); formData.append('scope', 'asset_create offline'); const response = await fetch('https://api.frame.io/v2/auth/device/code', { method: 'POST', headers: { 'x-client-platypus-enabled': 'true', 'x-client-version': '1.0.0' }, body: formData }); const result = await response.json(); console.log(result); ``` ```python import requests headers = { 'x-client-platypus-enabled': 'true', 'x-client-version': '1.0.0' } data = { 'client_id': 'your-client-id', 'client_secret': 'your-client-secret', 'scope': 'asset_create offline' } response = requests.post( 'https://api.frame.io/v2/auth/device/code', headers=headers, data=data ) result = response.json() print(result) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/auth/device/code" payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scope\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/auth/device/code") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001' request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scope\"\r\n\r\n\r\n-----011000010111000001101001--\r\n" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/auth/device/code") .header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") .body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scope\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/auth/device/code', [ 'headers' => [ 'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/auth/device/code"); var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001"); request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scope\"\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Content-Type": "multipart/form-data; boundary=---011000010111000001101001"] let parameters = [ [ "name": "client_id", "value": ], [ "name": "client_secret", "value": ], [ "name": "scope", "value": ] ] let boundary = "---011000010111000001101001" var body = "" var error: NSError? = nil for param in parameters { let paramName = param["name"]! body += "--\(boundary)\r\n" body += "Content-Disposition:form-data; name=\"\(paramName)\"" if let filename = param["fileName"] { let contentType = param["content-type"]! let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8) if (error != nil) { print(error as Any) } body += "; filename=\"\(filename)\"\r\n" body += "Content-Type: \(contentType)\r\n\r\n" body += fileContent } else if let paramValue = param["value"] { body += "\r\n\r\n\(paramValue)" } } let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/auth/device/code")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Device Token Exchange POST https://api.frame.io/v2/auth/token Content-Type: multipart/form-data OAuth 2.0 token endpoint for device authorization. Supports multiple grant types: polling for device authorization (device_code) and refreshing tokens (refresh_token). Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/authentication/auth-device-token ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/auth/token: post: operationId: auth-device-token summary: Device Token Exchange description: >- OAuth 2.0 token endpoint for device authorization. Supports multiple grant types: polling for device authorization (device_code) and refreshing tokens (refresh_token). tags: - subpackage_authentication responses: '200': description: OK content: application/json: schema: $ref: >- #/components/schemas/Authentication_authDeviceToken_Response_200 requestBody: description: '' content: multipart/form-data: schema: type: object properties: client_id: type: string description: >- Must be a unique identifier per hardware device, such as a unique hardware serial number. Must be the same as the client id used on initial authorization. client_secret: type: string description: >- A static string, provided by Frame.io to be embedded for a device manufacturer/model. Acts as an identifier within Frame.io. grant_type: $ref: >- #/components/schemas/V2AuthTokenPostRequestBodyContentMultipartFormDataSchemaGrantType description: >- Grant type - use 'urn:ietf:params:oauth:grant-type:device_code' for polling, or 'refresh_token' for refreshing an access token device_code: type: string description: >- The device code received from the /v2/auth/device/code endpoint. Required when grant_type is 'urn:ietf:params:oauth:grant-type:device_code'. refresh_token: type: string description: >- A valid refresh_token from a previous authorization. Refresh tokens are valid for 14 days from issuance. Required when grant_type is 'refresh_token'. required: - client_id - client_secret - grant_type servers: - url: https://api.frame.io components: schemas: V2AuthTokenPostRequestBodyContentMultipartFormDataSchemaGrantType: type: string enum: - urn:ietf:params:oauth:grant-type:device_code - refresh_token description: >- Grant type - use 'urn:ietf:params:oauth:grant-type:device_code' for polling, or 'refresh_token' for refreshing an access token title: V2AuthTokenPostRequestBodyContentMultipartFormDataSchemaGrantType Authentication_authDeviceToken_Response_200: type: object properties: {} description: Empty response body title: Authentication_authDeviceToken_Response_200 ``` ## SDK Code Examples ```typescript const formData = new FormData(); formData.append('grant_type', 'urn:ietf:params:oauth:grant-type:device_code'); formData.append('device_code', 'YOUR_DEVICE_CODE_FROM_STEP_1'); formData.append('client_id', 'YOUR_CLIENT_ID'); formData.append('client_secret', 'YOUR_CLIENT_SECRET'); const response = await fetch('https://api.frame.io/v2/auth/token', { method: 'POST', body: formData }); const result = await response.json(); console.log(result); ``` ```python import requests data = { 'grant_type': 'urn:ietf:params:oauth:grant-type:device_code', 'device_code': 'YOUR_DEVICE_CODE_FROM_STEP_1', 'client_id': 'YOUR_CLIENT_ID', 'client_secret': 'YOUR_CLIENT_SECRET' } response = requests.post( 'https://api.frame.io/v2/auth/token', data=data ) result = response.json() print(result) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/auth/token" payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grant_type\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device_code\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"refresh_token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/auth/token") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001' request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grant_type\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device_code\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"refresh_token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/auth/token") .header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") .body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grant_type\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device_code\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"refresh_token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/auth/token', [ 'headers' => [ 'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/auth/token"); var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001"); request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grant_type\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device_code\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"refresh_token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Content-Type": "multipart/form-data; boundary=---011000010111000001101001"] let parameters = [ [ "name": "client_id", "value": ], [ "name": "client_secret", "value": ], [ "name": "grant_type", "value": ], [ "name": "device_code", "value": ], [ "name": "refresh_token", "value": ] ] let boundary = "---011000010111000001101001" var body = "" var error: NSError? = nil for param in parameters { let paramName = param["name"]! body += "--\(boundary)\r\n" body += "Content-Disposition:form-data; name=\"\(paramName)\"" if let filename = param["fileName"] { let contentType = param["content-type"]! let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8) if (error != nil) { print(error as Any) } body += "; filename=\"\(filename)\"\r\n" body += "Content-Type: \(contentType)\r\n\r\n" body += fileContent } else if let paramValue = param["value"] { body += "\r\n\r\n\(paramValue)" } } let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/auth/token")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Revoke Device Authorization POST https://api.frame.io/v2/auth/revoke Content-Type: multipart/form-data Revoke device authorization Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/authentication/auth-device-revoke-token ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/auth/revoke: post: operationId: auth-device-revoke-token summary: Revoke Device Authorization description: Revoke device authorization tags: - subpackage_authentication parameters: - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: '' content: application/json: schema: $ref: >- #/components/schemas/Authentication_authDeviceRevokeToken_Response_200 requestBody: description: '' content: multipart/form-data: schema: type: object properties: client_id: type: string description: >- Must be a unique identifier per hardware device, such as a unique hardware serial number. Must be the same `client_id` used on initial authorization. client_secret: type: string description: >- A static string, provided by Frame.io to be embedded for a device manufacturer/model. Acts as an identifier within Frame.io. token: type: string required: - client_id - client_secret - token servers: - url: https://api.frame.io components: schemas: Authentication_authDeviceRevokeToken_Response_200: type: object properties: {} title: Authentication_authDeviceRevokeToken_Response_200 ``` ## SDK Code Examples ```typescript const formData = new FormData(); formData.append('client_id', 'your-client-id'); formData.append('client_secret', 'your-client-secret'); formData.append('token', 'access_or_refresh_token'); const response = await fetch('https://api.frame.io/v2/auth/revoke', { method: 'POST', headers: { 'x-client-version': '1.0.0' }, body: formData }); const result = await response.json(); console.log(result); ``` ```python import requests headers = { 'x-client-version': '1.0.0' } data = { 'client_id': 'your-client-id', 'client_secret': 'your-client-secret', 'token': 'access_or_refresh_token' } response = requests.post( 'https://api.frame.io/v2/auth/revoke', headers=headers, data=data ) result = response.json() print(result) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/auth/revoke" payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/auth/revoke") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001' request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/auth/revoke") .header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001") .body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/auth/revoke', [ 'headers' => [ 'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/auth/revoke"); var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "multipart/form-data; boundary=---011000010111000001101001"); request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"client_secret\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Content-Type": "multipart/form-data; boundary=---011000010111000001101001"] let parameters = [ [ "name": "client_id", "value": ], [ "name": "client_secret", "value": ], [ "name": "token", "value": ] ] let boundary = "---011000010111000001101001" var body = "" var error: NSError? = nil for param in parameters { let paramName = param["name"]! body += "--\(boundary)\r\n" body += "Content-Disposition:form-data; name=\"\(paramName)\"" if let filename = param["fileName"] { let contentType = param["content-type"]! let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8) if (error != nil) { print(error as Any) } body += "; filename=\"\(filename)\"\r\n" body += "Content-Type: \(contentType)\r\n\r\n" body += fileContent } else if let paramValue = param["value"] { body += "\r\n\r\n\(paramValue)" } } let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/auth/revoke")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Connect a new device channel POST https://api.frame.io/v2/devices/channels Content-Type: application/json We can connect a new channel with the following request Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-channels/connect-device-channel ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/channels: post: operationId: connect-device-channel summary: Connect a new device channel description: We can connect a new channel with the following request tags: - subpackage_devices parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: Example response content: application/json: schema: $ref: '#/components/schemas/ProjectDeviceChannel' '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '409': description: Device channel already exists content: application/json: schema: $ref: '#/components/schemas/HTTPError' requestBody: description: Payload content: application/json: schema: type: object properties: client_id: type: string format: uuid device_model_id: type: string format: uuid required: - client_id - device_model_id servers: - url: https://api.frame.io components: schemas: ProjectDeviceChannelAssetType: type: string enum: - audio - video - data title: ProjectDeviceChannelAssetType ProjectDeviceChannelStatus: type: string enum: - offline - online title: ProjectDeviceChannelStatus ProjectDeviceChannel: type: object properties: _type: type: string default: project_device_channel id: type: string format: uuid actor_id: type: string format: uuid asset_type: $ref: '#/components/schemas/ProjectDeviceChannelAssetType' device_id: type: string format: uuid external_index: type: number format: double inserted_at: type: string format: date-time name: type: string description: Auto-generated name, based on the device model project_id: type: string description: The Project ID that this device is linked to project_device_id: type: string real_time_logging_capable: type: boolean default: false status: $ref: '#/components/schemas/ProjectDeviceChannelStatus' updated_at: type: string format: date-time title: ProjectDeviceChannel HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript const response = await fetch('https://api.frame.io/v2/devices/channels/connect', { method: 'POST', headers: { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' }, body: JSON.stringify({ client_id: '[client_id]', device_model_id: '[device_model_id]' }) }); const result = await response.json(); console.log(result); ``` ```python import requests headers = { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' } data = { 'client_id': '[client_id]', 'device_model_id': '[device_model_id]' } response = requests.post( 'https://api.frame.io/v2/devices/channels/connect', headers=headers, json=data ) result = response.json() print(result) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/channels" payload := strings.NewReader("{\n \"body\": {\n \"client_id\": \"[client_id]\",\n \"device_model_id\": \"[device_model_id]\"\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/channels") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"body\": {\n \"client_id\": \"[client_id]\",\n \"device_model_id\": \"[device_model_id]\"\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/channels") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"body\": {\n \"client_id\": \"[client_id]\",\n \"device_model_id\": \"[device_model_id]\"\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/channels', [ 'body' => '{ "body": { "client_id": "[client_id]", "device_model_id": "[device_model_id]" } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/channels"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"body\": {\n \"client_id\": \"[client_id]\",\n \"device_model_id\": \"[device_model_id]\"\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["body": [ "client_id": "[client_id]", "device_model_id": "[device_model_id]" ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/channels")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Disconnect a specific device channel POST https://api.frame.io/v2/devices/channels/{channel_id}/disconnect Disconnect a device channel with the following request Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-channels/disconnect-device-channel ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/channels/{channel_id}/disconnect: post: operationId: disconnect-device-channel summary: Disconnect a specific device channel description: Disconnect a device channel with the following request tags: - subpackage_devices parameters: - name: channel_id in: path description: Device channel id required: true schema: type: string - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: OK content: application/json: schema: type: object properties: {} '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found response content: application/json: schema: $ref: '#/components/schemas/HTTPError' servers: - url: https://api.frame.io components: schemas: HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/channels/channel_id/disconnect" headers = {"Authorization": "Bearer "} response = requests.post(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/channels/channel_id/disconnect'; const options = {method: 'POST', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/channels/channel_id/disconnect" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/channels/channel_id/disconnect") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/channels/channel_id/disconnect") .header("Authorization", "Bearer ") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/channels/channel_id/disconnect', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/channels/channel_id/disconnect"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/channels/channel_id/disconnect")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Disconnect all device channels POST https://api.frame.io/v2/devices/channels/disconnect Disconnects all connected device channels Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-channels/disconnect-all-device-channels ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/channels/disconnect: post: operationId: disconnect-all-device-channels summary: Disconnect all device channels description: Disconnects all connected device channels tags: - subpackage_devices parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: OK content: application/json: schema: type: object properties: {} '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' servers: - url: https://api.frame.io components: schemas: HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/channels/disconnect" headers = {"Authorization": "Bearer "} response = requests.post(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/channels/disconnect'; const options = {method: 'POST', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/channels/disconnect" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/channels/disconnect") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/channels/disconnect") .header("Authorization", "Bearer ") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/channels/disconnect', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/channels/disconnect"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/channels/disconnect")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Trigger a real-time logging event POST https://api.frame.io/v2/devices/channels/{channel_id}/inputs/{input_index}/trigger Content-Type: application/json Triggers an event on the device channel. Can be used for logging a quick comment, or for other things that haven't been dreamed up yet! Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/device-channels/trigger-realtime-logging-event ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/channels/{channel_id}/inputs/{input_index}/trigger: post: operationId: trigger-realtime-logging-event summary: Trigger a real-time logging event description: |- Triggers an event on the device channel. Can be used for logging a quick comment, or for other things that haven't been dreamed up yet! tags: - subpackage_devices parameters: - name: channel_id in: path description: Device channel id required: true schema: type: string format: uuid - name: input_index in: path description: An 0-indexed integer that will be used to identify the input required: true schema: type: integer - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: OK content: application/json: schema: type: object properties: {} '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' requestBody: content: application/json: schema: type: object properties: action_type: $ref: >- #/components/schemas/V2DevicesChannelsChannelIdInputsInputIndexTriggerPostRequestBodyContentApplicationJsonSchemaActionType offset: type: integer start: $ref: '#/components/schemas/SMPTETimeRepresentation' duration: $ref: '#/components/schemas/SMPTETimeRepresentation' servers: - url: https://api.frame.io components: schemas: V2DevicesChannelsChannelIdInputsInputIndexTriggerPostRequestBodyContentApplicationJsonSchemaActionType: type: string enum: - single_press title: >- V2DevicesChannelsChannelIdInputsInputIndexTriggerPostRequestBodyContentApplicationJsonSchemaActionType SmpteTimeRepresentationRateNtsc: type: string enum: - ntsc description: >- The NTSC standard of the timecode. Can be `"non_drop"` or `null`. If `null`, playback must represent a whole-number value, such as `[24, 1]`. If `"non_drop"`, playback must represent a valid NTSC framerate, such as `[24000, 1001]`. title: SmpteTimeRepresentationRateNtsc SmpteTimeRepresentationRate: type: object properties: playback: type: array items: type: integer description: >- Playback speed of the framerate, represented as a `[numerator, denominator]` pair in an array. Optionally, this field also accepts fractions in string format, `"numerator/denominator"`. NTSC framerates like 23.98 should be sent as they're fully qualified rational value: `[24000, 1001]`. ntsc: oneOf: - $ref: '#/components/schemas/SmpteTimeRepresentationRateNtsc' - type: 'null' description: >- The NTSC standard of the timecode. Can be `"non_drop"` or `null`. If `null`, playback must represent a whole-number value, such as `[24, 1]`. If `"non_drop"`, playback must represent a valid NTSC framerate, such as `[24000, 1001]`. description: Framerate of the timecode stream title: SmpteTimeRepresentationRate SMPTETimeRepresentation: type: object properties: smpte_timecode: type: string description: |- Timecode represented as a SMPTE string, Learn more about timecode [here](https://workflow.frame.io/guide/timecode)! rate: $ref: '#/components/schemas/SmpteTimeRepresentationRate' description: Framerate of the timecode stream title: SMPTETimeRepresentation HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```typescript const response = await fetch('https://api.frame.io/v2/devices/channels/{channel_id}/inputs/{input_index}/trigger', { method: 'POST', headers: { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' }, body: JSON.stringify({ action_type: 'single_press', offset: 0, start: { smpte_timecode: '01:00:00:00', rate: { playback: [24000, 1001], ntsc: 'non_drop' } }, duration: { smpte_timecode: '00:00:00:01', rate: { playback: [24000, 1001], ntsc: 'non_drop' } } }) }); const result = await response.json(); console.log(result); ``` ```python import requests headers = { 'Authorization': 'Bearer [access_token]', 'Content-Type': 'application/json', 'x-client-version': '2.0.0' } data = { 'action_type': 'single_press', 'offset': 0, 'start': { 'smpte_timecode': '01:00:00:00', 'rate': { 'playback': [24000, 1001], 'ntsc': 'non_drop' } }, 'duration': { 'smpte_timecode': '00:00:00:01', 'rate': { 'playback': [24000, 1001], 'ntsc': 'non_drop' } } } response = requests.post( 'https://api.frame.io/v2/devices/channels/{channel_id}/inputs/{input_index}/trigger', headers=headers, json=data ) result = response.json() print(result) ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger" payload := strings.NewReader("{\n \"body\": {\n \"action_type\": \"single_press\",\n \"offset\": 0,\n \"start\": {\n \"smpte_timecode\": \"01:00:00:00\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n },\n \"duration\": {\n \"smpte_timecode\": \"00:00:00:01\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n }\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{\n \"body\": {\n \"action_type\": \"single_press\",\n \"offset\": 0,\n \"start\": {\n \"smpte_timecode\": \"01:00:00:00\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n },\n \"duration\": {\n \"smpte_timecode\": \"00:00:00:01\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n }\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"body\": {\n \"action_type\": \"single_press\",\n \"offset\": 0,\n \"start\": {\n \"smpte_timecode\": \"01:00:00:00\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n },\n \"duration\": {\n \"smpte_timecode\": \"00:00:00:01\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n }\n }\n}") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger', [ 'body' => '{ "body": { "action_type": "single_press", "offset": 0, "start": { "smpte_timecode": "01:00:00:00", "rate": { "playback": [ 24000, 1001 ], "ntsc": "non_drop" } }, "duration": { "smpte_timecode": "00:00:00:01", "rate": { "playback": [ 24000, 1001 ], "ntsc": "non_drop" } } } }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"body\": {\n \"action_type\": \"single_press\",\n \"offset\": 0,\n \"start\": {\n \"smpte_timecode\": \"01:00:00:00\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n },\n \"duration\": {\n \"smpte_timecode\": \"00:00:00:01\",\n \"rate\": {\n \"playback\": [\n 24000,\n 1001\n ],\n \"ntsc\": \"non_drop\"\n }\n }\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = ["body": [ "action_type": "single_press", "offset": 0, "start": [ "smpte_timecode": "01:00:00:00", "rate": [ "playback": [24000, 1001], "ntsc": "non_drop" ] ], "duration": [ "smpte_timecode": "00:00:00:01", "rate": [ "playback": [24000, 1001], "ntsc": "non_drop" ] ] ]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/channels/:channel_id/inputs/:input_index/trigger")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Connect device POST https://api.frame.io/v2/devices/connect Connect to the provided C2C Project. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/applications-auth/device-project-connect ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/connect: post: operationId: device-project-connect summary: Connect device description: Connect to the provided C2C Project. tags: - subpackage_devices parameters: - name: project_id in: query description: The `project_id` you intend to connect to required: false schema: type: string - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: Succesful response after identifying the device. content: application/json: schema: $ref: '#/components/schemas/ProjectDevice' servers: - url: https://api.frame.io components: schemas: ProjectDeviceStatus: type: string enum: - offline - online title: ProjectDeviceStatus ProjectDeviceAuthorizationType: type: string enum: - project_device_authorization title: ProjectDeviceAuthorizationType ProjectDeviceAuthorizationCreatorType: type: string enum: - user title: ProjectDeviceAuthorizationCreatorType ProjectDeviceAuthorizationCreator: type: object properties: _type: $ref: '#/components/schemas/ProjectDeviceAuthorizationCreatorType' id: type: string format: uuid name: type: string required: - _type - id - name title: ProjectDeviceAuthorizationCreator ProjectDeviceAuthorizationScopes: type: object properties: account_read: type: boolean action_create: type: boolean action_delete: type: boolean action_read: type: boolean action_update: type: boolean asset_create: type: boolean asset_delete: type: boolean asset_read: type: boolean asset_update: type: boolean auditlog_read: type: boolean comment_create: type: boolean comment_delete: type: boolean comment_read: type: boolean comment_update: type: boolean device_connect: type: boolean id: type: string offline: type: boolean presentation_create: type: boolean presentation_delete: type: boolean presentation_read: type: boolean presentation_update: type: boolean project_create: type: boolean project_delete: type: boolean project_read: type: boolean project_update: type: boolean reviewlink_create: type: boolean reviewlink_delete: type: boolean reviewlink_read: type: boolean reviewlink_update: type: boolean team_create: type: boolean team_read: type: boolean team_update: type: boolean webhook_create: type: boolean webhook_delete: type: boolean webhook_read: type: boolean webhook_update: type: boolean required: - account_read - action_create - action_delete - action_read - action_update - asset_create - asset_delete - asset_read - asset_update - auditlog_read - comment_create - comment_delete - comment_read - comment_update - device_connect - id - offline - presentation_create - presentation_delete - presentation_read - presentation_update - project_create - project_delete - project_read - project_update - reviewlink_create - reviewlink_delete - reviewlink_read - reviewlink_update - team_create - team_read - team_update - webhook_create - webhook_delete - webhook_read - webhook_update title: ProjectDeviceAuthorizationScopes ProjectDeviceAuthorization: type: object properties: _type: $ref: '#/components/schemas/ProjectDeviceAuthorizationType' creator: $ref: '#/components/schemas/ProjectDeviceAuthorizationCreator' creator_id: type: string format: uuid expires_at: type: - string - 'null' format: date-time id: type: string format: uuid inserted_at: type: string format: date-time project_device_id: type: string format: uuid scopes: $ref: '#/components/schemas/ProjectDeviceAuthorizationScopes' required: - _type - creator - creator_id - id - inserted_at - project_device_id - scopes description: Authorization details for a project device title: ProjectDeviceAuthorization ProjectArchiveStatus: type: string enum: - standard - archiving - unarchiving - archived description: Archival status for this Project title: ProjectArchiveStatus ProjectPreferences: type: object properties: collaborator_can_download: type: boolean collaborator_can_invite: type: boolean collaborator_can_share: type: boolean notify_on_new_asset: type: boolean notify_on_new_collaborator: type: boolean notify_on_new_comment: type: boolean notify_on_updated_label: type: boolean notify_slack: type: boolean title: ProjectPreferences Asset0: type: object properties: '': type: string title: Asset0 Asset: oneOf: - $ref: '#/components/schemas/Asset0' description: Accepts arbitrary key/value pairs for storing information on an asset title: Asset TeamAccess: type: string enum: - private - public - restricted title: TeamAccess TeamUserRole: type: object properties: {} title: TeamUserRole SessionWatermarkDataPointType: type: string enum: - email - username - ip_address - timestamp - custom_text - user_input title: SessionWatermarkDataPointType SessionWatermarkDataPoint: type: object properties: order: type: integer type: $ref: '#/components/schemas/SessionWatermarkDataPointType' value: type: string title: SessionWatermarkDataPoint SessionWatermarkBlockFontSize: type: string enum: - small - medium - large - huge default: medium title: SessionWatermarkBlockFontSize SessionWatermarkBlockPosition: type: string enum: - top_left - top_center - top_right - middle_left - middle_center - middle_right - bottom_left - bottom_center - bottom_right default: top_left title: SessionWatermarkBlockPosition SessionWatermarkBlockPositionReferencePoint: type: string enum: - top_left - top_center - top_right - middle_left - middle_center - middle_right - bottom_left - bottom_center - bottom_right title: SessionWatermarkBlockPositionReferencePoint SessionWatermarkBlockScrollText: type: string enum: - none - ltr - rtl default: none title: SessionWatermarkBlockScrollText SessionWatermarkBlockTextAlignment: type: string enum: - left - right - center default: left title: SessionWatermarkBlockTextAlignment SessionWatermarkBlock: type: object properties: alpha: type: number format: double default: 0.5 data_points: type: array items: $ref: '#/components/schemas/SessionWatermarkDataPoint' font_size: $ref: '#/components/schemas/SessionWatermarkBlockFontSize' default: medium name: type: string position: $ref: '#/components/schemas/SessionWatermarkBlockPosition' default: top_left position_reference_point: $ref: '#/components/schemas/SessionWatermarkBlockPositionReferencePoint' position_x: type: integer position_y: type: integer scroll_text: $ref: '#/components/schemas/SessionWatermarkBlockScrollText' default: none text_alignment: $ref: '#/components/schemas/SessionWatermarkBlockTextAlignment' default: left text_color: type: string default: '#FFFFFF' text_shadow: type: boolean default: false title: SessionWatermarkBlock SessionWatermarkTemplate: type: object properties: account_id: type: string format: uuid app_default: type: boolean default: false creator_id: type: string format: uuid id: type: string format: uuid name: type: string watermark_blocks: type: array items: $ref: '#/components/schemas/SessionWatermarkBlock' title: SessionWatermarkTemplate AdminOnlyAction: type: object properties: lifecycle: type: boolean default: false title: AdminOnlyAction TeamSlackWebhook: type: object properties: {} title: TeamSlackWebhook UserRoles: type: object properties: admin: type: boolean id: type: string sales: type: boolean support: type: boolean service_desk: type: boolean title: UserRoles User: type: object properties: digest_frequency: type: string features_seen: description: Any type profile_image_original: description: Any type image_32: type: string image_128: type: string from_google: type: boolean mfa_enforced_at: type: string email: type: string bio: description: Any type name: type: string image_64: type: string timezone_value: type: string account_id: type: string updated_at: type: string image_256: type: string _type: type: string user_hash: type: string context: description: Any type upload_url: type: string location: description: Any type phone: description: Any type deleted_at: description: Any type profile_image: type: string first_login_at: type: string joined_via: type: string email_confirm_by: description: Any type id: type: string next_digest_date: type: string email_preferences: description: Any type last_seen: type: string inserted_at: type: string from_adobe: type: boolean avatar_color: type: string highest_account_role: type: string integrations: type: array items: type: string roles: $ref: '#/components/schemas/UserRoles' user_default_color: type: string description: User model title: User AvailableFeatures: type: object properties: archival_storage: type: boolean custom_branded_emails: type: boolean custom_branded_presentations: type: boolean reel_player: type: boolean secure_sharing: type: boolean session_based_watermarking: type: boolean team_only_comments: type: boolean title: AvailableFeatures PlanPaymentMethod: type: string enum: - stripe - check title: PlanPaymentMethod PlanPeriod: type: string enum: - monthly - yearly - semiannually title: PlanPeriod PlanTier: type: string enum: - free - starter - pro - team - business - enterprise title: PlanTier Plan: type: object properties: archived_storage_limit: type: integer autoscaling: type: boolean available_features: $ref: '#/components/schemas/AvailableFeatures' collaborator_limit: type: integer cost: type: integer default_plan: type: boolean deleted_at: type: string format: date-time enterprise: type: boolean file_limit: type: integer id: type: string format: uuid inserted_at: type: string format: date-time lifetime_file_limit: type: integer member_limit: type: integer name: type: string payment_method: $ref: '#/components/schemas/PlanPaymentMethod' period: $ref: '#/components/schemas/PlanPeriod' project_limit: type: integer storage_limit: type: integer team_limit: type: integer tier: $ref: '#/components/schemas/PlanTier' title: type: string updated_at: type: string format: date-time user_limit: type: integer user_max: type: integer version: type: integer title: Plan Image: type: object properties: bucket: type: string key: type: string type: type: string default: image/jpeg uploaded: type: boolean default: false title: Image WatermarkImagePosition: type: string enum: - top_left - top_right - bottom_left - bottom_right default: top_left title: WatermarkImagePosition WatermarkImage: type: object properties: alpha: type: number format: double default: 0.5 image: $ref: '#/components/schemas/Image' position: $ref: '#/components/schemas/WatermarkImagePosition' default: top_left title: WatermarkImage WatermarkTextPosition: type: string enum: - top - center - bottom default: top title: WatermarkTextPosition WatermarkText: type: object properties: alpha: type: number format: double default: 0.5 lines: type: array items: type: string position: $ref: '#/components/schemas/WatermarkTextPosition' default: top title: WatermarkText Watermark: type: object properties: image: $ref: '#/components/schemas/WatermarkImage' text: $ref: '#/components/schemas/WatermarkText' title: Watermark Subscription: type: object properties: account_id: type: string format: uuid archived_storage_limit: type: integer balance: type: integer cancellation_option: type: string cancellation_reason: type: string cancelled_at: type: string format: date-time deleted_at: type: string format: date-time id: type: string format: uuid inserted_at: type: string format: date-time last_payment_at: type: string format: date-time member_limit: type: integer next_bill_at: type: string format: date-time on_trial: type: boolean plan: $ref: '#/components/schemas/Plan' plan_id: type: string format: uuid promotion_expires_at: type: string format: date-time promotion_id: type: string format: uuid requires_autoscaling: type: boolean storage_limit: type: integer subscription_end_at: type: string format: date-time total_archived_storage_limit: type: integer total_lifetime_file_limit: type: integer total_member_limit: type: integer total_project_limit: type: integer total_storage_limit: type: integer total_user_limit: type: integer updated_at: type: string format: date-time user_limit: type: integer title: Subscription AccountMemberRole: type: string enum: - admin - billing_manager - account_manager - member title: AccountMemberRole AccountMember: type: object properties: accepted_at: type: string format: date-time account_id: type: string format: uuid declined_at: type: string format: date-time deleted_at: type: string format: date-time inserted_at: type: string format: date-time role: $ref: '#/components/schemas/AccountMemberRole' updated_at: type: string format: date-time user_id: type: string format: uuid title: AccountMember Account: type: object properties: invoice_emails: type: array items: type: string city: type: string account_default_color: type: string company_name: type: string storage: type: integer file_count: type: integer owner: $ref: '#/components/schemas/User' upload_url: type: string deleted_at: type: string format: date-time line1: type: string postal_code: type: string vat: type: string company_address: type: string lifetime_file_count: type: integer state: type: string teams: type: array items: $ref: '#/components/schemas/Team' image_64: type: string archived_storage: type: integer image_128: type: string owner_id: type: string format: uuid user_count: type: integer locked_at: type: string format: date-time image: type: string team_count: type: integer collaborator_role_count: type: integer billing_emails: type: string image_32: type: string unpaid_at: type: string format: date-time inserted_at: type: string format: date-time updated_at: type: string format: date-time project_count: type: integer duration: type: integer delinquent_at: type: string format: date-time collaborator_count: type: integer plan: $ref: '#/components/schemas/Plan' watermark: $ref: '#/components/schemas/Watermark' folder_count: type: integer id: type: string format: uuid display_name: type: string country: type: string subscription: $ref: '#/components/schemas/Subscription' account_members: type: array items: $ref: '#/components/schemas/AccountMember' frames: type: integer member_count: type: integer image_256: type: string title: Account EmailBranding: type: object properties: accent_color: type: string background_color: type: string image: $ref: '#/components/schemas/Image' title: EmailBranding Team: type: object properties: account_id: type: string format: uuid disable_sbwm_internally: type: boolean default: false creator_id: type: string format: uuid storage: type: integer default: 0 default_font_color: type: string access: $ref: '#/components/schemas/TeamAccess' font_color: type: string user_role: $ref: '#/components/schemas/TeamUserRole' file_count: type: integer default: 0 default_session_watermark_template: $ref: '#/components/schemas/SessionWatermarkTemplate' link: type: string asset_lifecycle_policy: type: integer upload_url: type: string admin_only_actions: $ref: '#/components/schemas/AdminOnlyAction' deleted_at: type: string format: date-time default_background_color: type: string storage_limit: type: integer location: type: string name: type: string default_color: type: string slack_webhook: $ref: '#/components/schemas/TeamSlackWebhook' image_64: type: string archived_storage: type: integer default: 0 image_128: type: string solo: type: boolean default: false account: $ref: '#/components/schemas/Account' image_32: type: string inserted_at: type: string format: date-time updated_at: type: string format: date-time project_count: type: integer default: 0 duration: type: integer default: 0 team_image: type: string collaborator_count: type: integer default: 0 bio: type: string color: type: string email_branding: $ref: '#/components/schemas/EmailBranding' folder_count: type: integer default: 0 dark_theme: type: boolean default: false default_session_watermark_template_id: type: string format: uuid session_watermark_templates: type: array items: $ref: '#/components/schemas/SessionWatermarkTemplate' id: type: string format: uuid member_limit: type: integer frames: type: integer default: 0 member_count: type: integer default: 0 image_256: type: string background_color: type: string title: Team UserPermissions: type: object properties: can_download: type: boolean can_modify_template: type: boolean can_public_share_presentation: type: boolean can_public_share_review_link: type: boolean can_share_downloadable_presentation: type: boolean can_share_downloadable_review_link: type: boolean can_share_unwatermarked_presentation: type: boolean can_share_unwatermarked_review_link: type: boolean title: UserPermissions Project: type: object properties: archive_status: $ref: '#/components/schemas/ProjectArchiveStatus' description: Archival status for this Project archived_at: type: string format: date-time description: When a Project was archived archived_file_count: type: integer default: 0 archived_storage: type: integer default: 0 collaborator_count: type: integer default: 0 deleted_at: type: string format: date-time description: If deleted, when this Project was deleted description: type: string file_count: type: integer default: 0 folder_count: type: integer default: 0 id: type: string format: uuid ignore_archive: type: boolean default: false inserted_at: type: string format: date-time description: When was this Project created invite_url: type: string name: type: string description: Name of this Project owner_id: type: string format: uuid private: type: boolean default: false project_preferences: $ref: '#/components/schemas/ProjectPreferences' read_only: type: boolean default: false root_asset: $ref: '#/components/schemas/Asset' root_asset_id: type: string format: uuid shared: type: boolean default: false storage: type: integer default: 0 team: $ref: '#/components/schemas/Team' team_id: type: string format: uuid updated_at: type: string format: date-time user_permissions: $ref: '#/components/schemas/UserPermissions' user_preferences: $ref: '#/components/schemas/ProjectPreferences' watermark: $ref: '#/components/schemas/Watermark' title: Project ProjectDeviceChannelAssetType: type: string enum: - audio - video - data title: ProjectDeviceChannelAssetType ProjectDeviceChannelStatus: type: string enum: - offline - online title: ProjectDeviceChannelStatus ProjectDeviceChannel: type: object properties: _type: type: string default: project_device_channel id: type: string format: uuid actor_id: type: string format: uuid asset_type: $ref: '#/components/schemas/ProjectDeviceChannelAssetType' device_id: type: string format: uuid external_index: type: number format: double inserted_at: type: string format: date-time name: type: string description: Auto-generated name, based on the device model project_id: type: string description: The Project ID that this device is linked to project_device_id: type: string real_time_logging_capable: type: boolean default: false status: $ref: '#/components/schemas/ProjectDeviceChannelStatus' updated_at: type: string format: date-time title: ProjectDeviceChannel ProjectDevice: type: object properties: _type: type: string default: project_device description: Resource type identifier id: type: string format: uuid asset_type: type: string description: The type of asset that this device will be producing creator_id: type: string format: uuid deleted_at: type: string format: date-time device_id: type: string format: uuid inserted_at: type: string format: date-time last_seen_at: type: string format: date-time last_known_firmware_version: type: string description: The last known firmware version reported by the device name: type: string description: Name of this device as shown in the iOS app and web app project_id: type: string format: uuid description: The Project ID that this device is linked to updated_at: type: string status: $ref: '#/components/schemas/ProjectDeviceStatus' timezone: type: string authorization: $ref: '#/components/schemas/ProjectDeviceAuthorization' project: $ref: '#/components/schemas/Project' channels: type: array items: $ref: '#/components/schemas/ProjectDeviceChannel' channel_count: type: integer path_asset_type: type: string path_name: type: string required_metadata_attributes: type: array items: type: string description: >- Represents the correlation between a physical device and a Frame.io project. title: ProjectDevice securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/connect" headers = {"Authorization": "Bearer "} response = requests.post(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/connect'; const options = {method: 'POST', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/connect" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/connect") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/connect") .header("Authorization", "Bearer ") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/connect', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/connect"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/connect")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # Disconnect device POST https://api.frame.io/v2/devices/disconnect Disconnect the device from the project it's currently connected to. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/applications-auth/device-project-disconnect ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/disconnect: post: operationId: device-project-disconnect summary: Disconnect device description: Disconnect the device from the project it's currently connected to. tags: - subpackage_devices parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '204': description: No Content content: application/json: schema: type: object properties: {} servers: - url: https://api.frame.io components: securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/disconnect" headers = {"Authorization": "Bearer "} response = requests.post(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/disconnect'; const options = {method: 'POST', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/disconnect" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/disconnect") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.frame.io/v2/devices/disconnect") .header("Authorization", "Bearer ") .asString(); ``` ```php request('POST', 'https://api.frame.io/v2/devices/disconnect', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/disconnect"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/disconnect")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List accounts GET https://api.frame.io/v2/devices/accounts List available accounts to pair your C2C device with. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/applications-auth/device-list-accounts ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/accounts: get: operationId: device-list-accounts summary: List accounts description: List available accounts to pair your C2C device with. tags: - subpackage_devices parameters: - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: Example response content: application/json: schema: type: array items: $ref: >- #/components/schemas/V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItems '401': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found content: application/json: schema: description: Any type servers: - url: https://api.frame.io components: schemas: V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItemsType: type: string enum: - account description: The resource type, will always be `account`. title: V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItemsType V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItems: type: object properties: _type: $ref: >- #/components/schemas/V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItemsType description: The resource type, will always be `account`. display_name: type: string description: The account's display name id: type: string format: uuid description: The unique identifier for this account required: - _type - display_name - id title: V2DevicesAccountsGetResponsesContentApplicationJsonSchemaItems HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python AccountsResponse import requests url = "https://api.frame.io/v2/devices/accounts" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript AccountsResponse const url = 'https://api.frame.io/v2/devices/accounts'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go AccountsResponse package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/accounts" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby AccountsResponse require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/accounts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java AccountsResponse import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v2/devices/accounts") .header("Authorization", "Bearer ") .asString(); ``` ```php AccountsResponse request('GET', 'https://api.frame.io/v2/devices/accounts', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp AccountsResponse using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/accounts"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift AccountsResponse import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/accounts")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` # List projects for account GET https://api.frame.io/v2/devices/accounts/{account_id}/projects List available Projects to pair your C2C device with. Reference: https://next.developer.frame.io/camera-to-cloud/api-reference/applications-auth/device-list-projects ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: v2 version: 1.0.0 paths: /v2/devices/accounts/{account_id}/projects: get: operationId: device-list-projects summary: List projects for account description: List available Projects to pair your C2C device with. tags: - subpackage_devices parameters: - name: account_id in: path required: true schema: type: string - name: Authorization in: header description: Bearer authentication required: true schema: type: string - name: x-client-version in: header description: >- Firmware or software version of a C2C integration. Will be used to determine the correct Device Model configuration for the device when multiple are available. Must be a valid semantic version. For more on semantic versions, see here: https://semver.org/ required: false schema: type: string default: 0.0.0 responses: '200': description: Example response content: application/json: schema: type: array items: $ref: >- #/components/schemas/V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItems '403': description: Unauthorized response content: application/json: schema: $ref: '#/components/schemas/HTTPError' '404': description: Not Found response content: application/json: schema: $ref: '#/components/schemas/HTTPError' servers: - url: https://api.frame.io components: schemas: V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItemsType: type: string enum: - project description: Type of the returned object. title: >- V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItemsType V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItems: type: object properties: _type: $ref: >- #/components/schemas/V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItemsType description: Type of the returned object. id: type: string format: uuid description: Frame.io project ID name: type: string description: Name of the Frame.io project required: - _type - id - name title: >- V2DevicesAccountsAccountIdProjectsGetResponsesContentApplicationJsonSchemaItems HttpErrorErrorsItems: type: object properties: code: type: integer detail: type: string status: type: integer title: type: string title: HttpErrorErrorsItems HTTPError: type: object properties: code: type: integer errors: type: array items: $ref: '#/components/schemas/HttpErrorErrorsItems' message: type: string title: HTTPError securitySchemes: bearer: type: http scheme: bearer ``` ## SDK Code Examples ```python import requests url = "https://api.frame.io/v2/devices/accounts/account_id/projects" payload = {} headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.get(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.frame.io/v2/devices/accounts/account_id/projects'; const options = { method: 'GET', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '{}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.frame.io/v2/devices/accounts/account_id/projects" payload := strings.NewReader("{}") req, _ := http.NewRequest("GET", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.frame.io/v2/devices/accounts/account_id/projects") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.frame.io/v2/devices/accounts/account_id/projects") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{}") .asString(); ``` ```php request('GET', 'https://api.frame.io/v2/devices/accounts/account_id/projects', [ 'body' => '{}', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.frame.io/v2/devices/accounts/account_id/projects"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.frame.io/v2/devices/accounts/account_id/projects")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```