Canva Connect API

The umbrella Canva Connect REST API as Canva publishes it — 59 operations across designs, assets, folders, brand templates, autofills, exports, resizes, imports, merges, comments, analytics, users, OAuth and OIDC. This entry carries Canva's own OpenAPI description, fetched verbatim from https://www.canva.dev/sources/connect/api/latest/api.yml.

OpenAPI Specification

canva-connect-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  contact:
    name: Canva Developer Community
    url: https://community.canva.dev/
  description: API for building integrations with Canva via a REST api
  license:
    name: ©2023 All Rights Reserved
  termsOfService: https://www.canva.com/trust/legal/
  title: Canva Connect API
  version: 2024-06-18
servers:
- description: Canva Connect API
  url: https://api.canva.com/rest
tags:
- description: Allow management of brands
  name: brands
- name: analytics
- name: app
- name: asset
- name: autofill
- name: brand_template
- name: comment
- name: connect
- name: design
- name: design_import
- name: export
- name: folder
- name: merge
- name: oauth
- name: oidc
- name: resize
- name: user
paths:
  /v1/designs/{designId}/analytics:
    get:
      description: |-
        <Warning>

        This API is currently provided as a preview. Be aware of the following:

        - There might be unannounced breaking changes.
        - Any breaking changes to preview APIs won't produce a new [API version](https://www.canva.dev/docs/connect/versions/).
        - Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.

        </Warning>

        <Availability>
        To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
        </Availability>

        Gets the aggregated analytics for a design.

        The response includes total views, unique viewers, and view duration metrics.
      operationId: getDesignAnalytics
      parameters:
      - description: The design ID.
        explode: false
        in: path
        name: designId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDesignAnalyticsResponse'
          description: OK
        "400":
          content:
            application/json:
              examples:
                analytics_invalid_design_id:
                  $ref: '#/components/examples/AnalyticsInvalidDesignIdError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        "401":
          content:
            application/json:
              examples:
                invalid_access_token:
                  $ref: '#/components/examples/InvalidAccessToken'
              schema:
                $ref: '#/components/schemas/Error'
          description: Unauthorized
        "403":
          content:
            application/json:
              examples:
                analytics_permission_denied:
                  $ref: '#/components/examples/AnalyticsPermissionDeniedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                analytics_design_not_found:
                  $ref: '#/components/examples/AnalyticsDesignNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        "429":
          content:
            application/json:
              examples:
                too_many_requests:
                  $ref: '#/components/examples/TooManyRequestsError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Too Many Requests
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:read
      tags:
      - analytics
      x-required-capabilities:
      - analytics
      x-rate-limit-per-client-user: 100
  /v1/designs/{designId}/analytics/viewers:
    get:
      description: |-
        <Warning>

        This API is currently provided as a preview. Be aware of the following:

        - There might be unannounced breaking changes.
        - Any breaking changes to preview APIs won't produce a new [API version](https://www.canva.dev/docs/connect/versions/).
        - Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.

        </Warning>

        <Availability>
        To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
        </Availability>

        Lists viewers for a design, ordered by most recent view first.
      operationId: getDesignAnalyticsViewers
      parameters:
      - description: The design ID.
        explode: false
        in: path
        name: designId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      - description: "Filters viewers by a specific trackable link. If omitted, only\
          \ viewers who visited the design without using a trackable link are returned."
        explode: true
        in: query
        name: link_id
        required: false
        schema:
          example: hddb98a3716
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: form
      - description: "Only returns viewers whose first view happened after this time,\
          \ as a Unix timestamp (in seconds since the Unix Epoch)."
        explode: true
        in: query
        name: first_viewed_after
        required: false
        schema:
          example: 1745452800
          format: int64
          type: integer
        style: form
      - description: The maximum number of viewers to return per page.
        explode: true
        in: query
        name: limit
        required: false
        schema:
          default: 50
          example: 50
          format: int32
          maximum: 100
          minimum: 1
          type: integer
        style: form
      - description: |-
          If the success response contains a continuation token, there are more viewers you can list. You can use this token as a query parameter and retrieve more viewers from the list, for example `/v1/designs/{designId}/analytics/viewers?continuation={continuation}`.

          To retrieve all viewers, you might need to make multiple requests.
        explode: true
        in: query
        name: continuation
        required: false
        schema:
          example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
          type: string
        style: form
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDesignAnalyticsViewersResponse'
          description: OK
        "400":
          content:
            application/json:
              examples:
                analytics_invalid_query_parameter:
                  $ref: '#/components/examples/ExpectedLongQueryParam'
                analytics_invalid_continuation_token:
                  $ref: '#/components/examples/AnalyticsInvalidContinuationError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        "401":
          content:
            application/json:
              examples:
                invalid_access_token:
                  $ref: '#/components/examples/InvalidAccessToken'
              schema:
                $ref: '#/components/schemas/Error'
          description: Unauthorized
        "403":
          content:
            application/json:
              examples:
                analytics_permission_denied:
                  $ref: '#/components/examples/AnalyticsPermissionDeniedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                analytics_design_not_found:
                  $ref: '#/components/examples/AnalyticsDesignNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        "429":
          content:
            application/json:
              examples:
                too_many_requests:
                  $ref: '#/components/examples/TooManyRequestsError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Too Many Requests
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:read
      tags:
      - analytics
      x-required-capabilities:
      - analytics
      x-rate-limit-per-client-user: 100
  /v1/designs/{designId}/analytics/views-over-time:
    get:
      description: |-
        <Warning>

        This API is currently provided as a preview. Be aware of the following:

        - There might be unannounced breaking changes.
        - Any breaking changes to preview APIs won't produce a new [API version](https://www.canva.dev/docs/connect/versions/).
        - Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.

        </Warning>

        <Availability>
        To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
        </Availability>

        Lists the view counts over time for a design.

        Each response item represents one time bucket.
      operationId: getDesignAnalyticsViewsOverTime
      parameters:
      - description: The design ID.
        explode: false
        in: path
        name: designId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      - description: "The inclusive start of the requested time range, as a Unix timestamp\
          \ (in seconds since the Unix Epoch)."
        explode: true
        in: query
        name: start_time
        required: false
        schema:
          example: 1745452800
          format: int64
          type: integer
        style: form
      - description: "The inclusive end of the requested time range, as a Unix timestamp\
          \ (in seconds since the Unix Epoch)."
        explode: true
        in: query
        name: end_time
        required: false
        schema:
          example: 1748044800
          format: int64
          type: integer
        style: form
      - description: "The timezone to use for bucketing, as a UTC offset in the form\
          \ `+HH:MM` (for example, `+10:00`)."
        explode: true
        in: query
        name: timezone
        required: false
        schema:
          default: +00:00
          example: "600"
          type: string
        style: form
      - description: The maximum number of time buckets to return per page.
        explode: true
        in: query
        name: limit
        required: false
        schema:
          default: 50
          example: 50
          format: int32
          maximum: 100
          minimum: 1
          type: integer
        style: form
      - description: |-
          If the success response contains a continuation token, there are more time buckets you can list. You can use this token as a query parameter and retrieve more time buckets from the list, for example `/v1/designs/{designId}/analytics/views-over-time?continuation={continuation}`.

          To retrieve all time buckets, you might need to make multiple requests.
        explode: true
        in: query
        name: continuation
        required: false
        schema:
          example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
          type: string
        style: form
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDesignAnalyticsViewsOverTimeResponse'
          description: OK
        "400":
          content:
            application/json:
              examples:
                analytics_invalid_query_parameter:
                  $ref: '#/components/examples/ExpectedLongQueryParam'
                analytics_invalid_time_range:
                  $ref: '#/components/examples/AnalyticsInvalidTimeRangeError'
                analytics_invalid_timezone:
                  $ref: '#/components/examples/AnalyticsInvalidTimezoneError'
                analytics_invalid_continuation_token:
                  $ref: '#/components/examples/AnalyticsInvalidContinuationError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        "401":
          content:
            application/json:
              examples:
                invalid_access_token:
                  $ref: '#/components/examples/InvalidAccessToken'
              schema:
                $ref: '#/components/schemas/Error'
          description: Unauthorized
        "403":
          content:
            application/json:
              examples:
                analytics_permission_denied:
                  $ref: '#/components/examples/AnalyticsPermissionDeniedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                analytics_design_not_found:
                  $ref: '#/components/examples/AnalyticsDesignNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        "429":
          content:
            application/json:
              examples:
                too_many_requests:
                  $ref: '#/components/examples/TooManyRequestsError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Too Many Requests
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:read
      tags:
      - analytics
      x-required-capabilities:
      - analytics
      x-rate-limit-per-client-user: 100
  /v1/designs/{designId}/analytics/page-views:
    post:
      description: |-
        <Warning>

        This API is currently provided as a preview. Be aware of the following:

        - There might be unannounced breaking changes.
        - Any breaking changes to preview APIs won't produce a new [API version](https://www.canva.dev/docs/connect/versions/).
        - Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.

        </Warning>

        <Availability>
        To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
        </Availability>

        Lists the page-level view duration data for a design.

        The request body can include page filters and pagination controls.
      operationId: getDesignAnalyticsPageViews
      parameters:
      - description: The design ID.
        explode: false
        in: path
        name: designId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetDesignAnalyticsPageViewsRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDesignAnalyticsPageViewsResponse'
          description: OK
        "400":
          content:
            application/json:
              examples:
                analytics_invalid_request_body:
                  $ref: '#/components/examples/FailedToReadRequestBody'
                analytics_invalid_page_views_filter:
                  $ref: '#/components/examples/AnalyticsInvalidPageViewsFilterError'
                analytics_invalid_continuation_token:
                  $ref: '#/components/examples/AnalyticsInvalidContinuationError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        "401":
          content:
            application/json:
              examples:
                invalid_access_token:
                  $ref: '#/components/examples/InvalidAccessToken'
              schema:
                $ref: '#/components/schemas/Error'
          description: Unauthorized
        "403":
          content:
            application/json:
              examples:
                analytics_permission_denied:
                  $ref: '#/components/examples/AnalyticsPermissionDeniedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                analytics_design_not_found:
                  $ref: '#/components/examples/AnalyticsDesignNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        "429":
          content:
            application/json:
              examples:
                too_many_requests:
                  $ref: '#/components/examples/TooManyRequestsError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Too Many Requests
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:read
      tags:
      - analytics
      x-required-capabilities:
      - analytics
      x-rate-limit-per-client-user: 100
  /v1/designs/{designId}/analytics/links:
    get:
      description: |-
        <Warning>

        This API is currently provided as a preview. Be aware of the following:

        - There might be unannounced breaking changes.
        - Any breaking changes to preview APIs won't produce a new [API version](https://www.canva.dev/docs/connect/versions/).
        - Public integrations that use preview APIs will not pass the review process, and can't be made available to all Canva users.

        </Warning>

        <Availability>
        To use this API, your integration must act on behalf of a user who is a member of a [Canva Enterprise](https://www.canva.com/enterprise/) organization.
        </Availability>

        Lists trackable links and their metrics for a design.
      operationId: getDesignAnalyticsLinks
      parameters:
      - description: The design ID.
        explode: false
        in: path
        name: designId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      - description: The maximum number of links to return per page.
        explode: true
        in: query
        name: limit
        required: false
        schema:
          default: 50
          example: 50
          format: int32
          maximum: 100
          minimum: 1
          type: integer
        style: form
      - description: |-
          If the success response contains a continuation token, there are more links you can list. You can use this token as a query parameter and retrieve more links from the list, for example `/v1/designs/{designId}/analytics/links?continuation={continuation}`.

          To retrieve all links, you might need to make multiple requests.
        explode: true
        in: query
        name: continuation
        required: false
        schema:
          example: RkFGMgXlsVTDbMd:MR3L0QjiaUzycIAjx0yMyuNiV0OildoiOwL0x32G4NjNu4FwtAQNxowUQNMMYN
          type: string
        style: form
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDesignAnalyticsLinksResponse'
          description: OK
        "400":
          content:
            application/json:
              examples:
                analytics_invalid_query_parameter:
                  $ref: '#/components/examples/ExpectedLongQueryParam'
                analytics_invalid_continuation_token:
                  $ref: '#/components/examples/AnalyticsInvalidContinuationError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        "401":
          content:
            application/json:
              examples:
                invalid_access_token:
                  $ref: '#/components/examples/InvalidAccessToken'
              schema:
                $ref: '#/components/schemas/Error'
          description: Unauthorized
        "403":
          content:
            application/json:
              examples:
                analytics_permission_denied:
                  $ref: '#/components/examples/AnalyticsPermissionDeniedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                analytics_design_not_found:
                  $ref: '#/components/examples/AnalyticsDesignNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        "429":
          content:
            application/json:
              examples:
                too_many_requests:
                  $ref: '#/components/examples/TooManyRequestsError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Too Many Requests
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:read
      tags:
      - analytics
      x-required-capabilities:
      - analytics
      x-rate-limit-per-client-user: 100
  /v1/apps/{appId}/jwks:
    get:
      description: |-
        Returns the Json Web Key Set (public keys) of an app. These keys are used to
        verify JWTs sent to app backends.
      operationId: getAppJwks
      parameters:
      - description: The app ID.
        explode: false
        in: path
        name: appId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAppJwksResponse'
          description: OK
        "404":
          content:
            application/json:
              examples:
                auth_keys_not_found:
                  $ref: '#/components/examples/AuthKeysNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      tags:
      - app
  /v1/assets/{assetId}:
    delete:
      description: |-
        You can delete an asset by specifying its `assetId`. This operation mirrors the behavior
        in the Canva UI. Deleting an item moves it to the trash.
        Deleting an asset doesn't remove it from designs that already use it.
      operationId: deleteAsset
      parameters:
      - description: The ID of the asset.
        explode: false
        in: path
        name: assetId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      responses:
        "204":
          description: OK
        "403":
          content:
            application/json:
              examples:
                asset_delete_not_allowed:
                  $ref: '#/components/examples/AssetDeleteNotAllowedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                asset_not_found:
                  $ref: '#/components/examples/AssetNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - asset:write
      tags:
      - asset
      x-rate-limit-per-client-user: 30
    get:
      description: You can retrieve the metadata of an asset by specifying its `assetId`.
      operationId: getAsset
      parameters:
      - description: The ID of the asset.
        explode: false
        in: path
        name: assetId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAssetResponse'
          description: OK
        "403":
          content:
            application/json:
              examples:
                asset_access_not_allowed:
                  $ref: '#/components/examples/AssetAccessNotAllowedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                asset_not_found:
                  $ref: '#/components/examples/AssetNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - asset:read
      tags:
      - asset
      x-rate-limit-per-client-user: 100
    patch:
      description: |-
        You can update the name and tags of an asset by specifying its `assetId`. Updating the tags
        replaces all existing tags of the asset.
      operationId: updateAsset
      parameters:
      - description: The ID of the asset.
        explode: false
        in: path
        name: assetId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAssetRequest'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateAssetResponse'
          description: OK
        "403":
          content:
            application/json:
              examples:
                asset_update_not_allowed:
                  $ref: '#/components/examples/AssetUpdateNotAllowedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              examples:
                asset_not_found:
                  $ref: '#/components/examples/AssetNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - asset:write
      tags:
      - asset
      x-rate-limit-per-client-user: 30
  /v1/asset-uploads:
    post:
      description: |-
        Starts a new [asynchronous job](https://www.canva.dev/docs/connect/api-requests-responses/#asynchronous-job-endpoints) to upload an asset to the user's content library. Supported file types for assets are listed in the [Assets API overview](https://www.canva.dev/docs/connect/api-reference/assets/).

        The request format for this endpoint is an `application/octet-stream` body of bytes. Attach
        information about the upload using an `Asset-Upload-Metadata` header.


        <Note>

        For more information on the workflow for using asynchronous jobs, see [API requests and responses](https://www.canva.dev/docs/connect/api-requests-responses/#asynchronous-job-endpoints). You can check the status and get the results of asset upload jobs created with this API using the [Get asset upload job API](https://www.canva.dev/docs/connect/api-reference/assets/get-asset-upload-job/).

        </Note>
      operationId: CreateAssetUploadJob
      parameters:
      - content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetUploadMetadata'
        in: header
        name: Asset-Upload-Metadata
        required: true
      requestBody:
        content:
          application/octet-stream:
            schema:
              format: binary
              type: string
        description: Binary of the asset to upload.
        required: true
      responses:
        "200":
          content:
            application/json:
              examples:
                in_progress:
                  $ref: '#/components/examples/InProgressAssetUploadJobExample'
                success:
                  $ref: '#/components/examples/SuccessAssetUploadJobExample'
                failed:
                  $ref: '#/components/examples/FailedAssetUploadJobExample'
              schema:
                $ref: '#/components/schemas/CreateAssetUploadJobResponse'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - asset:write
      tags:
      - asset
      x-rate-limit-per-client-user: 30
  /v1/asset-uploads/{jobId}:
    get:
      description: |-
        Get the result of an asset upload job that was created using the [Create asset upload job API](https://www.canva.dev/docs/connect/api-reference/assets/create-asset-upload-job/).

        You might need to make multiple requests to this endpoint until you get a `success` or `failed` status. For more information on the workflow for using asynchronous jobs, see [API requests and responses](https://www.canva.dev/docs/connect/api-requests-responses/#asynchronous-job-endpoints).
      operationId: GetAssetUploadJob
      parameters:
      - description: The asset upload job ID.
        explode: false
        in: path
        name: jobId
        required: true
        schema:
          pattern: "^[a-zA-Z0-9_-]{1,50}$"
          type: string
        style: simple
      responses:
        "200":
          content:
            application/json:
              examples:
                in_progress:
                  $ref: '#/components/examples/InProgressAssetUploadJobExample'
                success:
                  $ref: '#/components/examples/SuccessAssetUploadJobExample'
                failed:
                  $ref: '#/components/examples/FailedAssetUploadJobExample'
              schema:
                $ref: '#/components/schemas/GetAssetUploadJobResponse'
          description: OK
        "403":
          content:
            application/json:
              examples:
                asset_access_not_allowed:
                  $ref: '#/components/examples/AssetAccessNotAllowedError'
                asset_upload_job_not_creator:
                  $ref: '#/components/examples/AssetUploadJobNotCreatorError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        "404":
          content:
            application/json:
              exampl

# --- truncated at 32 KB (454 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/canva/refs/heads/main/openapi/canva-connect-api-openapi.yml