curl --request POST \
--url https://api.originalis.ai/api/v1/deals/analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"website_url": "https://acmerobotics.com",
"company_name": "Acme Robotics",
"kind": "company"
}
'import requests
url = "https://api.originalis.ai/api/v1/deals/analyze"
payload = {
"website_url": "https://acmerobotics.com",
"company_name": "Acme Robotics",
"kind": "company"
}
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({
website_url: 'https://acmerobotics.com',
company_name: 'Acme Robotics',
kind: 'company'
})
};
fetch('https://api.originalis.ai/api/v1/deals/analyze', 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",
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([
'website_url' => 'https://acmerobotics.com',
'company_name' => 'Acme Robotics',
'kind' => 'company'
]),
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.originalis.ai/api/v1/deals/analyze"
payload := strings.NewReader("{\n \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\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.originalis.ai/api/v1/deals/analyze")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.originalis.ai/api/v1/deals/analyze")
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 \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\n}"
response = http.request(request)
puts response.read_body{
"deal_id": "8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d",
"status": "queued",
"status_url": "/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d/analysis",
"result_url": "/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d",
"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": "An analysis for this domain is already running in your org. Poll your deals list for the in-flight record."
}{
"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 a company or fund
Submit a company or fund website for full Originalis analysis.
Dispatches the same pipeline the in-app “generate from website” flow
uses: the site is read, a deal record is created in your org
workspace, and the full analysis (company intelligence, market,
team, scoring) runs asynchronously — typically minutes. Poll the
returned status_url; when it reports succeeded, the finished
record is at result_url.
Requires a write-scoped API key and draws down the daily actions budget. One analysis per (org, domain) may run at a time — a concurrent duplicate submission returns 409.
Instead of a website, document_url accepts a hosted deck or
document (DocSend, Notion, Canva, Dropbox, Google Drive, Figma,
Gamma) — same 202 contract; verification_required reports whether
a DocSend link still needs email verification (handled server-side
via the key user’s inbox). For a raw file, use
POST /deals/analyze/upload.
curl --request POST \
--url https://api.originalis.ai/api/v1/deals/analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"website_url": "https://acmerobotics.com",
"company_name": "Acme Robotics",
"kind": "company"
}
'import requests
url = "https://api.originalis.ai/api/v1/deals/analyze"
payload = {
"website_url": "https://acmerobotics.com",
"company_name": "Acme Robotics",
"kind": "company"
}
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({
website_url: 'https://acmerobotics.com',
company_name: 'Acme Robotics',
kind: 'company'
})
};
fetch('https://api.originalis.ai/api/v1/deals/analyze', 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",
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([
'website_url' => 'https://acmerobotics.com',
'company_name' => 'Acme Robotics',
'kind' => 'company'
]),
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.originalis.ai/api/v1/deals/analyze"
payload := strings.NewReader("{\n \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\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.originalis.ai/api/v1/deals/analyze")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.originalis.ai/api/v1/deals/analyze")
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 \"website_url\": \"https://acmerobotics.com\",\n \"company_name\": \"Acme Robotics\",\n \"kind\": \"company\"\n}"
response = http.request(request)
puts response.read_body{
"deal_id": "8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d",
"status": "queued",
"status_url": "/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d/analysis",
"result_url": "/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d",
"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": "An analysis for this domain is already running in your org. Poll your deals list for the in-flight record."
}{
"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
Submit a company or fund for full Originalis analysis.
Exactly one source: website_url (the site is read and analyzed)
or document_url (a hosted deck/document is ingested and
analyzed — DocSend, Notion, Canva, Dropbox, Google Drive, Figma,
Gamma).
The company's (or fund manager's) website, e.g. 'https://acmerobotics.com'. Must start with http:// or https://.
8 - 2048A hosted deck or document to analyze instead of a website: DocSend, Notion, Canva, Dropbox, Google Drive, Figma, or Gamma link. Unsupported hosts return 400.
8 - 2048Password for a protected document link (e.g. DocSend).
200Display name; inferred from the site when omitted.
300'company' (GP flow) or 'fund' (LP fund flow).
company, fund 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.