Developer launch guide

SEC intelligence your AI agent can buy on demand.

Call one endpoint, receive an x402 payment requirement, pay $0.10 USDC on Base, and get structured filing intelligence.

Endpoint
GET /v1/agent/{ticker}
Price
$0.10 per successful paid request
Payment
Native USDC on Base
Network
eip155:8453

A compact filing-intelligence contract for software agents

Nodavyr turns public SEC filings and Company Facts into concise, structured intelligence. Agents can buy a ranked signal without rebuilding filing retrieval, period comparison, language-change analysis, ranking, and materiality logic.

Paid endpointGET https://nodavyr.com/v1/agent/{ticker}ExampleGET https://nodavyr.com/v1/agent/AAPL

No account, API key, or subscription is required for the keyless x402 path.

Discovery, validation, payment, delivery

  1. 1Agent sends the GET request.
  2. 2Nodavyr returns HTTP 402 with payment requirements.
  3. 3Agent validates every requirement.
  4. 4Agent signs one x402 authorization.
  5. 5The facilitator settles payment.
  6. 6Agent sends the payment-bearing request.
  7. 7Nodavyr returns structured intelligence.

Validate first. Construct the signer second.

This low-level Node/TypeScript pattern uses the official x402 packages already used by the project. Configure APPROVED_RECIPIENT from a trusted source and enforce your own spending policy. Never commit a payer private key.

buy.ts
import { x402Client } from "@x402/core/client";
import { x402HTTPClient } from "@x402/core/http";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { PAYMENT_IDENTIFIER, appendPaymentIdentifierToExtensions,
  generatePaymentId } from "@x402/extensions/payment-identifier";
import { privateKeyToAccount } from "viem/accounts";

const url = "https://nodavyr.com/v1/agent/AAPL";
const approvedRecipient = process.env.APPROVED_RECIPIENT?.toLowerCase();
const privateKey = process.env.BUYER_PRIVATE_KEY;

const unpaid = await fetch(url, { redirect: "error" });
if (unpaid.status !== 402) throw new Error(`STOP: expected 402, got ${unpaid.status}`);

const core = new x402Client();
const http = new x402HTTPClient(core);
const required = http.getPaymentRequiredResponse(name => unpaid.headers.get(name));
const options = required?.accepts;
if (required?.x402Version !== 2 || !Array.isArray(options) || options.length !== 1) {
  throw new Error("STOP: unexpected x402 requirements");
}
const payment = options[0];
if (payment.scheme !== "exact" || payment.network !== "eip155:8453" ||
    payment.asset?.toLowerCase() !== "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" ||
    String(payment.amount) !== "100000" || payment.payTo?.toLowerCase() !== approvedRecipient) {
  throw new Error("STOP: payment policy mismatch");
}
if (required?.extensions?.[PAYMENT_IDENTIFIER]?.info?.required !== true) {
  throw new Error("STOP: payment identifier is not required");
}
if (!privateKey) throw new Error("STOP: BUYER_PRIVATE_KEY is required");
const signer = privateKeyToAccount(privateKey);
const paymentIdentifier = generatePaymentId();
// Retain this identifier securely before payment if your recovery flow requires it.
core.registerExtension({
  key: PAYMENT_IDENTIFIER,
  async enrichPaymentPayload(payload) {
    payload.extensions = appendPaymentIdentifierToExtensions(
      payload.extensions ?? {}, paymentIdentifier
    );
    return payload;
  },
});
registerExactEvmScheme(core, { signer, networks: ["eip155:8453"] });
const payload = await http.createPaymentPayload(required);
const headers = http.encodePaymentSignatureHeader(payload);

// Send at most one payment-bearing request. Never blindly retry an ambiguous result.
const paid = await fetch(url, { headers, redirect: "error" });
if (paid.status !== 200) throw new Error(`STOP: paid request unresolved (${paid.status})`);
console.log(await paid.json());

Packages: @x402/core, @x402/evm, and viem. Keep the private key in a secret manager and impose a wallet-level spending limit.

Inspect requirements without paying

curl -i https://nodavyr.com/v1/agent/AAPL

Expect HTTP 402 and inspect the payment requirements. This curl command does not complete payment.

Small, stable, agent-ready JSON

Synthetic example; it contains no production payment identifier, proof, signature, or transaction hash.

AgentResponse
{
  "ticker": "ACME",
  "signal": "revenue",
  "direction": "positive",
  "confidence": 0.91,
  "score": 87,
  "summary": "Quarterly revenue increased versus the comparable period.",
  "materiality": "high",
  "request_number": 12
}

Filing intelligence inside existing workflows

Earnings analysisPortfolio researchEvent-driven monitoringRisk monitoringFundamental screeningFinancial copilotsMulti-agent workflows

Nodavyr is structured data tooling, not investment advice, and does not promise trading outcomes.

Make payment policy explicit

Before your first request

Do I need an API key?

Not for the keyless x402 path.

What does it cost?

$0.10 per successful paid request during the current pilot.

What token and network?

Native USDC on Base mainnet, network identifier eip155:8453.

Do I need a subscription?

No.

Can my autonomous agent pay automatically?

Yes, with a compatible x402 client and its own configured spending policy.

Is this investment advice?

No. It is structured filing intelligence and data tooling.

What if a payment is ambiguous?

Do not blindly retry. Inspect settlement and recovery semantics first.

Point your agent at https://nodavyr.com

Discover the contract and payment policy without a sales conversation.