Skip to main content
POST
/
files
Upload file
const form = new FormData();
form.append('file', '<string>');
form.append('purpose', '<string>');

const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

options.body = form;

fetch('https://api.phaseo.ai/v1/files', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
import requests

url = "https://api.phaseo.ai/v1/files"

files = { "file": ("example-file", open("example-file", "rb")) }
payload = { "purpose": "<string>" }
headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, data=payload, files=files, headers=headers)

print(response.text)
curl --request POST \
  --url https://api.phaseo.ai/v1/files \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: multipart/form-data' \
  --form file='@example-file' \
  --form 'purpose=<string>'
package main

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

func main() {

	url := "https://api.phaseo.ai/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\n<string>\r\n-----011000010111000001101001--")

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

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "multipart/form-data")

	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.phaseo.ai/v1/files")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "multipart/form-data")
  .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\n<string>\r\n-----011000010111000001101001--")
  .asString();
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.phaseo.ai/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\n<string>\r\n-----011000010111000001101001--",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: multipart/form-data"
  ],
]);

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

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
require 'uri'
require 'net/http'

url = URI("https://api.phaseo.ai/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'
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\n<string>\r\n-----011000010111000001101001--"

response = http.request(request)
puts response.read_body
{
  "id": "<string>",
  "object": "<string>",
  "bytes": 123,
  "created_at": 123,
  "filename": "<string>",
  "purpose": "<string>",
  "status": "<string>",
  "status_details": {}
}
{
  "error": "error_type",
  "ok": false,
  "message": "Human-readable error message",
  "description": "Additional error details.",
  "generation_id": "G-abc123",
  "status_code": 502,
  "error_type": "system",
  "error_origin": "upstream",
  "reason": "all_candidates_failed",
  "attempt_count": 2,
  "failed_providers": [
    "google-ai-studio",
    "openai"
  ],
  "failed_statuses": [
    403,
    429
  ],
  "upstream_error": {
    "code": "PERMISSION_DENIED",
    "message": "The caller does not have permission.",
    "description": "<string>",
    "param": "<string>"
  },
  "failure_sample": [
    {
      "provider": "<string>",
      "type": "<string>",
      "status": 123,
      "upstream_error_code": "<string>",
      "upstream_error_message": "<string>",
      "upstream_error_description": "<string>",
      "upstream_error_param": "<string>",
      "upstream_payload_preview": "<string>",
      "retryable": true
    }
  ],
  "provider_failure_diagnostics": {
    "hint": "<string>",
    "provider": "<string>"
  },
  "routing_diagnostics": {
    "filterStages": [
      {
        "stage": "<string>",
        "beforeCount": 123,
        "afterCount": 123,
        "droppedProviders": [
          {
            "providerId": "<string>",
            "reason": "<string>"
          }
        ]
      }
    ]
  },
  "provider_candidate_diagnostics": {
    "totalProviders": 123,
    "supportsEndpointCount": 123,
    "candidateCount": 123,
    "droppedUnsupportedEndpoint": [
      "<string>"
    ],
    "droppedMissingAdapter": [
      {
        "providerId": "<string>",
        "endpoint": "<string>"
      }
    ]
  },
  "provider_enablement": {
    "capability": "<string>",
    "providersBefore": [
      "<string>"
    ],
    "providersAfter": [
      "<string>"
    ],
    "dropped": [
      {
        "providerId": "<string>",
        "reason": "<string>"
      }
    ]
  },
  "missing_pricing_providers": [
    "<string>"
  ],
  "provider_payment_required_provider": "openai",
  "provider_payment_required_support_notice": "Our upstream provider billing appears to be unavailable. If this persists, contact support.",
  "details": [
    {}
  ]
}
{
  "error": "error_type",
  "ok": false,
  "message": "Human-readable error message",
  "description": "Additional error details.",
  "generation_id": "G-abc123",
  "status_code": 502,
  "error_type": "system",
  "error_origin": "upstream",
  "reason": "all_candidates_failed",
  "attempt_count": 2,
  "failed_providers": [
    "google-ai-studio",
    "openai"
  ],
  "failed_statuses": [
    403,
    429
  ],
  "upstream_error": {
    "code": "PERMISSION_DENIED",
    "message": "The caller does not have permission.",
    "description": "<string>",
    "param": "<string>"
  },
  "failure_sample": [
    {
      "provider": "<string>",
      "type": "<string>",
      "status": 123,
      "upstream_error_code": "<string>",
      "upstream_error_message": "<string>",
      "upstream_error_description": "<string>",
      "upstream_error_param": "<string>",
      "upstream_payload_preview": "<string>",
      "retryable": true
    }
  ],
  "provider_failure_diagnostics": {
    "hint": "<string>",
    "provider": "<string>"
  },
  "routing_diagnostics": {
    "filterStages": [
      {
        "stage": "<string>",
        "beforeCount": 123,
        "afterCount": 123,
        "droppedProviders": [
          {
            "providerId": "<string>",
            "reason": "<string>"
          }
        ]
      }
    ]
  },
  "provider_candidate_diagnostics": {
    "totalProviders": 123,
    "supportsEndpointCount": 123,
    "candidateCount": 123,
    "droppedUnsupportedEndpoint": [
      "<string>"
    ],
    "droppedMissingAdapter": [
      {
        "providerId": "<string>",
        "endpoint": "<string>"
      }
    ]
  },
  "provider_enablement": {
    "capability": "<string>",
    "providersBefore": [
      "<string>"
    ],
    "providersAfter": [
      "<string>"
    ],
    "dropped": [
      {
        "providerId": "<string>",
        "reason": "<string>"
      }
    ]
  },
  "missing_pricing_providers": [
    "<string>"
  ],
  "provider_payment_required_provider": "openai",
  "provider_payment_required_support_notice": "Our upstream provider billing appears to be unavailable. If this persists, contact support.",
  "details": [
    {}
  ]
}
Save the returned file_id and reuse it with:
  • POST /v1/batches
  • GET /v1/files/{file_id}
  • GET /v1/files/{file_id}/content
GET /v1/files is not currently supported on the shared gateway key, so the upload response is the canonical place to capture the file id.

Authorizations

Authorization
string
header
required

Bearer token authentication

Body

multipart/form-data
file
file
required
purpose
string
required

Response

Uploaded file metadata

id
string
object
string
bytes
integer
created_at
integer
filename
string
purpose
string
status
string
status_details
object
Last modified on June 11, 2026