The docs
One HTTP call returns a company’s latest earnings as JSON. Every number comes with the line it was read from and a link to the SEC document.
- Quick start
- Free vs paid
- The x402 flow
- From an agent
- Response fields
- Other routes
- Limits
- Error codes
- Disclaimer
Quick start
No key, no wallet, no account:
curl https://quarterquill.xyz/v1/free/earnings/NFLXYou get the latest earnings release the company filed (8-K Item 2.02, Exhibit 99.1, or the 10-Q / 10-K), read into fields such as revenue, operating income, net income, diluted EPS and cash flow. Each figure has a quote (the exact text or table row) and a source (the sec.gov URL of that document). A number that cannot be found verbatim in the source is dropped.
Extraction is deterministic (table rows and sentence parsing). There are no analyst estimates and no “beat” or “miss” labels.
Free vs paid
| Route | Price | Notes |
|---|---|---|
| GET /v1/free/earnings/:ticker | free | 3 reads a day per IP. Same body as the paid route. |
| GET /v1/earnings/:ticker | $0.05 USDG | x402 exact, Robinhood Chain (4663). Latest report, with a signed receipt. |
| GET /v1/earnings/:ticker/:period | $0.05 USDG | A specific quarter, e.g. 2026Q3. |
Paid reads settle only when the read succeeds (the handler answers below 400). A filing that cannot be read is not charged.
The x402 flow
- Ask.
GET /v1/earnings/NFLXwithout payment answers402 Payment Required. The terms are in thePAYMENT-REQUIREDheader (x402 v2): schemeexact, networkeip155:4663, asset USDG, amount 0.05 (50000 in 6-decimal units), and thepayToaddress. - Sign. The client signs an EIP-3009
TransferWithAuthorizationfor that amount on USDG (0x5fc5360d0400a0fd4f2af552add042d716f1d168). It is a signature, not a transaction: the buyer needs USDG, not ETH. - Retry. The same request is sent again with the signed payload in the
PAYMENT-SIGNATUREheader. - Read. The server verifies the authorization, then reads the filing from SEC EDGAR.
- Settle and receipt. If the read succeeded, the facilitator submits the authorization on Robinhood Chain and the response carries a
PAYMENT-RESPONSEheader with the transaction hash, plus areceiptobject signed by the server (EIP-712). If it failed, nothing is submitted and nothing is charged.
Every settled read is listed on /proof with its Blockscout link.
exact EVM scheme on eip155:4663 can pay. The exact terms are always the ones in the 402 answer; /openapi.json describes every route.From an agent
Generic: @x402/fetch (Node)
// npm i @x402/fetch @x402/core @x402/evm viem
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { toClientEvmSigner } from "@x402/evm";
import { wrapFetchWithPayment } from "@x402/fetch";
import { createPublicClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
// A wallet that holds a little USDG on Robinhood Chain (no ETH needed).
const account = privateKeyToAccount(process.env.BUYER_KEY);
const rpc = createPublicClient({ transport: http("https://robinhood-rpc.publicnode.com") });
const client = new x402Client().register("eip155:4663", new ExactEvmScheme(toClientEvmSigner(account, rpc)));
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://quarterquill.xyz/v1/earnings/NFLX");
const report = await res.json();
for (const it of report.items) console.log(it.label, it.value, "←", it.quote, it.source);Keep the key in a file or secret store your agent cannot print, and cap what it may spend per call (0.05 USDG is the price of one read).
MCP clients (Claude Code, Cursor, others)
The API is agent-callable as is:
- For free reads, any tool that can make an HTTP GET is enough: point it at
/v1/free/earnings/:ticker. - For paid reads, give the agent an x402-capable MCP payment tool configured for
eip155:4663and USDG, then let it call/v1/earnings/:ticker. The tool handles the 402, the signature and the retry. - Discovery:
/.well-known/agent.jsonand/openapi.jsonlist the routes, prices and the payment network.
A prompt that works well: “Get NFLX earnings from quarterquill.xyz and list each number with its footnote and source link.”
Response fields
| Field | Type | Meaning |
|---|---|---|
| ticker, company, cik | string | The company as the SEC lists it. |
| period | string | Fiscal quarter of the report, e.g. 2026Q3. |
| form | string | 8-K (earnings release), 10-Q or 10-K. |
| filedAt, readAt | ISO time | When EDGAR accepted the filing, and when it was read. |
| seconds | number | How long this read took, in seconds. Filing-to-read time on report days is seconds in /v1/watch. |
| document | URL | The filing document on sec.gov. |
| items[] | array | key, label, value (number, full units), unit (e.g. USD, USD/share), period, quote (exact source text), source (sec.gov URL). |
| compare[] | array | Prior period for the same key: prior, priorPeriod, changePct, source (SEC XBRL companyfacts). Present only where XBRL has the figure. |
| guidance[] | array | Outlook sentences quoted exactly: quote, source. |
| rc | object | null | For tickers with a stock token on Robinhood Chain: token, feed (Chainlink), price, roundId, updatedAt. Otherwise null. |
| receipt | object | Paid reads: EIP-712 receipt signed by the server. |
Other routes (free)
| Route | Returns |
|---|---|
| GET /v1/watch | This week’s reports: ticker, company, date (with its source URL), status waiting or read, and filedAt, readAt, seconds once read. |
| GET /v1/stats | paidReads, usdgSettled, freeReads, lastSettlements[] (tx, ticker, amount, at), from the ledger. |
| GET /openapi.json | OpenAPI description. |
| GET /.well-known/agent.json | Agent manifest. |
| GET /health | Liveness. |
curl https://quarterquill.xyz/v1/watchLimits
- Free route: 3 reads a day per IP. After that it answers
429with a JSON reason. - Paid route: $0.05 USDG per read, charged only for successful reads.
- Coverage: US companies that file with the SEC. Fields appear only when they can be quoted from the filing, so a report may have fewer items than another.
- Prior-period comparisons depend on SEC XBRL data and may be missing for some companies or quarters.
- SEC EDGAR asks for fair access; reads are cached, so repeated calls for the same report are fast.
- CORS is open, so the API can be called from a browser.
Error codes
Errors are JSON with a reason you can show to a person.
| Status | Meaning | Charged? |
|---|---|---|
| 400 | Ticker or period is not valid. | No |
| 402 | Payment required (paid routes). Read the terms in PAYMENT-REQUIRED, sign, retry. | No |
| 404 | Unknown ticker, or no earnings filing found for it or for that period. | No |
| 429 | Free limit reached (3 a day per IP). Use the paid route or try tomorrow. | No |
| 5xx | SEC EDGAR unreachable, or the filing could not be read. | No |
Disclaimer
Not investment advice. Quarterquill quotes public SEC filings and links each number to its source; check the source before relying on any figure. It does not forecast, rate or recommend anything.
Quarterquill is not affiliated with the SEC, Robinhood, Chainlink or any company it reads.
The token has no claim on revenue, fees or profits, and holding it is not required to use the API.