cURL
curl https://api.perceptron.inc/v1/files \
-H "Authorization: Bearer $PERCEPTRON_API_KEY" \
-F purpose=vision \
-F 'file=@video.mp4'import requests
url = "https://api.perceptron.inc/v1/files"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = { "purpose": "vision" }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('purpose', 'vision');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.perceptron.inc/v1/files', 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.perceptron.inc/v1/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$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.perceptron.inc/v1/files"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
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.perceptron.inc/v1/files")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.perceptron.inc/v1/files")
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"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"bytes": 123,
"created_at": 123,
"filename": "<string>",
"id": "<string>",
"object": "<string>",
"purpose": "vision"
}{
"error": {
"code": null,
"message": "Unsupported content type 'text/plain'. Supported: image/jpeg, image/png, image/webp, video/mp4, video/quicktime, video/webm",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"code": null,
"message": "Invalid API key",
"param": null,
"type": "authentication_error"
}
}{
"error": {
"code": null,
"message": "Content-Length header is required for /v1/files.",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"code": null,
"message": "You exceeded your current quota, please check your plan and billing details.",
"param": null,
"type": "insufficient_quota"
}
}{
"error": {
"code": null,
"message": "The server had an error while processing your request.",
"param": null,
"type": "server_error"
}
}Upload File
Accepts a single file via multipart upload alongside a purpose field that
declares how the file will be used. Subject to per-file and per-organization
storage limits.
POST
/
v1
/
files
cURL
curl https://api.perceptron.inc/v1/files \
-H "Authorization: Bearer $PERCEPTRON_API_KEY" \
-F purpose=vision \
-F 'file=@video.mp4'import requests
url = "https://api.perceptron.inc/v1/files"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = { "purpose": "vision" }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('purpose', 'vision');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.perceptron.inc/v1/files', 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.perceptron.inc/v1/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$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.perceptron.inc/v1/files"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
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.perceptron.inc/v1/files")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.perceptron.inc/v1/files")
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"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nvision\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"bytes": 123,
"created_at": 123,
"filename": "<string>",
"id": "<string>",
"object": "<string>",
"purpose": "vision"
}{
"error": {
"code": null,
"message": "Unsupported content type 'text/plain'. Supported: image/jpeg, image/png, image/webp, video/mp4, video/quicktime, video/webm",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"code": null,
"message": "Invalid API key",
"param": null,
"type": "authentication_error"
}
}{
"error": {
"code": null,
"message": "Content-Length header is required for /v1/files.",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"code": null,
"message": "You exceeded your current quota, please check your plan and billing details.",
"param": null,
"type": "insufficient_quota"
}
}{
"error": {
"code": null,
"message": "The server had an error while processing your request.",
"param": null,
"type": "server_error"
}
}Upload a file as
Need higher limits? Contact us.
Rate limit: 60 requests/min.
multipart/form-data (file + purpose) to reference by id in later requests. Compatible with OpenAI’s Upload file endpoint.
The response returns the file’s id (e.g. file-abc123). See Working with files for how to reference it in a chat completion.
Limits
| Limit | Value |
|---|---|
| Maximum file size | 128 MiB |
| Total storage per organization | 100 GiB |
Authorizations
Bearer token authentication using your Perceptron API key
Body
multipart/form-data
Multipart form body for POST /v1/files. Send the file bytes in the file
field and the file's intended purpose.
Response
File uploaded.
File size in bytes.
Unix timestamp (seconds) when the file was created.
Original file name.
File ID, e.g. file-abc123.
Always "file".
File purpose.
Available options:
vision, user_data Example:
"vision"
⌘I