---
title: "POST /v1/image-transformations"
method: POST
path: "/v1/image-transformations"
tags: ["image_transformation"]
---

# POST /v1/image-transformations

`POST /v1/image-transformations`

<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/apps/rest-apis/versions/).
- Public apps that use preview APIs will not pass the review process, and can't be made available to all Canva users.

</Warning>

Starts a new [asynchronous job](https://www.canva.dev/docs/apps/rest-apis/requests-responses/#asynchronous-job-endpoints) to apply one or more transformations to an image asset. A successful job produces a single new image asset with all of the requested transformations applied. The source asset isn't modified, and intermediate results aren't returned.

The request requires the ID of the source asset and at least one transformation. The source asset must be an image asset, such as one created using the [Asset upload APIs](https://www.canva.dev/docs/apps/rest-apis/reference/assets/).

Transformations are applied in the order provided, with each one stacked on the result of the previous one.

Starting a job consumes the user's [AI credit allowance](https://www.canva.com/help/ai-access/). If the user has reached their AI allowance limit, the request returns a `429` error with the `credit_quota_exceeded` code. Polling for the result of a job using the [Get image transformation job API](https://www.canva.dev/docs/apps/rest-apis/reference/image-transformations/get-image-transformation-job/) doesn't consume any of the allowance.

<Note>

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

</Note>

## Request body

- CreateImageTransformationJobRequest
  - `asset_id` string, required — The ID of the source asset to transform. The asset must be an image asset; referencing any other asset type (such as a video) fails with an `unsupported_content_type` error. The asset must also have finished uploading. An asset that is still uploading has no image to transform yet and fails with an `asset_not_ready` error. If you've just created the asset, poll its upload job — for example with the [Get asset upload job](https://www.canva.dev/docs/apps/rest-apis/reference/assets/get-asset-upload-job/) endpoint — until it returns a `success` status before starting a transformation.
  - `name` string — A name for the new image asset that the job produces. Canva doesn't localize this value, so provide a name in the user's language. When omitted, the new asset inherits the name of the source asset.
  - `transformations` ImageTransformationType[], required — The transformations to apply, in order. Must contain at least one transformation. Each transformation is stacked on the result of the previous one. The job's result is a single new image asset with all of the transformations applied; intermediate results are not returned.
    - `type` 'background_removal', required — The type of transformation to apply. Currently, the only supported value is `background_removal`.

## Response `200`

OK

- CreateImageTransformationJobResponse
  - `job` ImageTransformationJob, required — Details about the image transformation job. If the job status is `success`, the job's `result` is present.
    - `id` string — The image transformation job ID. Only present if the job status is `in_progress`. A job that completes immediately returns its `result` or `error` directly and has no ID to poll.
    - `status` 'failed' | 'in_progress' | 'success', required — The status of the image transformation job. A newly created job will be `in_progress` and will eventually become `success` or `failed`. A job may also complete immediately, returning `success` or `failed` from job creation. If the status is `success`, the job's `result` is present.
    - `result` ImageTransformationJobResult — Result of the image transformation job. Only present if the job status is `success`.
      - `asset` Asset, required — The asset object, which contains metadata about the asset.
        - `type` 'image' | 'video', required — Type of an asset.
        - `id` string, required — The ID of the asset.
        - `name` string, required — The name of the asset.
        - `tags` string[], required — The user-facing tags attached to the asset. Users can add these tags to their uploaded assets, and they can search their uploaded assets in the Canva UI by searching for these tags. For information on how users use tags, see the [Canva Help Center page on asset tags](https://www.canva.com/help/add-edit-tags/).
        - `import_status` ImportStatus — The import status of the asset.
          - `state` 'failed' | 'in_progress' | 'success', required — State of the import job for an uploaded asset.
          - `error` ImportError — If the import fails, this object provides details about the error.
            - `code` 'file_too_big' | 'import_failed', required — A short string indicating why the upload failed. This field can be used to handle errors programmatically.
            - `message` string, required — A human-readable description of what went wrong.
        - `created_at` integer, required — When the asset was added to Canva, as a Unix timestamp (in seconds since the Unix Epoch).
        - `updated_at` integer, required — When the asset was last updated in Canva, as a Unix timestamp (in seconds since the Unix Epoch).
        - `owner` TeamUserSummary, required — Metadata for the user, consisting of the User ID and Team ID.
          - `user_id` string, required — The ID of the user.
          - `team_id` string, required — The ID of the user's Canva Team.
        - `thumbnail` Thumbnail — A thumbnail image representing the object.
          - `width` integer, required — The width of the thumbnail image in pixels.
          - `height` integer, required — The height of the thumbnail image in pixels.
          - `url` string, required — 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.
        - `metadata` union — Type-specific metadata for the asset.
          - object
            - `type` 'image', required
            - `width` integer — The width of the image in pixels.
            - `height` integer — The height of the image in pixels.
            - `smart_tags` string[] — AI-generated tags for the image.
          - object
            - `type` 'video', required
            - `width` integer, required — The width of the video in pixels.
            - `height` integer, required — The height of the video in pixels.
            - `duration` integer — The duration of the video in seconds.
    - `error` ImageTransformationError — If the image transformation job fails, this object provides details about the error. Only present if the job status is `failed`.
      - `code` 'no_foreground_found' | 'quota_exceeded' | 'internal_error', required — Error code indicating what went wrong with the image transformation.
      - `message` string, required — A human-readable description of what went wrong.

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `429` — Credit Quota Exceeded
- `default` — Error Response

## Changes

- **2026-09-23** `891d9fc4bc48` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/canva/apis/canva-connect-api/changes/v1/image-transformations/post.md)

---

[API](https://skmtc.dev/canva/apis/canva-connect-api.md) · [All operations](https://skmtc.dev/canva/apis/canva-connect-api/llms.txt) · [OpenAPI document](https://skmtc.dev/canva/apis/canva-connect-api/revisions/328682d29ec4?raw)
