Create an investigation
Start an investigation. Rupt accepts it immediately with status queued and runs it in the background, usually within a few minutes. Poll retrieve an investigation or subscribe to the investigation.completed webhook.
Attach the account when you have one: the agent then starts from everything Rupt knows about it, including sessions, devices, linked accounts, contact points and verified identity documents. Claims, links, images and text go in alongside. Pass at least one of user, claims, urls, text, attachments or profile_capture.
This endpoint is server-to-server only and accepts the project secret.
Body parameters
type string REQUIRED
The question to answer. Currently identity.
user string
The external ID of the account under investigation, in the environment of your project secret. Returns 404 when no such account exists.
claims object
What the person claims, as up to 30 short key-value pairs. Keys are yours: name, title, employer, location, education, linkedin, and so on. Values are strings of at most 500 characters.
urls array of strings
Up to 10 links worth checking: profile pages, portfolios, company pages, or publicly reachable photos. Pages behind a login, including LinkedIn profiles, cannot be fetched; the agent searches for their public text instead.
text string
Up to 20,000 characters of material: a pasted profile, an application form, screening answers, a resume. Treated as evidence, never as instructions.
attachments array of objects
Up to 5 images the agent reads before it plans: a profile photo, a capture of the profile's verification panel, an identity document. Each item takes kind (profile_photo, screenshot, document or other), data (a JPEG, PNG or WebP of at most 4 MB, as base64 or a data URL), an optional note of up to 300 characters, and provided_by: operator (the default) when your team captured it, subject when the person sent it.
The agent says what each image actually shows, lifts the facts it carries into claims, cross-checks them against the other claims, and runs the authenticity check on photographs of people. A capture from your team counts as an observation; one from the subject counts as a claim to test. The request body may be up to 32 MB.
profile_capture object
What your team saw on the person's profile with their own signed-in browser, as text, so the agent can judge the parts of a profile it cannot fetch. The Rupt profile capture extension produces it. Fields: platform (linkedin), url, captured_at (ISO 8601), optional provided_by (operator by default, or subject), the text sections top_card, verification_panel (the About this member panel: join month, recent changes, verifications and the ID issuing country), about, experience, education and skills (up to 8,000 characters each), activity (the recent posts page, up to 12,000), suggested_profiles (up to 20 of name, degree, headline, url), related_profiles (up to 5 suggested profiles that were opened: url, name, headline, location, verification_panel) and problems (what the capture could not get).
The agent reads the verification panel for account age, recent changes and verifications, the suggested profiles for network coherence, the experience, education and about text for internal consistency and as claims to test, the activity page for content authenticity, and the opened profiles for template matches. Pair it with the matching screenshots as attachments when you have them.
directions string
Up to 2,000 characters telling the agent what matters to you, for example the role the person applied for or the claim you most need settled.
decision_rules object
What each decision should mean for this investigation, as accept, review, reject and inconclusive keys of up to 600 characters each. Set only the ones you want to change; the rest keep the defaults listed under report.decision on the investigation object. For example {"reject": "Only when two load-bearing claims are contradicted by independent sources.", "review": "Any single contradiction, or a profile under six months old."} makes the agent slower to reject and quicker to send a case to a reviewer.
Returns
Returns
202 with an investigation object in status queued.
Errors
A 400 with an errors array when the body is invalid, an attachment is not a JPEG, PNG or WebP under 4 MB, or none of user, claims, urls, text, attachments or profile_capture is present. A 404 with user_not_found when the account does not exist in the environment. A 401 when the secret is missing or wrong.
import axios from 'axios';
const { data } = await axios.post(
'https://api.rupt.dev/v3/investigations',
{
type: 'identity',
user: 'expert_48213',
claims: {
name: 'Rowan Castellanos',
title: 'AI infrastructure advisor',
employers: 'OpenAI 2021 to 2025, NVIDIA 2016 to 2021',
location: 'Austin, Texas',
linkedin: 'https://www.linkedin.com/in/rowan-castellanos',
},
urls: ['https://www.linkedin.com/in/rowan-castellanos'],
attachments: [
{
kind: 'screenshot',
note: 'About this member panel, captured by our screening team',
data: aboutPanelPng.toString('base64'),
},
],
directions:
'Applicant for an AI infrastructure expert call. Check the career claims and whether the profile is part of a ring.',
},
{
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${API_SECRET}`,
},
}
);
{
"id": "67160f3e1c9d440012a8b1f4",
"type": "identity",
"status": "queued",
"user": "expert_48213",
"directions": "Applicant for an AI infrastructure expert call. Check the career claims and whether the profile is part of a ring.",
"inputs": {
"claims": {
"name": "Rowan Castellanos",
"title": "AI infrastructure advisor",
"employers": "OpenAI 2021 to 2025, NVIDIA 2016 to 2021",
"location": "Austin, Texas",
"linkedin": "https://www.linkedin.com/in/rowan-castellanos"
},
"urls": ["https://www.linkedin.com/in/rowan-castellanos"]
},
"activity": [],
"createdAt": "2026-10-21T18:02:10.000Z"
}