Canva Design Import API

The design_import API from Canva — 4 operation(s) for design_import.

Operations 4

POST /v1/imports Create design import job #
GET /v1/imports/{jobId} Get design import job #
POST /v1/url-imports Create url import job #
GET /v1/url-imports/{jobId} Get url import job #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/canva-design-import-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

canva-design-import-api-openapi.yml Raw ↑
openapi: 3.2.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 Design Import API
  version: 2024-06-18
servers:
- description: Canva Connect API
  url: https://api.canva.com/rest
tags:
- name: design_import
paths:
  /v1/imports:
    post:
      description: 'Starts a new asynchronous job to import an external file as a new design in Canva.


        The request format for this endpoint has an `application/octet-stream` body of bytes,

        and the information about the import is provided using an `Import-Metadata` header.


        Supported file types for imports are listed in Design imports overview.


        For more information on the workflow for using asynchronous jobs, see API requests and responses. You can check the status and get the results of design import jobs created with this API using the Get design import job API.'
      operationId: createDesignImportJob
      parameters:
      - content:
          application/json:
            schema:
              $ref: '#/components/schemas/DesignImportMetadata'
        in: header
        name: Import-Metadata
        required: true
      requestBody:
        content:
          application/octet-stream:
            schema:
              format: binary
              type: string
        description: Binary of the file to import.
        required: true
      responses:
        '200':
          content:
            application/json:
              examples:
                in_progress:
                  $ref: '#/components/examples/InProgressDesignImportJobExample'
                success:
                  $ref: '#/components/examples/SuccessDesignImportJobExample'
                failed:
                  $ref: '#/components/examples/FailedDesignImportJobExample'
              schema:
                $ref: '#/components/schemas/CreateDesignImportJobResponse'
          description: OK
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:write
      tags:
      - design_import
      x-rate-limit-per-client-user: 20
      summary: Create design import job
      x-summary-source: derived
  /v1/imports/{jobId}:
    get:
      description: 'Gets the result of a design import job created using the Create design import job API.


        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.'
      operationId: getDesignImportJob
      parameters:
      - description: The design import job ID.
        example: f81b26fd-a33d-4c2d-9e8c-4a7aca798b17
        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/InProgressDesignImportJobExample'
                success:
                  $ref: '#/components/examples/SuccessDesignImportJobExample'
                failed:
                  $ref: '#/components/examples/FailedDesignImportJobExample'
              schema:
                $ref: '#/components/schemas/GetDesignImportJobResponse'
          description: OK
        '400':
          content:
            application/json:
              examples:
                job_id_invalid:
                  $ref: '#/components/examples/JobIdInvalidError'
                job_not_created_via_connect_api:
                  $ref: '#/components/examples/JobNotCreatedViaConnectApiError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        '403':
          content:
            application/json:
              examples:
                design_import_job_not_creator:
                  $ref: '#/components/examples/DesignImportJobNotCreatorError'
                get_job_status_not_allowed:
                  $ref: '#/components/examples/GetJobStatusNotAllowedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        '404':
          content:
            application/json:
              examples:
                job_id_not_found:
                  $ref: '#/components/examples/JobIdNotFoundError'
                job_not_found:
                  $ref: '#/components/examples/JobNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:write
      tags:
      - design_import
      x-rate-limit-per-client-user: 120
      summary: Get design import job
      x-summary-source: derived
  /v1/url-imports:
    post:
      description: 'Starts a new asynchronous job to import an external file from a URL as a new design in Canva.


        Supported file types for imports are listed in Design imports overview.


        For more information on the workflow for using asynchronous jobs, see API requests and responses. You can check the status and get the results of design import jobs created with this API using the Get URL import job API.'
      operationId: createUrlImportJob
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUrlImportJobRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              examples:
                in_progress:
                  $ref: '#/components/examples/InProgressDesignImportJobExample'
                success:
                  $ref: '#/components/examples/SuccessDesignImportJobExample'
                failed:
                  $ref: '#/components/examples/FailedDesignImportJobExample'
              schema:
                $ref: '#/components/schemas/CreateUrlImportJobResponse'
          description: OK
        '400':
          content:
            application/json:
              examples:
                design_import_already_in_progress:
                  $ref: '#/components/examples/DesignImportAlreadyInProgressError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        '404':
          content:
            application/json:
              examples:
                job_with_id_not_found:
                  $ref: '#/components/examples/JobWithIdNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:write
      tags:
      - design_import
      x-rate-limit-per-client-user: 20
      summary: Create url import job
      x-summary-source: derived
  /v1/url-imports/{jobId}:
    get:
      description: 'Gets the result of a URL import job created using the Create URL import job API.


        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.'
      operationId: getUrlImportJob
      parameters:
      - description: The ID of the URL import job.
        example: f81b26fd-a33d-4c2d-9e8c-4a7aca798b17
        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/InProgressDesignImportJobExample'
                success:
                  $ref: '#/components/examples/SuccessDesignImportJobExample'
                failed:
                  $ref: '#/components/examples/FailedDesignImportJobExample'
              schema:
                $ref: '#/components/schemas/GetUrlImportJobResponse'
          description: OK
        '400':
          content:
            application/json:
              examples:
                job_not_created_via_connect_api:
                  $ref: '#/components/examples/JobNotCreatedViaConnectApiError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad Request
        '403':
          content:
            application/json:
              examples:
                get_job_status_not_allowed:
                  $ref: '#/components/examples/GetJobStatusNotAllowedError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Forbidden
        '404':
          content:
            application/json:
              examples:
                job_not_found:
                  $ref: '#/components/examples/JobNotFoundError'
              schema:
                $ref: '#/components/schemas/Error'
          description: Not Found
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error Response
      security:
      - oauthAuthCode:
        - design:content:write
      tags:
      - design_import
      x-rate-limit-per-client-user: 120
      summary: Get url import job
      x-summary-source: derived
