Skip to main content
POST
/
v1
/
files
/
upload-url
Create upload URL
curl --request POST \
  --url https://api.cadanapay.com/v1/files/upload-url \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "purpose": "kyc-id-front",
  "contentType": "image/jpeg"
}
'
import requests

url = "https://api.cadanapay.com/v1/files/upload-url"

payload = {
"purpose": "kyc-id-front",
"contentType": "image/jpeg"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({purpose: 'kyc-id-front', contentType: 'image/jpeg'})
};

fetch('https://api.cadanapay.com/v1/files/upload-url', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cadanapay.com/v1/files/upload-url",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'purpose' => 'kyc-id-front',
'contentType' => 'image/jpeg'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.cadanapay.com/v1/files/upload-url"

payload := strings.NewReader("{\n \"purpose\": \"kyc-id-front\",\n \"contentType\": \"image/jpeg\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.cadanapay.com/v1/files/upload-url")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"purpose\": \"kyc-id-front\",\n \"contentType\": \"image/jpeg\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.cadanapay.com/v1/files/upload-url")

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/json'
request.body = "{\n \"purpose\": \"kyc-id-front\",\n \"contentType\": \"image/jpeg\"\n}"

response = http.request(request)
puts response.read_body
{
  "fileId": "517075a2-17db-469f-9481-eb8347cb920c",
  "putUrl": "https://cadana-kyc.s3.amazonaws.com/tmp/file_9c52fa2e ?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=…",
  "expiresIn": 900
}
{
"code": "invalid_request_body",
"message": "The request body provided is not valid",
"params": {
"field": "Value is invalid."
}
}
{
"code": "internal_error",
"message": "An unexpected error occurred. Please try again later."
}

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

X-MultiTenantKey
string

Required when using a Platform API token. The tenant key identifying which business to operate on.

Body

application/json
purpose
enum<string>
required

Logical reason for the upload

Available options:
kyc-id-front,
kyc-id-back,
kyc-selfie,
kyc-id-selfie,
kyb-incorporation-document,
kyb-tax-certificate,
kyb-address-proof,
kyc-address-proof,
reimbursements-proof,
business-onboarding-document,
contract,
milestone-document,
statutory-document
Example:

"kyc-id-front"

contentType
string
required

MIME type that must be used in the PUT request

Example:

"image/jpeg"

fileName
string

The original name of the file being uploaded (optional). When provided, it is saved and returned when the file is retrieved later, so it can be shown instead of a generated name.

Example:

"passport-front.jpeg"

Response

Pre-signed PUT URL and file identifier

fileId
string<uuid>
required
Example:

"517075a2-17db-469f-9481-eb8347cb920c"

putUrl
string<uri>
required

Pre-signed HTTPS URL (single-use)

expiresIn
integer
required

Seconds until the URL expires

Example:

900