Skip to main content
Text is useful for people. Structured output is better when code needs to store, compare, or route the result.

CLI schema

Create a JSON schema file:
{
  "type": "object",
  "additionalProperties": false,
  "required": ["company", "filings"],
  "properties": {
    "company": { "type": "string" },
    "filings": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["form", "filingDate", "accessionNumber", "url", "summary"],
        "properties": {
          "form": { "type": "string" },
          "filingDate": { "type": "string" },
          "accessionNumber": { "type": "string" },
          "url": { "type": "string" },
          "summary": { "type": "string" }
        }
      }
    }
  }
}
Run the agent with the schema:
web agent \
  --schema ./filings.schema.json \
  --url https://www.sec.gov/edgar/search/ \
  --allow-domain sec.gov \
  "Find Apple's latest 10-Q filings. Return filing date, accession number, filing URL, and a one-sentence summary."

SDK schema

import { Web } from "@webcompute/sdk";

const filingsSchema = {
  type: "object",
  additionalProperties: false,
  required: ["company", "filings"],
  properties: {
    company: { type: "string" },
    filings: {
      type: "array",
      items: {
        type: "object",
        additionalProperties: false,
        required: ["form", "filingDate", "accessionNumber", "url", "summary"],
        properties: {
          form: { type: "string" },
          filingDate: { type: "string" },
          accessionNumber: { type: "string" },
          url: { type: "string" },
          summary: { type: "string" },
        },
      },
    },
  },
} as const;

const web = new Web();
const agent = web.agent({
  model: {
    route: "openrouter",
    model: "openai/gpt-5.4-mini",
    apiKeyEnv: "OPENROUTER_API_KEY",
  },
  browser: { policy: { allowedDomains: ["sec.gov"] } },
  outputSchema: filingsSchema,
});

const result = await agent.run({
  startUrl: "https://www.sec.gov/edgar/search/",
  goal: "Find Apple's latest 10-Q filings.",
});

if (result.status !== "completed" || !result.output) {
  throw new Error(result.error?.message ?? "Agent did not return valid filings.");
}

console.log(result.output);
console.log(result.schema?.validationStatus);

Handle invalid output

Check result.status, result.output, and result.schema before persisting data.
if (result.schema?.validationStatus === "invalid") {
  console.error(result.schema.issues);
}
Schema validation improves the boundary between browser evidence and product data. It does not replace source review for high-impact decisions.