curl --request POST \
--url https://api.originalis.ai/api/v1/deals/analyze/upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form kind=company \
--form 'company_name=<string>'import requests
url = "https://api.originalis.ai/api/v1/deals/analyze/upload"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"kind": "company",
"company_name": "<string>"
}
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('kind', 'company');
form.append('company_name', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.originalis.ai/api/v1/deals/analyze/upload', 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.originalis.ai/api/v1/deals/analyze/upload",
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.originalis.ai/api/v1/deals/analyze/upload"
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.originalis.ai/api/v1/deals/analyze/upload")
.header("Authorization", "Bearer <token>")
.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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.originalis.ai/api/v1/deals/analyze/upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"deal_id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"status": "queued",
"status_url": "/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f/analysis",
"result_url": "/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"as_of": "2026-09-02T14:00:00Z"
}{
"detail": "Invalid or revoked API key."
}{
"detail": "This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."
}{
"detail": "API key verification is temporarily unavailable. Retry shortly."
}Analyze an uploaded deck or document
Upload a file and run the full analysis pipeline on it.
Multipart form. The same pipeline as an in-app deck upload:
PPT/DOC formats are converted to PDF, the deal record is created in
your org workspace, and the analysis runs asynchronously — poll
status_url. Max 50 MB; requires a write-scoped key and draws down
the daily actions budget.
curl --request POST \
--url https://api.originalis.ai/api/v1/deals/analyze/upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form kind=company \
--form 'company_name=<string>'import requests
url = "https://api.originalis.ai/api/v1/deals/analyze/upload"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"kind": "company",
"company_name": "<string>"
}
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('kind', 'company');
form.append('company_name', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.originalis.ai/api/v1/deals/analyze/upload', 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.originalis.ai/api/v1/deals/analyze/upload",
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.originalis.ai/api/v1/deals/analyze/upload"
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.originalis.ai/api/v1/deals/analyze/upload")
.header("Authorization", "Bearer <token>")
.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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.originalis.ai/api/v1/deals/analyze/upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
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=\"kind\"\r\n\r\ncompany\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"company_name\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"deal_id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"status": "queued",
"status_url": "/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f/analysis",
"result_url": "/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"as_of": "2026-09-02T14:00:00Z"
}{
"detail": "Invalid or revoked API key."
}{
"detail": "This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."
}{
"detail": "API key verification is temporarily unavailable. Retry shortly."
}Authorizations
An Originalis API key: Authorization: Bearer ak_...
Body
Response
Successful Response
Accepted analysis submission (HTTP 202).
The deal being built — stable from the moment of submission.
Poll GET here until status is 'succeeded' or 'failed'.
Where the finished deal record will be readable.
"queued"Document submissions only. True when the host (DocSend) requires email verification: Originalis completes it automatically via the key user's connected inbox, or emails the key user a verification request — the analysis proceeds once verified. Null for website submissions.