components:
  examples:
    JobWithIdNotFoundError:
      summary: Job with ID not found
      value:
        code: not_found
        message: Job with Id {jobId} not found
    DesignImportJobNotCreatorError:
      summary: Calling user was not the creator of the design import job
      value:
        code: permission_denied
        message: Calling user was not the creator of the design import job
    JobNotCreatedViaConnectApiError:
      summary: The job is not created via Connect API
      value:
        code: invalid_request
        message: The job is not created via Connect API.
    SuccessDesignImportJobExample:
      summary: Successfully completed job
      value:
        job:
          id: e08861ae-3b29-45db-8dc1-1fe0bf7f1cc8
          status: success
          result:
            designs:
            - id: DAGQm2AkzOk
              title: My Awesome Design
              thumbnail:
                width: 376
                height: 531
                url: https://document-export.canva.com/...
              urls:
                edit_url: https://www.canva.com/api/design/...
                view_url: https://www.canva.com/api/design/...
              created_at: 1726198998
              updated_at: 1726199000
    JobNotFoundError:
      summary: Job not found
      value:
        code: not_found
        message: Job {jobId} not found
    InProgressDesignImportJobExample:
      summary: In progress job
      value:
        job:
          id: e08861ae-3b29-45db-8dc1-1fe0bf7f1cc8
          status: in_progress
    FailedDesignImportJobExample:
      summary: Failed job
      value:
        job:
          id: e08861ae-3b29-45db-8dc1-1fe0bf7f1cc8
          status: failed
          error:
            code: invalid_file
            message: Document could not be imported because the file is corrupt.
    JobIdNotFoundError:
      summary: Job ID not found
      value:
        code: not_found
        message: Job ID {jobId} not found
    JobIdInvalidError:
      summary: The job ID is invalid
      value:
        code: bad_request_params
        message: The jobId is invalid.
    DesignImportAlreadyInProgressError:
      summary: A design import for the URL is already in progress
      value:
        code: invalid_request
        message: Design import for url {url} already in progress
    GetJobStatusNotAllowedError:
      summary: Not allowed to get the job status
      value:
        code: permission_denied
        message: Not allowed to get the job status.
  schemas:
    CreateUrlImportJobResponse:
      properties:
        job:
          $ref: '#/components/schemas/DesignImportJob'
      required:
      - job
      type: object
    ErrorCode:
      description: 'A short string indicating what failed. This field can be used to handle errors programmatically.

        '
      enum:
      - internal_error
      - invalid_field
      - invalid_header_value
      - permission_denied
      - too_many_requests
      - not_found
      - bad_request_body
      - bad_http_method
      - bad_request_params
      - bad_query_params
      - user_role_required
      - endpoint_not_found
      - endpoint_gone
      - unsupported_version
      - invalid_access_token
      - revoked_access_token
      - missing_field
      - missing_scope
      - invalid_grant
      - invalid_request
      - invalid_client
      - unauthorized_client
      - unsupported_grant_type
      - invalid_scope
      - invalid_basic_header
      - invalid_file_format
      - quota_exceeded
      - ai_credit_quota_exceeded
      - ai_credit_quota_cooldown
      - unsupported_content_type
      - request_too_large
      - folder_not_found
      - item_in_multiple_folders
      - asset_not_found
      - max_limit_reached
      - permission_not_found
      - permission_exists
      - unauthorized_user
      - user_not_found
      - user_not_eligible
      - group_not_found
      - app_not_found
      - app_has_non_draft_versions
      - invalid_status_transition
      - translation_validation_failed
      - content_not_found
      - doctype_not_found
      - design_not_found
      - offset_too_large
      - page_not_found
      - design_or_comment_not_found
      - design_or_thread_not_found
      - review_dismissed
      - design_type_not_found
      - team_not_found
      - team_is_default
      - comment_not_found
      - too_many_comments
      - too_many_replies
      - message_too_long
      - thread_not_found
      - reply_not_found
      - design_not_fillable
      - autofill_data_invalid
      - feature_not_available
      - unsupported_design_type
      - design_generation_not_enabled
      - license_required
      - input_unsafe
      - display_name_unavailable
      - user_not_managed
      - saml_team_id_conflict
      - saml_name_id_not_available
      - user_email_unverified
      - user_not_active
      - user_pending_consent
      - account_exists
      type: string
    DesignImportMetadata:
      description: Metadata about the design that you include as a header parameter when importing a design.
      properties:
        title_base64:
          description: 'The design''s title, encoded in Base64.


            The maximum length of a design title in Canva (unencoded) is 50 characters.


            Base64 encoding allows titles containing emojis and other special

            characters to be sent using HTTP headers.

            For example, "My Awesome Design 😍" Base64 encoded

            is `TXkgQXdlc29tZSBEZXNpZ24g8J+YjQ==`.'
          example: TXkgQXdlc29tZSBEZXNpZ24g8J+YjQ==
          minLength: 1
          type: string
        mime_type:
          description: The MIME type of the file being imported. If not provided, Canva attempts to automatically detect the type of the file.
          example: application/pdf
          type: string
      required:
      - title_base64
      type: object
    DesignImportJob:
      description: The status of the design import job.
      properties:
        id:
          description: The ID of the design import job.
          example: e08861ae-3b29-45db-8dc1-1fe0bf7f1cc8
          pattern: ^[a-zA-Z0-9_-]{1,50}$
          type: string
        status:
          $ref: '#/components/schemas/DesignImportStatus'
        result:
          $ref: '#/components/schemas/DesignImportJobResult'
        error:
          $ref: '#/components/schemas/DesignImportError'
      required:
      - id
      - status
      type: object
    CreateDesignImportJobResponse:
      properties:
        job:
          $ref: '#/components/schemas/DesignImportJob'
      required:
      - job
      type: object
    CreateUrlImportJobRequest:
      properties:
        title:
          description: A title for the design.
          example: My Awesome Design
          maxLength: 255
          minLength: 1
          type: string
        url:
          description: The URL of the file to import. This URL must be accessible from the internet and be publicly available.
          maxLength: 2048
          minLength: 1
          type: string
        mime_type:
          description: The MIME type of the file being imported. If not provided, Canva attempts to automatically detect the type of the file.
          example: application/vnd.apple.keynote
          maxLength: 100
          minLength: 1
          type: string
      required:
      - title
      - url
      type: object
    DesignImportErrorCode:
      description: 'A short string about why the import failed. This field can be used to handle errors

        programmatically.'
      enum:
      - design_creation_throttled
      - design_import_throttled
      - duplicate_import
      - internal_error
      - invalid_file
      - fetch_failed
      example: design_creation_throttled
      type: string
    Thumbnail:
      description: A thumbnail image representing the object.
      properties:
        width:
          description: The width of the thumbnail image in pixels.
          example: 595
          format: int32
          type: integer
        height:
          description: The height of the thumbnail image in pixels.
          example: 335
          format: int32
          type: integer
        url:
          description: 'A URL for retrieving the thumbnail image.

            This URL expires after 15 minutes. This URL includes a query string

            that''s required for retrieving the thumbnail.'
          example: https://document-export.canva.com/Vczz9/zF9vzVtdADc/2/thumbnail/0001.png?<query-string>
          type: string
      required:
      - height
      - url
      - width
      type: object
    GetDesignImportJobResponse:
      properties:
        job:
          $ref: '#/components/schemas/DesignImportJob'
      required:
      - job
      type: object
    DesignImportError:
      description: If the import job fails, this object provides details about the error.
      properties:
        code:
          $ref: '#/components/schemas/DesignImportErrorCode'
        message:
          description: A human-readable description of what went wrong.
          example: We're sorry, but the file upload quota has exceeded. Please try again later.
          type: string
      required:
      - code
      - message
      type: object
    Error:
      properties:
        code:
          $ref: '#/components/schemas/ErrorCode'
        message:
          description: A human-readable description of what went wrong.
          type: string
      required:
      - code
      - message
      type: object
    DesignLinks:
      description: A temporary set of URLs for viewing or editing the design.
      properties:
        edit_url:
          description: 'A temporary editing URL for the design. This URL is only accessible to the user that made the API request, and is designed to support [return navigation](https://www.canva.dev/docs/connect/return-navigation-guide/) workflows.


            NOTE: This is not a permanent URL, it is only valid for 30 days.'
          example: https://www.canva.com/api/design/eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiZXhwaXJ5IjoxNzQyMDk5NDAzMDc5fQ..GKLx2hrJa3wSSDKQ.hk3HA59qJyxehR-ejzt2DThBW0cbRdMBz7Fb5uCpwD-4o485pCf4kcXt_ypUYX0qMHVeZ131YvfwGPIhbk-C245D8c12IIJSDbZUZTS7WiCOJZQ.sNz3mPSQxsETBvl_-upMYA/edit
          type: string
        view_url:
          description: 'A temporary viewing URL for the design. This URL is only accessible to the user that made the API request, and is designed to support [return navigation](https://www.canva.dev/docs/connect/return-navigation-guide/) workflows.


            NOTE: This is not a permanent URL, it is only valid for 30 days.

            '
          example: https://www.canva.com/api/design/eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiZXhwaXJ5IjoxNzQyMDk5NDAzMDc5fQ..GKLx2hrJa3wSSDKQ.hk3HA59qJyxehR-ejzt2DThBW0cbRdMBz7Fb5uCpwD-4o485pCf4kcXt_ypUYX0qMHVeZ131YvfwGPIhbk-C245D8c12IIJSDbZUZTS7WiCOJZQ.sNz3mPSQxsETBvl_-upMYA/view
          type: string
      required:
      - edit_url
      - view_url
      type: object
    GetUrlImportJobResponse:
      properties:
        job:
          $ref: '#/components/schemas/DesignImportJob'
      required:
      - job
      type: object
    DesignImportStatus:
      description: The status of the design import job.
      enum:
      - failed
      - in_progress
      - success
      example: success
      type: string
    DesignSummary:
      description: Basic details about the design, such as the design's ID, title, and URL.
      properties:
        id:
          description: The design ID.
          example: DAFVztcvd9z
          type: string
        title:
          description: The design title.
          example: My summer holiday
          type: string
        url:
          description: URL of the design.
          example: https://www.canva.com/design/DAFVztcvd9z/edit
          type: string
        thumbnail:
          $ref: '#/components/schemas/Thumbnail'
        urls:
          $ref: '#/components/schemas/DesignLinks'
        created_at:
          description: 'When the design was created in Canva, as a Unix timestamp (in seconds since the Unix

            Epoch).'
          example: 1377396000
          format: int64
          type: integer
        updated_at:
          description: 'When the design was last updated in Canva, as a Unix timestamp (in seconds since the

            Unix Epoch).'
          example: 1692928800
          format: int64
          type: integer
        page_count:
          description: The total number of pages in the design. Some design types don't have pages (for example, Canva docs).
          example: 3
          format: int32
          minimum: 0
          type: integer
      required:
      - created_at
      - id
      - updated_at
      - urls
      type: object
    DesignImportJobResult:
      properties:
        designs:
          description: 'A list of designs imported from the external file. It usually contains one item.

            Imports with a large number of pages or assets are split into multiple designs.'
          items:
            $ref: '#/components/schemas/DesignSummary'
          type: array
      required:
      - designs
      type: object
  securitySchemes:
    basicAuth:
      scheme: basic
      type: http
    oauthAuthCode:
      flows:
        authorizationCode:
          authorizationUrl: https://www.canva.com/api/oauth/authorize
          scopes:
            design:content:read: View the contents of the user's designs.
            design:meta:read: View the metadata of the user's designs.
            design:content:write: Create designs on the user's behalf.
            folder:read: 'View the metadata and contents of the user''s folders, including their **Projects**

              folder.'
            folder:write: 'Add, move, or remove the user''s folders. It also lets you edit folder metadata,

              such as the folder''s name.'
            folder:permission:write: Set, update, or remove permissions assigned to the user's folders.
            asset:read: View the metadata for the user's assets, such as uploaded images.
            asset:write: Upload, update, or delete assets on the user's behalf.
            comment:read: View the comments on the user's designs, and the associated metadata.
            comment:write: Create comments and replies on the user's designs.
            collaboration:event: Receive webhook notifications about events relevant to the user.
            brandtemplate:meta:read: View the metadata of the brand templates associated with the user's brand.
            brandtemplate:content:read: Read the content of the brand templates associated with the user's brand.
            brandtemplate:content:write: Publish brand templates associated with the user's brand.
            profile:read: Read a user's profile and account information.
            openid: Read user information through Open ID Connect (OIDC).
            profile: Read user profile information through OIDC.
            email: Read user email address through OIDC.
          tokenUrl: https://api.canva.com/rest/v1/oauth/token
      type: oauth2