{
  "id": "contextdev.brand.ai.products",
  "object": "tool",
  "name": "Extract Products",
  "summary": "Build a structured product catalog from a brand's website.",
  "description": "Analyze a brand's website and return a list of its products as normalized records — name, description, price and regular price with currency, billing frequency, pricing model, category, availability, features, target audience, images, and SKU — without writing a per-site scraper. Start from a domain (Context.dev finds the relevant catalog or pricing pages) or from an exact URL, and cap the result count with maxProducts (up to 12). Useful for competitor tracking, marketplace onboarding, and pricing intelligence.\n\nRaw contextdev#brand/ai/products endpoint: input is { body, queryParams, pathParams } as the provider documents them (https://docs.context.dev/api-reference/web-extraction/products).",
  "category": "lookup",
  "hosted_by": "Context.dev",
  "runtime": "partner",
  "side_effects": false,
  "status": "live",
  "credits": 0,
  "price": null,
  "providers": [
    {
      "id": "contextdev",
      "name": "Context.dev",
      "price": null,
      "own_key_only": true
    }
  ],
  "mcp_name": "contextdev_brand_ai_products",
  "input_schema": {
    "type": "object",
    "properties": {
      "body": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "domain": {
                "type": "string",
                "minLength": 3,
                "description": "The brand domain to analyze, e.g. 'example.com'."
              },
              "maxProducts": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12,
                "description": "Maximum number of products to extract (1-12). Does not change the price."
              },
              "maxAgeMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2592000000,
                "description": "Reuse a cached result younger than this many milliseconds. Default 604800000 (7 days), max 2592000000 (30 days)."
              },
              "timeoutOpts": {
                "type": "object",
                "properties": {
                  "milliseconds": {
                    "type": "integer",
                    "minimum": 1000,
                    "maximum": 300000,
                    "description": "Request deadline in milliseconds (1000-300000)."
                  },
                  "behavior": {
                    "type": "string",
                    "enum": [
                      "fail",
                      "return-partial"
                    ],
                    "description": "What to do at the deadline: 'fail' returns 408 at no charge (default); 'return-partial' returns the usable results collected so far and bills them."
                  }
                },
                "required": [
                  "milliseconds"
                ],
                "additionalProperties": false,
                "description": "Request deadline and behavior on timeout."
              }
            },
            "required": [
              "domain"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "directUrl": {
                "type": "string",
                "pattern": "^https?:\\/\\/\\S+$",
                "description": "Exact URL to start from, bypassing domain resolution (e.g. a pricing or shop page)."
              },
              "maxProducts": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12,
                "description": "Maximum number of products to extract (1-12). Does not change the price."
              },
              "maxAgeMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2592000000,
                "description": "Reuse a cached result younger than this many milliseconds. Default 604800000 (7 days), max 2592000000 (30 days)."
              },
              "timeoutOpts": {
                "type": "object",
                "properties": {
                  "milliseconds": {
                    "type": "integer",
                    "minimum": 1000,
                    "maximum": 300000,
                    "description": "Request deadline in milliseconds (1000-300000)."
                  },
                  "behavior": {
                    "type": "string",
                    "enum": [
                      "fail",
                      "return-partial"
                    ],
                    "description": "What to do at the deadline: 'fail' returns 408 at no charge (default); 'return-partial' returns the usable results collected so far and bills them."
                  }
                },
                "required": [
                  "milliseconds"
                ],
                "additionalProperties": false,
                "description": "Request deadline and behavior on timeout."
              }
            },
            "required": [
              "directUrl"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Start from a domain or from a directUrl."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "kind": "endpoint"
}