Documentation

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.

EndpointPriceWhat you get
POST /api/x402/fact-check$0.05A verdict on one claim, with a one-sentence answer and its source
POST /api/x402/research$0.25A sourced answer to any research question
POST /api/x402/analyze$0.20The answer to a question about your data, with the code that computed it
POST /api/x402/leads$1.00Up to 3 companies matching your criteria, each requirement checked

Base URL: https://api.lucasnode.app

Researching Lucas for a user? Fetch 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.

buy.mjs
// 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());
zsh
# 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.
zsh
# 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
Keep your key private. Replace 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

FieldTypeRequiredDescription
claimstringYesA statement or yes/no question to check. 10 to 300 characters.
request.json
{
  "claim": "Supabase's Pro plan starts at $25 per month."
}

Response

FieldTypeRequiredDescription
claimstringAlwaysYour claim, echoed back.
verdictstringAlwaystrue, false, partly_true or unverified.
answerstringAlwaysOne or two sentences stating what is actually true.
sourceobjectAlwaystitle, url and source_type (official or third_party) of the page the verdict is based on.
confidencestringAlwayshigh (true or false backed by an official source), medium (a third-party source, or partly_true) or low.
checked_atstringAlwaysISO timestamp of the check.
disclaimerstringAlwaysA 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

FieldTypeRequiredDescription
questionstringYesThe research question. 10 to 500 characters.
contextstringNoBackground to focus the research. Up to 1000 characters.
request.json
{
  "question": "Which payment processors does Shopify Plus support natively in the US?",
  "context": "Optional background to focus the research"
}

Response

FieldTypeRequiredDescription
questionstringAlwaysYour question, echoed back.
answerstringAlwaysA concise answer, usually 2 to 4 sentences.
key_pointsarrayAlwaysUp to 5 objects with point, source (URL) and source_type (official or third_party).
sourcesarrayAlwaysObjects with title and url for each source used.
confidencestringAlwayshigh (an official source and nothing unverified), medium (an official source, or 2+ source sites) or low.
unverifiedstring[]AlwaysAnything that could not be confirmed. May be empty.
disclaimerstringAlwaysA short reminder to verify important facts.
response.json (shortened)
{
  "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

FieldTypeRequiredDescription
questionstringYesWhat you want to know about the data. 10 to 500 characters.
datastringOne ofCSV text with a header row, or JSON records (a list of objects). Up to 500,000 characters.
data_urlstringOne ofAn https link to a public CSV or JSON file, up to 5 MB. Send either data or data_url.
request.json
{
  "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

FieldTypeRequiredDescription
questionstringAlwaysYour question, echoed back.
answerstringAlwaysOne to three plain sentences with the key numbers, taken only from the code's output.
resultobjectAlwaysvalue (the main answer) and table (up to 20 supporting rows, or null).
codestringAlwaysThe Python that was run. The data is loaded as a pandas DataFrame named df.
assumptionsstring[]AlwaysChoices made along the way, such as which column was used or rows dropped. May be empty.
confidencestringAlwayshigh (answered directly from clean data), medium (needed assumptions) or low (the data only partly answers it).
dataobjectAlwaysrows and columns of the table as Lucas read it.
computed_atstringAlwaysWhen the analysis ran (ISO 8601).
disclaimerstringAlwaysA short note on how the result was produced.
response.json (shortened)
{
  "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

FieldTypeRequiredDescription
descriptionstringYesWho you are looking for: industry, location, size, platforms, signals. 10 to 1000 characters.
countintegerNoHow many companies to return, 1 to 3. Defaults to 3.
request.json
{
  "description": "US-based B2B software companies that sell scheduling or practice-management tools to dental practices",
  "count": 2
}

Response

FieldTypeRequiredDescription
requestobjectAlwaysYour description and count, echoed back.
requirementsstring[]AlwaysYour description, split into distinct requirements.
companiesarrayAlwaysUp 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).
checksarrayPer companyOne per requirement: requirement, status (met or unverified), evidence, source, source_type (official or third_party).
notesstringAlwaysAnything you should know, such as companies left out and why.
disclaimerstringAlwaysA 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.

response.json (shortened)
{
  "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.

SettingValue
Protocolx402 version 2, exact scheme
NetworkBase (eip155:8453)
AssetUSDC (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)
Amounts50000 for /fact-check ($0.05), 200000 for /analyze ($0.20), 250000 for /research ($0.25), 1000000 for /leads ($1.00); USDC uses 6 decimals
SettlementThrough Coinbase's x402 payment processor, only after a successful response
Payment timeout300 seconds
Check your client's spend limit. The official x402 JavaScript client refuses payments above $1 per request by default. All Lucas endpoints are at or under $1, so they work with the default setting.

All endpoints are listed in the Coinbase x402 Bazaar, so agents can discover them by search.

Errors

StatusMeaningCharged?
400The 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
402Payment required, or the payment attached was missing or invalid.No
502The 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.