API Documentation
Programmatic access to Probe AI research. Integrate deep, multi-agent intelligence into your applications.
Contents
Authentication
All API requests require a Bearer token. API keys are scoped to your organization and can be created from Team Settings by an admin or owner.
Include the key in the Authorization header:
Authorization: Bearer probe_key_abc123...Security: API keys are hashed before storage and cannot be retrieved after creation. Store your key securely. If compromised, revoke it immediately from Team Settings and create a new one.
Base URL
https://tryprobe.io/api/v1Create Research
/api/v1/researchSubmit a research query and receive a comprehensive intelligence report. The response is returned as JSON after the research completes (not streamed). Credits are deducted before research begins and refunded on failure.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | Required | The research question. Max 5,000 characters. |
| depth | string | Optional | "flash", "quick", "deep", or "deep_high". Defaults to "quick". |
| context | string | Optional | Additional context to guide the research. |
Response
{
"id": "uuid-of-research-query",
"query": "What is the current state of DeFi lending?",
"depth": "deep",
"content": "# Executive Summary\n\n...",
"sources": [
{
"title": "Source Title",
"url": "https://example.com/article",
"snippet": "Relevant excerpt..."
}
],
"tokenUsage": {
"input_tokens": 12500,
"output_tokens": 3200
},
"durationMs": 45000,
"balance": 1500
}List Research
/api/v1/researchList past research queries for your organization. Supports pagination and filtering.
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| limit | 20 | Number of results (1-100). |
| offset | 0 | Pagination offset. |
| status | all | Filter by status: completed, failed, pending. |
| depth | all | Filter by depth: flash, quick, deep, deep_high. |
Response
{
"data": [
{
"id": "uuid",
"query": "Analyze DeFi lending protocols",
"depth": "deep",
"status": "completed",
"charge_cents": 200,
"duration_ms": 95000,
"created_at": "2026-03-08T12:00:00Z",
"completed_at": "2026-03-08T12:01:35Z"
}
],
"limit": 20,
"offset": 0
}Get Research
/api/v1/research/:idRetrieve a specific research result by ID. Includes the full report, sources, and any follow-up queries.
Response
{
"id": "uuid",
"query": "Analyze DeFi lending protocols",
"depth": "deep",
"status": "completed",
"content": "# Executive Summary\n\n...",
"sources": [...],
"tokenUsage": { "input_tokens": 12500, "output_tokens": 3200 },
"chargeCents": 200,
"durationMs": 95000,
"createdAt": "2026-03-08T12:00:00Z",
"completedAt": "2026-03-08T12:01:35Z",
"error": null,
"followUps": [
{
"id": "uuid",
"question": "Follow-up: Which protocol has the highest TVL?",
"content": "Based on the research...",
"status": "completed",
"durationMs": 5000,
"createdAt": "2026-03-08T12:05:00Z"
}
]
}Delete Research
/api/v1/research/:idDelete a research query and all its follow-ups. This action is irreversible.
{
"success": true,
"id": "uuid-of-deleted-query"
}Follow-up Query
/api/v1/research/:id/followupAsk a follow-up question about a completed research query. Follow-ups are free and use the context from the original research to provide targeted answers.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| question | string | Required | The follow-up question. Max 5,000 characters. |
Response
{
"id": "uuid-of-followup",
"researchId": "uuid-of-original-research",
"question": "Which protocol has the highest TVL?",
"content": "Based on the research, Aave currently...",
"durationMs": 5200
}Check Balance
/api/v1/balanceCheck your organization's current credit balance. Use this to verify you have sufficient credits before submitting research.
Response
{
"balanceCents": 5000,
"lifetimeDepositedCents": 25000,
"lifetimeUsedCents": 20000,
"pricing": {
"flash": 15,
"quick": 50,
"deep": 200,
"deep_high": 500
}
}All amounts are in cents (USD). Divide by 100 for dollar amounts.
Rate Limits
API requests are rate limited to 10 requests per minute per organization.
Rate limit information is included in response headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests per window (10). |
| X-RateLimit-Remaining | Remaining requests in current window. |
| Retry-After | Seconds to wait before retrying (on 429). |
Code Examples
curl
curl -X POST https://tryprobe.io/api/v1/research \
-H "Authorization: Bearer probe_key_abc123..." \
-H "Content-Type: application/json" \
-d '{
"query": "What are the latest developments in Solana DeFi?",
"depth": "quick"
}'curl -X POST https://tryprobe.io/api/v1/research \
-H "Authorization: Bearer probe_key_abc123..." \
-H "Content-Type: application/json" \
-d '{
"query": "Analyze the competitive landscape of AI coding assistants",
"depth": "deep_high",
"context": "Focus on enterprise adoption, pricing models, and developer satisfaction metrics"
}'Python
import requests
API_KEY = "probe_key_abc123..."
BASE_URL = "https://tryprobe.io/api/v1"
HEADERS = {"Authorization": "Bearer " + API_KEY}
# Check balance before researching
balance = requests.get(BASE_URL + "/balance", headers=HEADERS).json()
cents = balance["balanceCents"]
print("Balance: $" + str(cents / 100))
# Run deep research
result = requests.post(
BASE_URL + "/research",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"query": "Analyze Layer 2 scaling solutions market share",
"depth": "deep",
"context": "Focus on Arbitrum, Optimism, and Base.",
},
timeout=300,
).json()
print("Report (" + str(result["durationMs"]) + "ms):")
print(result["content"])
print("Sources: " + str(len(result["sources"])))
# Ask a free follow-up
followup = requests.post(
BASE_URL + "/research/" + result["id"] + "/followup",
headers={**HEADERS, "Content-Type": "application/json"},
json={"question": "Which L2 has the highest TVL?"},
timeout=60,
).json()
print(followup["content"])
# List past research
history = requests.get(
BASE_URL + "/research?limit=5&status=completed",
headers=HEADERS,
).json()
for item in history["data"]:
print(" " + item["query"] + " (" + item["depth"] + ")")Node.js
const API_KEY = "probe_key_abc123...";
const BASE_URL = "https://tryprobe.io/api/v1";
const headers = { Authorization: `Bearer ${API_KEY}` };
// Check balance
const balance = await fetch(`${BASE_URL}/balance`, { headers }).then(r => r.json());
console.log(`Balance: $${(balance.balanceCents / 100).toFixed(2)}`);
// Run research
const result = await fetch(`${BASE_URL}/research`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
query: "What are the top AI infrastructure companies?",
depth: "deep",
}),
signal: AbortSignal.timeout(300_000),
}).then(r => r.json());
console.log(result.content);
// Free follow-up
const followup = await fetch(`${BASE_URL}/research/${result.id}/followup`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ question: "Which company has the best margins?" }),
}).then(r => r.json());
console.log(followup.content);
// List past research
const history = await fetch(`${BASE_URL}/research?limit=10`, { headers })
.then(r => r.json());
history.data.forEach(r => console.log(` ${r.query} (${r.depth})`));Error Codes
All errors return a JSON body with an error field describing the issue.
| Status | Meaning | Common Causes |
|---|---|---|
| 400 | Bad Request | Missing query, invalid JSON, invalid depth value, query too long. |
| 401 | Unauthorized | Missing or invalid API key. Check your Bearer token. |
| 404 | Not Found | Research query not found or doesn't belong to your organization. |
| 402 | Payment Required | Insufficient org balance. Top up at Team Billing. Response includes balance and required fields. |
| 429 | Too Many Requests | Rate limit exceeded (10 req/min). Check Retry-After header. |
| 500 | Server Error | Research execution failed. Your balance is automatically refunded. |
{
"error": "Insufficient balance",
"balance": 25,
"required": 200
}Pricing
API usage is billed per query from your organization's credit balance. Failed queries are automatically refunded.
Top up your team balance at Team Billing. Team packs start at $250 with bonus credits.