Create asset upload job Create an asynchronous job to upload an asset.
Starts a new job to upload an asset to a user's content library.
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.
You can check the status and get the results of asset upload jobs created with this API using the Get asset upload job API .
HTTP method and URL path
POST https://api.canva.com /rest /v1 /asset-uploads
Authentication
This endpoint requires a valid access token that acts on behalf of a user. The token must have the following scopes (permissions):
For more information, see Scopes .
Provides credentials to authenticate the request, in the form of a Bearer
token.
For example: Authorization: Bearer {token}
Indicates the media type of the information sent in the request. This must be set to application/octet-stream
.
For example: Content-Type: application/octet-stream
Body parameters
Binary of the asset to upload.
Example request
Examples for using the /v1/asset-uploads
endpoint:
cURL Node.js Java Python C# Go PHP Ruby
curl --request POST 'https://api.canva.com/rest/v1/asset-uploads' \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/octet-stream' \
--header 'Asset-Upload-Metadata: { "name_base64": "TXkgQXdlc29tZSBVcGxvYWQg8J+agA==" }' \
--data-binary '@/path/to/file'
const fetch = require ( "node-fetch" ) ;
const fs = require ( "fs" ) ;
fetch ( "https://api.canva.com/rest/v1/asset-uploads" , {
method : "POST" ,
headers : {
"Asset-Upload-Metadata" : JSON . stringify ( { "name_base64" : "TXkgQXdlc29tZSBVcGxvYWQg8J+agA==" } ) ,
"Authorization" : "Bearer {token}" ,
"Content-Length" : fs . statSync ( "/path/to/file" ) . size ,
"Content-Type" : "application/octet-stream" ,
} ,
body : fs . createReadStream ( "/path/to/file" ) ,
} )
. then ( async ( response ) => {
const data = await response . json ( ) ;
console . log ( data ) ;
} )
. catch ( err => console . error ( err ) ) ;
import java . io . IOException ;
import java . net . URI ;
import java . net . http . * ;
import java . nio . file . Paths ;
public class ApiExample {
public static void main ( String [ ] args ) throws IOException , InterruptedException {
HttpRequest request = HttpRequest . newBuilder ( )
. uri ( URI . create ( "https://api.canva.com/rest/v1/asset-uploads" ) )
. header ( "Authorization" , "Bearer {token}" )
. header ( "Content-Type" , "application/octet-stream" )
. header ( "Asset-Upload-Metadata" , "{ \"name_base64\": \"TXkgQXdlc29tZSBVcGxvYWQg8J+agA==\" }" )
. method ( "POST" , HttpRequest . BodyPublishers . ofFile ( Paths . get ( "/path/to/file" ) ) )
. build ( ) ;
HttpResponse < String > response = HttpClient . newHttpClient ( ) . send (
request ,
HttpResponse . BodyHandlers . ofString ( )
) ;
System . out . println ( response . body ( ) ) ;
}
}
import requests
import json
headers = {
"Authorization" : "Bearer {token}" ,
"Content-Type" : "application/octet-stream" ,
"Asset-Upload-Metadata" : json . dumps ( { "name_base64" : "TXkgQXdlc29tZSBVcGxvYWQg8J+agA==" } )
}
with open ( "/path/to/file" , "rb" ) as file :
response = requests . post ( "https://api.canva.com/rest/v1/asset-uploads" ,
headers = headers ,
data = file
)
print ( response . json ( ) )
using System . Net . Http ;
using System . Net . Http . Headers ;
var client = new HttpClient ( ) ;
var request = new HttpRequestMessage
{
Method = HttpMethod . Post ,
RequestUri = new Uri ( "https://api.canva.com/rest/v1/asset-uploads" ) ,
Headers =
{
{ "Authorization" , "Bearer {token}" } ,
{ "Asset-Upload-Metadata" , "{ \"name_base64\": \"TXkgQXdlc29tZSBVcGxvYWQg8J+agA==\" }" } ,
} ,
Content = new StreamContent ( File . OpenRead ( "/path/to/file" ) )
{
Headers =
{
ContentType = new MediaTypeHeaderValue ( "application/octet-stream" ) ,
}
} ,
} ;
using ( var response = await client . SendAsync ( request ) )
{
response . EnsureSuccessStatusCode ( ) ;
var body = await response . Content . ReadAsStringAsync ( ) ;
Console . WriteLine ( body ) ;
} ;
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main ( ) {
payload , _ := os . Open ( "/path/to/file" )
defer payload . Close ( )
url := "https://api.canva.com/rest/v1/asset-uploads"
req , _ := http . NewRequest ( "POST" , url , payload )
req . Header . Add ( "Authorization" , "Bearer {token}" )
req . Header . Add ( "Content-Type" , "application/octet-stream" )
req . Header . Add ( "Asset-Upload-Metadata" , "{ \"name_base64\": \"TXkgQXdlc29tZSBVcGxvYWQg8J+agA==\" }" )
res , _ := http . DefaultClient . Do ( req )
defer res . Body . Close ( )
body , _ := io . ReadAll ( res . Body )
fmt . Println ( string ( body ) )
}
$curl = curl_init ( ) ;
curl_setopt_array ( $curl , array (
CURLOPT_URL => "https://api.canva.com/rest/v1/asset-uploads" ,
CURLOPT_CUSTOMREQUEST => "POST" ,
CURLOPT_RETURNTRANSFER => true ,
CURLOPT_HTTPHEADER => array (
'Authorization: Bearer {token}' ,
'Content-Type: application/octet-stream' ,
'Asset-Upload-Metadata: { "name_base64": "TXkgQXdlc29tZSBVcGxvYWQg8J+agA==" }' ,
) ,
CURLOPT_POSTFIELDS => file_get_contents ( "/path/to/file" )
) ) ;
$response = curl_exec ( $curl ) ;
$err = curl_error ( $curl ) ;
curl_close ( $curl ) ;
if ( empty ( $err ) ) {
echo $response ;
} else {
echo "Error: " . $err ;
}
require 'net/http'
require 'uri'
url = URI ( 'https://api.canva.com/rest/v1/asset-uploads' )
http = Net :: HTTP . new ( url . host , url . port )
http . use_ssl = true
request = Net :: HTTP :: Post . new ( url )
request [ 'Authorization' ] = 'Bearer {token}'
request [ 'Content-Type' ] = 'application/octet-stream'
request [ 'Asset-Upload-Metadata' ] = '{ "name_base64": "TXkgQXdlc29tZSBVcGxvYWQg8J+agA==" }'
request . body = File . read ( '/path/to/file' )
response = http . request ( request )
puts response . read_body
Success response
If successful, the endpoint returns a 200
response with a JSON body with the following parameters:
The status of the asset upload job.
Properties of job
The ID of the asset upload job.
Status of the asset upload job. This can be one of the following:
failed
in_progress
success
If the upload fails, this object provides details about the error.
Properties of error
A short string indicating why the upload failed. This field can be used to handle errors
programmatically. This can be one of the following:
file_too_big
import_failed
A human-readable description of what went wrong.
The asset object, which contains metadata about the asset.
Properties of asset
When the asset was added to Canva, as a Unix timestamp (in seconds since the Unix
Epoch).
When the asset was last updated in Canva, as a Unix timestamp (in seconds since the
Unix Epoch).
A thumbnail image representing the object.
Properties of thumbnail
The width of the thumbnail image in pixels.
The height of the thumbnail image in pixels.
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.
The import status of the asset.
Properties of import_status
State of the import job for an uploaded asset. This can be one of the following:
failed
in_progress
success
If the import fails, this object provides details about the error.
Properties of error
A human-readable description of what went wrong.
A short string indicating why the upload failed. This field can be used to handle errors programmatically. This can be one of the following:
file_too_big
import_failed
Example response
{
"job" : {
"id" : "Msd59349ff" ,
"status" : "success" ,
"asset" : {
"id" : "Msd59349ff" ,
"name" : "My Awesome Upload" ,
"tags" : [
"image" ,
"holiday" ,
"best day ever"
] ,
"created_at" : 1377396000 ,
"updated_at" : 1692928800 ,
"thumbnail" : {
"width" : 595 ,
"height" : 335 ,
"url" : "https://document-export.canva.com/Vczz9/zF9vzVtdADc/2/thumbnail/0001.png?<query-string>"
}
}
}
}
Try it out