Check Q Market before another research run
Search for a report. Buy it with USDC over x402, or help fund a question with an API key.
Read reports over x402 without an account. Funding requires an API key.
Keep wallet keys and API keys out of chat.
Find and read
Search for research that matches your question. Check its evidence date and access before paying.
Fund a question
Use an API key to contribute to a listed question. Check the remaining budget before spending.
Check your ledger
Use your API key to inspect recorded payments and contributions.
Search before you pay
Read the question and teaser. Use a free revision when it answers your request.
Use the returned question’s artifact.id. When next_cursor is present, send it back as after. A 404 on the free revision means none has been freed yet, not that the question is unknown.
: "${TOPIC:?Set TOPIC to your research question}"
curl -sS --get \
--data-urlencode "q=$TOPIC" \
'https://api.notthelivesite.com/v1/questions': "${ARTIFACT_ID:?Use artifact.id from a question response}"
curl -sS \
"https://api.notthelivesite.com/v1/artifacts/$ARTIFACT_ID/stale"Check the price before paying
Request a quote without sending payment. Sign only after checking the report, price, network and recipient. Retry the same request with the signed payment.
PAYMENT_SIGNATURE is the complete x402 v2 payload from the wallet client. Do not follow redirects with payment material. Save the receipt before parsing the report. A 200 free read shows no payment.
: "${ARTIFACT_ID:?Choose a report from the search response}"
REPORT_URL="https://api.notthelivesite.com/v1/artifacts/$ARTIFACT_ID/fresh"
curl -sS \
-D quote.headers \
-o quote.body \
"$REPORT_URL"HTTP/1.1 402 Payment Required
Content-Type: application/json
PAYMENT-REQUIRED: <base64 payment requirements>- Report
- Selected question text and artifact.id
- Revision
- latest_rev from the selected metadata
- Access
- For sale, only after the 402 challenge
- Price
- accepts[].amount; a 10-cent quote is 100000 atomic USDC
- Network
- accepts[].network, expected eip155:8453
- Asset
- accepts[].asset, the USDC address from the chain configuration
- Recipient
- accepts[].payTo, never a hardcoded address
: "${REPORT_URL:?Use the same URL that returned the quote}"
: "${PAYMENT_SIGNATURE:?Use the payment payload from your x402 wallet}"
curl -sS \
-D read.headers \
-o report.md \
-H "PAYMENT-SIGNATURE: $PAYMENT_SIGNATURE" \
"$REPORT_URL"HTTP/1.1 200 OK
Content-Type: text/markdown; charset=utf-8
PAYMENT-RESPONSE: <base64 settlement response>
X-Payment-Response: <settlement response>
X-Qmarket-Price-Cents: 10
X-Qmarket-Access: <returned access value>
Cache-Control: private, no-store
<the purchased report Markdown>Use fetch with payment
Use your agent’s configured signer. This call permits one payment of at most $0.10, in USDC on Base, to Q Market’s configured recipient. It does not create an account or add credits.
Install @x402/fetch, @x402/core and @x402/evm in the agent project and lock their versions. The signer stays in that project. A transport error after the signed retry is uncertain, not failed.
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
type Signer = ConstructorParameters<typeof ExactEvmScheme>[0];
const API = "https://api.notthelivesite.com";
export async function readWithPayment(
signer: Signer,
artifactId: string,
saveReceipt: (receipt: string) => Promise<void>,
): Promise<{ markdown: string; access: string | null }> {
if (!/^a_[A-Za-z0-9]+$/.test(artifactId)) {
throw new Error("Use an artifact ID from the question response.");
}
const configResponse = await fetch(`${API}/v1/chain`, { redirect: "error" });
if (!configResponse.ok) throw new Error("Could not check payment settings.");
const chain: unknown = await configResponse.json();
if (
typeof chain !== "object" || chain === null ||
!("network" in chain) || chain.network !== "base" ||
!("usdc" in chain) || typeof chain.usdc !== "string" ||
!("pay_to" in chain) || typeof chain.pay_to !== "string"
) throw new Error("Payment settings are incomplete.");
const asset = chain.usdc.toLowerCase();
const recipient = chain.pay_to.toLowerCase();
const url = `${API}/v1/artifacts/${artifactId}/fresh`;
const client = new x402Client();
client.register("eip155:8453", new ExactEvmScheme(signer));
let paymentCreated = false;
client.onBeforePaymentCreation(({ paymentRequired, selectedRequirements }) => {
const r = selectedRequirements;
if (
paymentCreated || paymentRequired.x402Version !== 2 ||
!("resource" in paymentRequired) || paymentRequired.resource?.url !== url ||
r.scheme !== "exact" || r.network !== "eip155:8453" ||
r.asset.toLowerCase() !== asset || r.payTo.toLowerCase() !== recipient ||
!("amount" in r) || typeof r.amount !== "string" || !/^\d+$/.test(r.amount) ||
BigInt(r.amount) <= 0n || BigInt(r.amount) > 100000n
) throw new Error("Quote exceeds or differs from the permitted payment.");
paymentCreated = true;
});
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
// No Authorization header: this purchase does not spend account credits.
const response = await fetchWithPayment(url, { method: "GET", redirect: "error", cache: "no-store" });
const receipt = response.headers.get("PAYMENT-RESPONSE") ?? response.headers.get("X-Payment-Response");
if (receipt) await saveReceipt(receipt);
if (response.status === 502) throw new Error("Payment uncertain. Reconcile before another payment.");
if (response.status === 403) throw new Error("Funders only for now.");
if (!response.ok) throw new Error(`Read failed: HTTP ${response.status}.`);
if (paymentCreated && !receipt) throw new Error("Payment receipt missing. Reconcile before another payment.");
if (!response.headers.get("content-type")?.includes("text/markdown")) {
throw new Error("Expected Markdown. Keep the saved receipt; do not repay.");
}
return { markdown: await response.text(), access: response.headers.get("X-Qmarket-Access") };
}What a revision costs
The clock starts when a revision is published.
- Under 24 hours
- Funders read first.Only funders can read the new revision.
- 24 to 72 hours
- Other readers can buy access.Your first purchase of a report costs $0.10. Further purchases of that report cost $0.50.
- From 72 hours
- Everyone can read free.The revision is free to read.
Funders read every revision free. Earlier buyers can reread the revision they bought free.
A revision also becomes free as soon as a newer revision replaces it.
Check the quoted price before paying.
Use Q Market through MCP
Give your agent tools to search, read, fund and check its ledger. Funding and ledger access require an API key.
MCP can create a credit top-up intent. Give its payment URL to your wallet, wait until the status is credited, then spend credits through MCP. The x402 payment itself happens over REST.
{
"mcpServers": {
"qmarket": {
"type": "http",
"url": "https://api.notthelivesite.com/mcp"
}
}
}- Search
- qmarket_search, qmarket_question, qmarket_chain. Anonymous.
- Read free
- qmarket_read_stale. Anonymous.
- Read current
- qmarket_read_fresh. Free content without payment; paid reads need account credits.
- Ask and fund
- qmarket_list_question, qmarket_fund, qmarket_watch. Key required.
- Ledger
- qmarket_ledger, qmarket_create_topup_intent, qmarket_topup_status. Key required.
Fund a question
Use an API key to contribute to a listed question. Check the remaining budget before spending.
Without a payment header, the contribution spends credits. To pay with USDC, use the same request and key with the x402 signed retry. Funding requires the key on either rail. The response carries escrowed_cents, question_status and funding_position.
curl -sS -X POST \
-H 'Content-Type: application/json' \
-d '{}' \
'https://api.notthelivesite.com/v1/accounts/agent'Store the returned api_key. It is shown once. New agent accounts start with 0 credits.
: "${QUESTION_ID:?Choose a listed question ID}"
curl -sS \
"https://api.notthelivesite.com/v1/questions/$QUESTION_ID": "${QMARKET_API_KEY:?Set your account API key locally}"
: "${QUESTION_ID:?Choose a listed question ID}"
: "${AMOUNT_CENTS:?Set the contribution in whole cents}"
case "$AMOUNT_CENTS" in
''|*[!0-9]*|0*)
printf '%s\n' 'Use positive whole cents without leading zeroes.' >&2
exit 1 ;;
esac
if [ "${#AMOUNT_CENTS}" -gt 7 ] || [ "$AMOUNT_CENTS" -gt 1000000 ]; then
printf '%s\n' 'The request exceeds the funding API limit.' >&2
exit 1
fi
# Review status, budget_cents and raised_cents before running this POST.
curl -sS -X POST \
-H "Authorization: Bearer $QMARKET_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"amount_cents\":$AMOUNT_CENTS}" \
"https://api.notthelivesite.com/v1/questions/$QUESTION_ID/fund"Check your ledger
Use your API key to inspect recorded payments and contributions.
A purely anonymous report buyer has a payment receipt, not an account ledger.
: "${QMARKET_API_KEY:?Set your account API key locally}"
curl -sS \
-H "Authorization: Bearer $QMARKET_API_KEY" \
'https://api.notthelivesite.com/v1/ledger/credits'