Lucas docs
Lucas sells research to AI agents, paid per request over x402 in USDC on Base. There is no account and no API key: your agent sends a request, pays the price in the 402 response, and gets JSON back. Every claim comes with a source, and anything that cannot be confirmed is marked unverified.
| Endpoint | Price | What you get |
|---|---|---|
| POST /api/x402/fact-check | $0.05 | A verdict on one claim, with a one-sentence answer and its source |
| POST /api/x402/research | $0.25 | A sourced answer to any research question |
| POST /api/x402/analyze | $0.20 | The answer to a question about your data, with the code that computed it |
| POST /api/x402/leads | $1.00 | Up to 3 companies matching your criteria, each requirement checked |
Base URL: https://api.lucasnode.app
https://lucasnode.app/llms.txt for an index, or https://lucasnode.app/llms-full.txt for these docs as one plain-text file.Quickstart
Any x402 client works. This example uses the official x402 packages for JavaScript. Ready-to-run scripts for the research endpoints are on GitHub. Your buyer wallet needs USDC on Base; it does not need ETH, because the payment processor covers network fees.
// npm install @x402/fetch @x402/evm viem
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
// Your buyer wallet. It needs USDC on Base; no ETH is needed for fees.
const account = privateKeyToAccount(process.env.EVM_PRIVATE_KEY);
const fetchWithPayment = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
});
const res = await fetchWithPayment("https://api.lucasnode.app/api/x402/research", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
question: "Which payment processors does Shopify Plus support natively in the US?",
}),
});
console.log(res.status, await res.json());# curl cannot pay, but it shows the price and payment details Lucas asks for:
curl -i -X POST https://api.lucasnode.app/api/x402/research \
-H "Content-Type: application/json" \
-d '{"question":"Which payment processors does Shopify Plus support natively in the US?"}'
# Response: HTTP/2 402, with a PAYMENT-REQUIRED header holding base64-encoded JSON:
# network eip155:8453 (Base), asset USDC, amount 250000 ($0.25), payTo, and the
# Bazaar discovery schema describing this endpoint.# Save the code above as buy.mjs, then run it with your own wallet key: EVM_PRIVATE_KEY=YOUR_WALLET_PRIVATE_KEY node buy.mjs
YOUR_WALLET_PRIVATE_KEY with your own wallet's key, and never commit it to code or share it. Use a wallet that holds only what you plan to spend.Fact check
POST https://api.lucasnode.app/api/x402/fact-check · $0.05 per request. Send one claim or yes/no question and get a verdict with its source in a few seconds. It uses one web search, so it suits simple, checkable facts; for anything broader, use quick research.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| claim | string | Yes | A statement or yes/no question to check. 10 to 300 characters. |
{
"claim": "Supabase's Pro plan starts at $25 per month."
}Response
| Field | Type | Required | Description |
|---|---|---|---|
| claim | string | Always | Your claim, echoed back. |
| verdict | string | Always | true, false, partly_true or unverified. |
| answer | string | Always | One or two sentences stating what is actually true. |
| source | object | Always | title, url and source_type (official or third_party) of the page the verdict is based on. |
| confidence | string | Always | high (true or false backed by an official source), medium (a third-party source, or partly_true) or low. |
| checked_at | string | Always | ISO timestamp of the check. |
| disclaimer | string | Always | A short reminder of the one-search scope. |
Quick research
POST https://api.lucasnode.app/api/x402/research · $0.25 per request. Ask any question and get a concise, sourced answer.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| question | string | Yes | The research question. 10 to 500 characters. |
| context | string | No | Background to focus the research. Up to 1000 characters. |
{
"question": "Which payment processors does Shopify Plus support natively in the US?",
"context": "Optional background to focus the research"
}Response
| Field | Type | Required | Description |
|---|---|---|---|
| question | string | Always | Your question, echoed back. |
| answer | string | Always | A concise answer, usually 2 to 4 sentences. |
| key_points | array | Always | Up to 5 objects with point, source (URL) and source_type (official or third_party). |
| sources | array | Always | Objects with title and url for each source used. |
| confidence | string | Always | high (an official source and nothing unverified), medium (an official source, or 2+ source sites) or low. |
| unverified | string[] | Always | Anything that could not be confirmed. May be empty. |
| disclaimer | string | Always | A short reminder to verify important facts. |
{
"question": "Which payment processors does Shopify Plus support natively in the US?",
"answer": "Shopify Payments is Shopify's native payment gateway and processor ...",
"key_points": [
{
"point": "Shopify Payments is the native payment processor for Shopify and Shopify Plus",
"source": "https://eastsideco.com/blog/shopify-payments-guide"
}
],
"sources": [
{ "title": "Ultimate Guide To The Best Shopify Payments Gateways & Providers", "url": "https://eastsideco.com/blog/shopify-payments-guide" }
],
"confidence": "medium",
"unverified": ["Whether Shopify Plus has additional native payment processor support ..."],
"disclaimer": "Quick research from public web sources. Verify important facts before relying on them."
}Data analysis
POST https://api.lucasnode.app/api/x402/analyze · $0.20 per request. Send a table and a question. Lucas writes Python, runs it in an isolated sandbox (no internet, nothing else on it), and returns the answer together with the exact code that produced it, so every number can be re-checked. Typically about 10 seconds.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| question | string | Yes | What you want to know about the data. 10 to 500 characters. |
| data | string | One of | CSV text with a header row, or JSON records (a list of objects). Up to 500,000 characters. |
| data_url | string | One of | An https link to a public CSV or JSON file, up to 5 MB. Send either data or data_url. |
{
"question": "Which month had the biggest total revenue growth versus the month before, and by what percent?",
"data": "month,region,revenue\n2026-01,East,\"$14,200\"\n2026-01,West,\"$11,050\"\n2026-02,East,\"$15,900\"\n..."
}Response
| Field | Type | Required | Description |
|---|---|---|---|
| question | string | Always | Your question, echoed back. |
| answer | string | Always | One to three plain sentences with the key numbers, taken only from the code's output. |
| result | object | Always | value (the main answer) and table (up to 20 supporting rows, or null). |
| code | string | Always | The Python that was run. The data is loaded as a pandas DataFrame named df. |
| assumptions | string[] | Always | Choices made along the way, such as which column was used or rows dropped. May be empty. |
| confidence | string | Always | high (answered directly from clean data), medium (needed assumptions) or low (the data only partly answers it). |
| data | object | Always | rows and columns of the table as Lucas read it. |
| computed_at | string | Always | When the analysis ran (ISO 8601). |
| disclaimer | string | Always | A short note on how the result was produced. |
{
"question": "Which month had the biggest total revenue growth versus the month before, and by what percent?",
"answer": "March 2026 had the biggest total revenue growth versus the month before, up 16.49 percent.",
"result": {
"value": { "month": "2026-03", "growth_pct": 16.49 },
"table": [
{ "month": "2026-02", "revenue": 28380, "growth_pct": 12.4 },
{ "month": "2026-03", "revenue": 33060, "growth_pct": 16.49 }
]
},
"code": "df['revenue'] = pd.to_numeric(df['revenue'].str.replace('[$,]', '', regex=True))\n...",
"assumptions": ["Summed revenue across regions for each month."],
"confidence": "high",
"data": { "rows": 8, "columns": ["month", "region", "orders", "revenue"] },
"computed_at": "2026-10-15T18:00:00.000Z",
"disclaimer": "Computed by running the code above on the data you sent, in an isolated sandbox. Re-run the code to verify."
}Your data is used only for this request. It runs in a sandbox that is deleted afterwards. Lucas keeps only your question and a short preview of the data (the first 500 characters) in its request log, never the full file.
Lead research
POST https://api.lucasnode.app/api/x402/leads · $1.00 per request. Describe the companies you want and get up to 3 matches, with every requirement checked.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| description | string | Yes | Who you are looking for: industry, location, size, platforms, signals. 10 to 1000 characters. |
| count | integer | No | How many companies to return, 1 to 3. Defaults to 3. |
{
"description": "US-based B2B software companies that sell scheduling or practice-management tools to dental practices",
"count": 2
}Response
| Field | Type | Required | Description |
|---|---|---|---|
| request | object | Always | Your description and count, echoed back. |
| requirements | string[] | Always | Your description, split into distinct requirements. |
| companies | array | Always | Up to count companies: name, website, summary, checks, confidence (high: every requirement met and an official source; medium: an official source or 2+ source sites, at most one unverified; low otherwise). |
| checks | array | Per company | One per requirement: requirement, status (met or unverified), evidence, source, source_type (official or third_party). |
| notes | string | Always | Anything you should know, such as companies left out and why. |
| disclaimer | string | Always | A short reminder that figures such as revenue are estimates. |
Companies with any requirement that is clearly not met are left out, so Lucas may return fewer than you asked for. Fewer, well-supported results are preferred over padding the list.
{
"request": { "description": "US-based B2B software companies ...", "count": 2 },
"requirements": ["US-based headquarters", "B2B software company", "..."],
"companies": [
{
"name": "NexHealth",
"website": "https://www.nexhealth.com",
"summary": "A San Francisco-based patient experience platform ...",
"checks": [
{
"requirement": "US-based headquarters",
"status": "met",
"evidence": "NexHealth was founded in 2017 and is based in San Francisco, California.",
"source": "https://mppg.net/partners/operations/nexhealth/"
}
],
"confidence": "high"
}
],
"notes": "Both companies are privately held; no revenue threshold was specified ...",
"disclaimer": "Company-level research from public web sources. Figures such as revenue are estimates; verify before relying on them."
}Payments
Lucas uses x402. Send a request without payment and you get HTTP 402 with the payment details. Your x402 client pays and retries the same request with the payment attached.
| Setting | Value |
|---|---|
| Protocol | x402 version 2, exact scheme |
| Network | Base (eip155:8453) |
| Asset | USDC (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) |
| Amounts | 50000 for /fact-check ($0.05), 200000 for /analyze ($0.20), 250000 for /research ($0.25), 1000000 for /leads ($1.00); USDC uses 6 decimals |
| Settlement | Through Coinbase's x402 payment processor, only after a successful response |
| Payment timeout | 300 seconds |
All endpoints are listed in the Coinbase x402 Bazaar, so agents can discover them by search.
Errors
| Status | Meaning | Charged? |
|---|---|---|
| 400 | The request body is invalid, such as a missing question, a count outside 1 to 3, or data that cannot be read as a table. The response explains what to fix. | No |
| 402 | Payment required, or the payment attached was missing or invalid. | No |
| 502 | The request could not be completed. Safe to retry. | No |
Errors return JSON in the form { "error": "..." }. Payment settles only after a successful response, so failed and rejected requests are never charged.
Limits
- Timing. A fact check typically takes a few seconds. Data analysis typically takes about 10 seconds. Quick research typically takes about 11 seconds. Lead research typically takes 20 to 50 seconds; allow up to 2 minutes.
- Sources. Research uses public web sources only.
- Company-level only. No personal contact details or private information about individuals. Requests for them are rejected.
- Estimates. Figures such as private company revenue are third-party estimates.
- Live signals. Things like current ad activity are marked unverified unless recent, dated evidence exists.
- AI-generated. Results are produced by an AI researcher. Verify important facts before relying on them.
For AI agents
These docs are also available as plain text, for agents to read directly:
https://lucasnode.app/llms.txt: a short index with every endpoint.https://lucasnode.app/llms-full.txt: these docs in full, as one file.
Every 402 response also includes a Bazaar discovery section with an example request and a schema of the allowed fields.
Contact
Questions, problems with a request, or a listing or partnership inquiry: email hello@lucasnode.app.