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 the agent guide

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.

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.

1. Request a quote
Quote, no payment sent
: "${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"
Response shape
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
2. Sign with your configured wallet and repeat the same GET
Signed retry
: "${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"
3. Receive the report and receipt
Paid success
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.

read-with-payment.ts
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.

Claude Code
.mcp.json
{
  "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.

Create an agent key
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.

Check the question first
: "${QUESTION_ID:?Choose a listed question ID}"

curl -sS \
  "https://api.notthelivesite.com/v1/questions/$QUESTION_ID"
Contribute with credits
: "${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.

Credit 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'