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:

Headerhttp
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

Productionurl
https://tryprobe.io/api/v1

Create Research

POST/api/v1/research

Submit 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

ParameterTypeRequiredDescription
querystringRequiredThe research question. Max 5,000 characters.
depthstringOptional"flash", "quick", "deep", or "deep_high". Defaults to "quick".
contextstringOptionalAdditional context to guide the research.

Response

200 OKjson
{
  "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

GET/api/v1/research

List past research queries for your organization. Supports pagination and filtering.

Query Parameters

ParameterDefaultDescription
limit20Number of results (1-100).
offset0Pagination offset.
statusallFilter by status: completed, failed, pending.
depthallFilter by depth: flash, quick, deep, deep_high.

Response

200 OKjson
{
  "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

GET/api/v1/research/:id

Retrieve a specific research result by ID. Includes the full report, sources, and any follow-up queries.

Response

200 OKjson
{
  "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

DELETE/api/v1/research/:id

Delete a research query and all its follow-ups. This action is irreversible.

200 OKjson
{
  "success": true,
  "id": "uuid-of-deleted-query"
}

Follow-up Query

POST/api/v1/research/:id/followup

Ask 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

ParameterTypeRequiredDescription
questionstringRequiredThe follow-up question. Max 5,000 characters.

Response

200 OKjson
{
  "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

GET/api/v1/balance

Check your organization's current credit balance. Use this to verify you have sufficient credits before submitting research.

Response

200 OKjson
{
  "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:

HeaderDescription
X-RateLimit-LimitMaximum requests per window (10).
X-RateLimit-RemainingRemaining requests in current window.
Retry-AfterSeconds to wait before retrying (on 429).

Code Examples

curl

Quick researchbash
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"
  }'
Deep research with contextbash
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

Full Python examplepython
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

Full Node.js examplejavascript
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.

StatusMeaningCommon Causes
400Bad RequestMissing query, invalid JSON, invalid depth value, query too long.
401UnauthorizedMissing or invalid API key. Check your Bearer token.
404Not FoundResearch query not found or doesn't belong to your organization.
402Payment RequiredInsufficient org balance. Top up at Team Billing. Response includes balance and required fields.
429Too Many RequestsRate limit exceeded (10 req/min). Check Retry-After header.
500Server ErrorResearch execution failed. Your balance is automatically refunded.
Error response examplejson
{
  "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.

Flash
$0.15
per query
Instant, ~10s
Quick
$0.50
per query
Single agent, ~30s
Deep
$2.00
per query
4 agents, ~30s
Deep+
$5.00
per query
16 agents, ~1 min

Top up your team balance at Team Billing. Team packs start at $250 with bonus credits.