{
  "openapi": "3.0.0",
  "info": {
    "title": "Anakin API",
    "description": "Anakin is a web data API for AI apps and agents. Scrape any page to clean markdown or AI-structured JSON, run AI search and multi-source deep research, map and crawl sites, run pre-built Wire actions on hundreds of popular websites, monitor pages for changes, compare AI answer engines, and drive a cloud browser for multi-step tasks.\n\nAuthenticate every request with the `X-API-Key` header. Get a free API key at https://anakin.io/dashboard (300 credits, no card required). Full documentation: https://anakin.io/docs",
    "version": "1.1.0",
    "contact": {
      "name": "Anakin",
      "url": "https://anakin.io",
      "email": "support@anakin.io"
    }
  },
  "servers": [
    {
      "url": "https://api.anakin.io/v1"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/url-scraper": {
      "post": {
        "summary": "Extract Website Data",
        "description": "Submit a URL to scrape. Returns a job ID — poll GET /url-scraper/{jobId} (with a delay in between) to fetch the completed markdown/JSON.",
        "operationId": "scrapeUrl",
        "tags": [
          "Scrape"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrapeRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScrapeSubmitResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/url-scraper/scrape": {
      "post": {
        "summary": "Scrape a URL and Wait for the Result",
        "description": "Scrapes a single URL and returns the result in the same response, so no polling is needed. Takes the same body as POST /url-scraper. If the scrape takes longer than about 90 seconds, the response is a 202 with an `id` and a non-terminal `status`; fetch the result later with GET /url-scraper/{jobId}. A failed scrape also returns 200 with `status: \"failed\"`, so check `status`. Limited to 20 requests per minute.",
        "operationId": "scrapeUrlSync",
        "tags": [
          "Scrape"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrapeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Scrape finished (completed or failed)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScrapeResult"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll GET /url-scraper/{jobId} with the returned id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScrapeResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad request: missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/url-scraper/{jobId}": {
      "get": {
        "summary": "Get Scrape Result",
        "description": "Fetch the status and results of a scrape job started by Extract Website Data.",
        "operationId": "getScrapeResult",
        "tags": [
          "Scrape"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "The jobId returned by Extract Website Data.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job status and, once completed, the extracted content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScrapeResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown jobId",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/search": {
      "post": {
        "summary": "Perform AI Search",
        "description": "AI-powered web search with citations. Synchronous — returns immediately, no polling needed. Costs 3 credits per call.",
        "operationId": "search",
        "tags": [
          "Search"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Search results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agentic-search": {
      "post": {
        "summary": "Start Agentic Search",
        "description": "Start a multi-stage AI research pipeline: search, scrape citations, extract structured data. Returns a job ID — poll GET /agentic-search/{jobId} (with a delay in between, this can take minutes) to fetch the report. Costs 10 credits.",
        "operationId": "agenticSearch",
        "tags": [
          "Agentic Search"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgenticSearchRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenticSearchSubmitResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/agentic-search/{jobId}": {
      "get": {
        "summary": "Get Agentic Search Result",
        "description": "Fetch the status and results of an agentic search job started by Start Agentic Search.",
        "operationId": "getAgenticSearchResult",
        "tags": [
          "Agentic Search"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "The job_id returned by Start Agentic Search.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job status and, once completed, the research report",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenticSearchResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown jobId",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/map": {
      "post": {
        "summary": "Map a Site's URLs",
        "description": "Discover all reachable URLs under a given site — internal links, external links, and counts. Submit a URL to map. Returns a job ID — poll GET /map/{jobId} (with a delay in between) to fetch the completed link list.",
        "operationId": "mapUrl",
        "tags": [
          "Map"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MapRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapSubmitResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/map/{jobId}": {
      "get": {
        "summary": "Get Map Result",
        "description": "Fetch the status and results of a map job started by Map a Site's URLs.",
        "operationId": "getMapResult",
        "tags": [
          "Map"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "The jobId returned by Map a Site's URLs.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job status and, once completed, the discovered links",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown jobId",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/crawl": {
      "post": {
        "summary": "Crawl a Site",
        "description": "Bulk-fetch markdown across a site — catalog ingestion, site-wide RAG corpora. Submit a URL to crawl. Returns a job ID — poll GET /crawl/{jobId} (with a delay in between) to fetch the completed pages.",
        "operationId": "crawlSite",
        "tags": [
          "Crawl"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CrawlRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrawlSubmitResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/crawl/{jobId}": {
      "get": {
        "summary": "Get Crawl Result",
        "description": "Fetch the status and results of a crawl job started by Crawl a Site.",
        "operationId": "getCrawlResult",
        "tags": [
          "Crawl"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "The jobId returned by Crawl a Site.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job status and, once completed, the fetched pages",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrawlResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown jobId",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/resolve": {
      "get": {
        "summary": "Discover Wire Actions",
        "description": "Find Wire actions for a task from a natural-language intent. Wire is a catalog of pre-built automation actions across hundreds of websites (Amazon, Walmart, LinkedIn, Airbnb, Zillow, and others) — read actions extract data, write actions perform interactions. Many read actions need no authentication. Returns ranked candidate actions, each with its action_id, type (read/write), required/optional params, credit cost, and whether auth is needed. Run a returned action with Run a Wire Action.",
        "operationId": "wireDiscover",
        "tags": [
          "Wire"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "The intent in natural language, e.g. \"top phones on walmart\", \"search airbnb listings in Lisbon\", \"a linkedin profile's work history\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of candidate actions to return.",
            "schema": {
              "type": "integer",
              "default": 5
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked candidate actions",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireResolveResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing q parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/catalog": {
      "get": {
        "summary": "List Wire Catalogs",
        "description": "List every website supported by Wire and its action count.",
        "operationId": "listWireCatalogs",
        "tags": [
          "Wire"
        ],
        "responses": {
          "200": {
            "description": "Every supported catalog and its action count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireCatalogSummary"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/catalog/{slug}": {
      "get": {
        "summary": "Get a Wire Catalog",
        "description": "Get one catalog's full action list with exact parameter schemas, each action's type (read/write), auth mode (none/optional/required), and credit cost — plus the login fields for credentials-mode sites.",
        "operationId": "getWireCatalog",
        "tags": [
          "Wire"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Catalog slug to inspect, e.g. \"walmart\".",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The catalog's full action list",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireCatalogDetail"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown catalog slug",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/task": {
      "post": {
        "summary": "Run a Wire Action",
        "description": "Run a Wire action by its action_id — either a READ action that extracts data (search listings, fetch a product's price/specs/reviews, read a profile) or a WRITE action that performs a state-changing interaction (submit a form, add to cart). The action's type, reported by Discover Wire Actions and Get a Wire Catalog, determines which kind it is. params must match that action's parameter schema; omit for actions that take none. Some actions complete synchronously and return their data inline in this same response; others return {status, job_id} — poll GET /wire/jobs/{jobId} for those. Does not execute payments or transfer funds; such actions are refused.",
        "operationId": "runWireAction",
        "tags": [
          "Wire"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WireTaskRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The action's data inline (synchronous actions), or a job handle to poll (asynchronous actions)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireTaskResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body, or unknown action_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/jobs/{jobId}": {
      "get": {
        "summary": "Get Wire Job Status",
        "description": "Fetch the status and result of an asynchronous Wire action job started by Run a Wire Action.",
        "operationId": "getWireJobStatus",
        "tags": [
          "Wire"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "The job_id returned by Run a Wire Action.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job status and, once completed, the action's data",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireJobStatus"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown jobId",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/identities": {
      "get": {
        "summary": "List Wire Identities",
        "description": "List your saved Wire identities and their credentials. An identity is a named account on a site; each credential's id is the credential_id passed to Run a Wire Action for actions whose auth_mode is \"required\". Optionally filter by catalog_id.",
        "operationId": "listWireIdentities",
        "tags": [
          "Wire"
        ],
        "parameters": [
          {
            "name": "catalog_id",
            "in": "query",
            "required": false,
            "description": "Optional — restrict to identities for a single catalog.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Your saved identities and credentials",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireIdentitiesResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/login": {
      "post": {
        "summary": "Sign In to a Wire Site",
        "description": "Sign in to a credentials-mode Wire site and get a credential_id usable immediately with Run a Wire Action. The password is never stored, only the encrypted session. Only supported for catalogs that support password sign-in; cookie-based sites use the Anakin dashboard connect flow instead.",
        "operationId": "wireLogin",
        "tags": [
          "Wire"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WireLoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The resulting identity and credential",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireLoginResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key, or sign-in failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/build-request": {
      "post": {
        "summary": "Build a New Wire Action",
        "description": "Request a brand-new Wire action for a website that isn't in the catalog yet. Describe the site (website_url) and what the action should do or extract (goal); Wire generates and auto-tests a scraper, then publishes it. Asynchronous (returns status \"pending\") and charges credits, refunded automatically if the build fails.",
        "operationId": "wireBuild",
        "tags": [
          "Wire"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WireBuildRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Build request accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WireBuildResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body, or ACTION_EXISTS",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors": {
      "post": {
        "summary": "Create a Website Monitor",
        "description": "Create a scheduled website monitor that checks a URL every intervalMinutes (min 15) and records a change when the content differs — optionally alerting a webhook or email. scope \"page\" (default) watches one URL; \"site\" crawls the site each run and tracks pages added/removed/changed; \"wire\" runs a Wire action each check and diffs its JSON. watchMode \"full_page\" (2 credits/check) compares the whole page; \"specific_data\" (3 credits/check) extracts only the fields in outputSchema with AI — ideal for price/stock/status tracking. aiMode (+1 credit/check) filters out trivial noise and summarizes real changes. Active-monitor caps per plan: Free 5, Pro 20, Scale 100.",
        "operationId": "createMonitor",
        "tags": [
          "Monitoring"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonitorCreateRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Monitor created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "List Website Monitors",
        "description": "List your website monitors.",
        "operationId": "listMonitors",
        "tags": [
          "Monitoring"
        ],
        "responses": {
          "200": {
            "description": "Your monitors",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Monitor"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}": {
      "get": {
        "summary": "Get a Website Monitor",
        "description": "Fetch one monitor's full configuration and status (next/last check time, active state, per-check credit cost, alert settings).",
        "operationId": "getMonitor",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The monitor's configuration and status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete a Website Monitor",
        "description": "Permanently remove a monitor and its change history. Irreversible.",
        "operationId": "deleteMonitor",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Monitor deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorMutationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}/changes": {
      "get": {
        "summary": "Get Monitor Changes",
        "description": "Get the detected changes for a monitor — each entry records when the watched content differed from the previous check, with a diff/summary (and the AI change summary when aiMode is on).",
        "operationId": "getMonitorChanges",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detected changes for this monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorChangesResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}/pause": {
      "post": {
        "summary": "Pause a Website Monitor",
        "description": "Stop scheduled checks for a monitor.",
        "operationId": "pauseMonitor",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated monitor state",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorMutationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}/resume": {
      "post": {
        "summary": "Resume a Website Monitor",
        "description": "Restart scheduled checks for a paused monitor. May hit the plan's active-monitor cap.",
        "operationId": "resumeMonitor",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated monitor state",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorMutationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}/run": {
      "post": {
        "summary": "Run a Website Monitor Now",
        "description": "Trigger an immediate out-of-schedule check. Billed like a normal check.",
        "operationId": "runMonitorNow",
        "tags": [
          "Monitoring"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The monitor ID.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated monitor state",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorMutationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown monitor id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ai-visibility/sources": {
      "get": {
        "summary": "List AI Visibility Sources",
        "description": "List the AI answer engines available to Ask AI Visibility — each with its slug (what you pass as sources) and display label.",
        "operationId": "listAIVisibilitySources",
        "tags": [
          "AI Visibility"
        ],
        "responses": {
          "200": {
            "description": "Available AI answer engines",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AIVisibilitySource"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ai-visibility/search": {
      "post": {
        "summary": "Ask AI Visibility",
        "description": "Ask multiple AI answer engines (ChatGPT, Gemini, Google AI Overview) the same question and compare their answers. Asynchronous — poll GET /ai-visibility/search/{search_id} (with a delay in between) for the completed comparison and synthesis.",
        "operationId": "aiVisibilitySearch",
        "tags": [
          "AI Visibility"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AIVisibilitySearchRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Search accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AIVisibilitySearchResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ai-visibility/search/{search_id}": {
      "get": {
        "summary": "Get AI Visibility Result",
        "description": "Fetch the status and results of an AI visibility search started by Ask AI Visibility.",
        "operationId": "getAIVisibilitySearchResult",
        "tags": [
          "AI Visibility"
        ],
        "parameters": [
          {
            "name": "search_id",
            "in": "path",
            "required": true,
            "description": "The search_id returned by Ask AI Visibility.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current search status and, once completed, per-engine results and synthesis",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AIVisibilitySearchResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown search_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/sessions": {
      "get": {
        "summary": "List Browser Sessions",
        "description": "List your saved browser sessions — encrypted login states captured via the Anakin dashboard or Browser API. Each session's id is usable as sessionId in Scrape/Crawl/Create a Website Monitor, or session_id in Run a Browser Task. Optionally filter by the website domain the session belongs to.",
        "operationId": "listSessions",
        "tags": [
          "Browser Sessions"
        ],
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "Filter to sessions for one website domain, e.g. \"amazon.com\".",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Your saved browser sessions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Session"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/sessions/{id}": {
      "delete": {
        "summary": "Delete a Browser Session",
        "description": "Permanently delete a saved browser session and its encrypted login data. Irreversible — the user must log in again through the dashboard to recreate it, and any monitors or requests referencing this sessionId will lose authenticated access.",
        "operationId": "deleteSession",
        "tags": [
          "Browser Sessions"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The session ID to delete (from List Browser Sessions).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Session deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionMutationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown session id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ai/evaluate": {
      "post": {
        "summary": "Run a Browser Task",
        "description": "Run a natural-language task in a real cloud browser driven by an AI agent — it navigates, clicks, types, scrolls, and extracts (\"find the cheapest 65-inch TV on this site and list its specs\", \"fill the contact form with …\"). Submitted in async mode; returns a workflow ID — poll GET /ai/jobs/{workflow_id} (with a delay in between, this can take minutes; the server hard-caps a run at ~330s) for the result. For login-protected tasks pass session_id from List Browser Sessions. Does not execute payments or transfer funds; such tasks are refused.",
        "operationId": "startBrowserTask",
        "tags": [
          "Browser Automation"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrowserTaskRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Task accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserTaskSubmitResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request — missing or malformed body",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ai/jobs/{workflow_id}": {
      "get": {
        "summary": "Get Browser Task Result",
        "description": "Fetch the status and result of a browser task started by Run a Browser Task.",
        "operationId": "getBrowserTaskResult",
        "tags": [
          "Browser Automation"
        ],
        "parameters": [
          {
            "name": "workflow_id",
            "in": "path",
            "required": true,
            "description": "The workflow_id returned by Run a Browser Task.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current task status and, once completed, the result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserTaskJobResult"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown workflow_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/wire/build-requests/{id}": {
      "get": {
        "summary": "Get a Wire Build",
        "description": "Gets a Wire build started with POST /wire/build-request: its status (`pending` or `processing` while it runs), the published actions with their `action_id`, a `skipped` list of anything the build could not deliver, and the `catalog_slug` once an action has published. Read-only; spends no credits.",
        "operationId": "getWireBuild",
        "tags": [
          "Wire"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The build request id returned by POST /wire/build-request",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Build request detail",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "catalog_slug": {
                      "type": "string"
                    },
                    "actions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    },
                    "skipped": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Build request not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Anakin API key. Get a free one at https://anakin.io/dashboard (300 credits, no card required)."
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message."
          }
        }
      },
      "ScrapeRequest": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The full URL of the website to extract data from.",
            "example": "https://example.com"
          },
          "country": {
            "type": "string",
            "description": "Proxy country code, e.g. us, gb, de.",
            "default": "us"
          },
          "useBrowser": {
            "type": "boolean",
            "description": "Use a headless browser — best for JS-heavy sites.",
            "default": false
          },
          "generateJson": {
            "type": "boolean",
            "description": "AI-extract structured JSON from the page content.",
            "default": false
          },
          "forceFresh": {
            "type": "boolean",
            "description": "Bypass the cache and force a fresh extraction.",
            "default": false
          },
          "sessionId": {
            "type": "string",
            "description": "Reuse an existing authenticated browser session (see Browser Sessions) instead of an anonymous request."
          },
          "sessionName": {
            "type": "string",
            "description": "Human-readable name of a saved browser session — alternative to sessionId."
          }
        }
      },
      "ScrapeSubmitResponse": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "The job ID — pass to Get Scrape Result to poll for completion."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing"
            ]
          }
        }
      },
      "ScrapeResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job ID."
          },
          "url": {
            "type": "string",
            "description": "The URL that was scraped."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "completed",
              "failed"
            ]
          },
          "cached": {
            "type": "boolean",
            "description": "Whether this result was served from cache."
          },
          "durationMs": {
            "type": "integer",
            "description": "Extraction duration in milliseconds."
          },
          "markdown": {
            "type": "string",
            "description": "Page content as clean markdown (populated when the default markdown format is used)."
          },
          "generatedJson": {
            "type": "object",
            "description": "AI-extracted structured JSON — populated only when generateJson was true.",
            "additionalProperties": true
          },
          "error": {
            "type": "string",
            "description": "Populated only when status is failed."
          }
        }
      },
      "SearchRequest": {
        "type": "object",
        "required": [
          "prompt"
        ],
        "properties": {
          "prompt": {
            "type": "string",
            "description": "The search query or question.",
            "example": "latest developments in solid-state batteries"
          },
          "limit": {
            "type": "integer",
            "description": "Maximum number of results to return (default 5, max 20).",
            "default": 5
          }
        }
      },
      "SearchResultItem": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "snippet": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "last_updated": {
            "type": "string"
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Search ID."
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResultItem"
            }
          }
        }
      },
      "AgenticSearchRequest": {
        "type": "object",
        "required": [
          "prompt"
        ],
        "properties": {
          "prompt": {
            "type": "string",
            "description": "The research question or topic (max 8KB).",
            "example": "Compare pricing and rate limits across the top 3 web-scraping APIs"
          },
          "useBrowser": {
            "type": "boolean",
            "description": "Use a headless browser for citation scraping — matches the API default.",
            "default": true
          },
          "schema": {
            "type": "object",
            "description": "Optional JSON Schema describing the structured_data shape you want back.",
            "additionalProperties": true
          }
        }
      },
      "AgenticSearchSubmitResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "The job ID — pass to Get Agentic Search Result to poll for completion."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing"
            ]
          }
        }
      },
      "AgenticSearchResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job ID."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "completed",
              "failed"
            ]
          },
          "generatedJson": {
            "type": "object",
            "properties": {
              "summary": {
                "type": "string",
                "description": "AI-written summary of the research findings."
              },
              "structured_data": {
                "type": "object",
                "description": "Structured data matching the request's optional schema.",
                "additionalProperties": true
              },
              "data_schema": {
                "type": "object",
                "description": "Echo of the schema used to extract structured_data.",
                "additionalProperties": true
              }
            }
          },
          "durationMs": {
            "type": "integer",
            "description": "Total research duration in milliseconds."
          },
          "error": {
            "type": "string",
            "description": "Populated only when status is failed."
          }
        }
      },
      "MapRequest": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The starting URL for discovery (typically a homepage or section root).",
            "example": "https://example.com"
          },
          "limit": {
            "type": "integer",
            "description": "Maximum number of URLs to return overall.",
            "default": 100
          },
          "depth": {
            "type": "integer",
            "description": "How many link-hops from the starting URL to follow.",
            "default": 2
          },
          "limitPerLevel": {
            "type": "integer",
            "description": "Maximum URLs collected per depth level (controls breadth).",
            "default": 100
          },
          "includeSubdomains": {
            "type": "boolean",
            "description": "Include URLs on subdomains of the starting host.",
            "default": false
          },
          "includeExternalLinks": {
            "type": "boolean",
            "description": "Also collect (but do not follow) external links.",
            "default": false
          },
          "useBrowser": {
            "type": "boolean",
            "description": "Use a headless browser — best for JS-heavy sites.",
            "default": false
          },
          "search": {
            "type": "string",
            "description": "Optional keyword filter — only return URLs whose path/title matches."
          }
        }
      },
      "MapSubmitResponse": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "The job ID — pass to Get Map Result to poll for completion."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing"
            ]
          }
        }
      },
      "MapResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job ID."
          },
          "url": {
            "type": "string",
            "description": "The URL that was mapped."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "completed",
              "failed"
            ]
          },
          "links": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Internal URLs discovered."
          },
          "totalLinks": {
            "type": "integer",
            "description": "Count of internal URLs discovered."
          },
          "externalLinks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "External URLs discovered (only when includeExternalLinks was true)."
          },
          "totalExternalLinks": {
            "type": "integer",
            "description": "Count of external URLs discovered."
          },
          "durationMs": {
            "type": "integer",
            "description": "Mapping duration in milliseconds."
          },
          "error": {
            "type": "string",
            "description": "Populated only when status is failed."
          }
        }
      },
      "CrawlRequest": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The starting URL to crawl from.",
            "example": "https://example.com"
          },
          "maxPages": {
            "type": "integer",
            "description": "Hard cap on pages fetched.",
            "default": 10
          },
          "depth": {
            "type": "integer",
            "description": "Link-hops from the starting URL to follow.",
            "default": 1
          },
          "country": {
            "type": "string",
            "description": "Proxy country code, e.g. us, gb, de.",
            "default": "us"
          },
          "useBrowser": {
            "type": "boolean",
            "description": "Render each page in a headless browser (for SPAs).",
            "default": false
          },
          "includePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Glob/regex patterns. Only URLs matching at least one pattern are fetched."
          },
          "excludePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Glob/regex patterns. URLs matching any pattern are skipped."
          },
          "sessionId": {
            "type": "string",
            "description": "Reuse an existing authenticated browser session (see Browser Sessions) instead of an anonymous request."
          },
          "sessionName": {
            "type": "string",
            "description": "Human-readable name of a saved browser session — alternative to sessionId."
          }
        }
      },
      "CrawlSubmitResponse": {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "The job ID — pass to Get Crawl Result to poll for completion."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing"
            ]
          }
        }
      },
      "CrawlPage": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "completed",
              "failed"
            ]
          },
          "markdown": {
            "type": "string"
          },
          "html": {
            "type": "string"
          },
          "durationMs": {
            "type": "integer"
          },
          "error": {
            "type": "string",
            "description": "Populated only when status is failed."
          }
        }
      },
      "CrawlResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job ID."
          },
          "url": {
            "type": "string",
            "description": "The starting URL that was crawled."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "completed",
              "failed"
            ]
          },
          "totalPages": {
            "type": "integer"
          },
          "completedPages": {
            "type": "integer"
          },
          "pages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CrawlPage"
            }
          },
          "durationMs": {
            "type": "integer",
            "description": "Total crawl duration in milliseconds."
          },
          "error": {
            "type": "string",
            "description": "Populated only when status is failed."
          }
        }
      },
      "WireResolveResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Ranked candidate actions, each with its action_id, type (read/write), required/optional params, credit cost, and whether auth is needed."
          },
          "next": {
            "type": "string",
            "description": "Suggested next call."
          }
        }
      },
      "WireCatalogSummary": {
        "type": "object",
        "additionalProperties": true,
        "description": "Every catalog Wire supports and its action count. Exact shape is catalog-defined."
      },
      "WireCatalogDetail": {
        "type": "object",
        "additionalProperties": true,
        "description": "One catalog's full action list with parameter schemas, action types, auth modes, credit costs, and (for credentials-mode sites) login fields."
      },
      "WireTaskRequest": {
        "type": "object",
        "required": [
          "action_id"
        ],
        "properties": {
          "action_id": {
            "type": "string",
            "description": "The action to run (from Discover Wire Actions or Get a Wire Catalog)."
          },
          "params": {
            "type": "object",
            "additionalProperties": true,
            "description": "The action's input parameters. Shape depends on the action — use its parameter schema from discovery. Omit for actions that take none."
          },
          "credential_id": {
            "type": "string",
            "description": "Required when the action's auth_mode is \"required\"; honored when \"optional\"; ignored when \"none\". Get one from List Wire Identities or Sign In to a Wire Site."
          },
          "identity_id": {
            "type": "string",
            "description": "Optional identity selector — the server resolves a credential from it (alternative to credential_id)."
          }
        }
      },
      "WireTaskResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "Either the action's data inline (synchronous actions) or a job handle to poll (asynchronous actions).",
        "properties": {
          "status": {
            "type": "string",
            "description": "Present on both sync and async responses."
          },
          "job_id": {
            "type": "string",
            "description": "Present when the action runs asynchronously — poll GET /wire/jobs/{jobId}. Absent when the action completed synchronously, in which case its result data is returned inline in this same object."
          },
          "poll_url": {
            "type": "string",
            "description": "Present alongside job_id — convenience polling URL."
          }
        }
      },
      "WireJobError": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "details": {
            "type": "string"
          },
          "connect_url": {
            "type": "string",
            "description": "Present on AUTH_REQUIRED — where to connect the account."
          }
        }
      },
      "WireJobStatus": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "processing",
              "completed",
              "failed"
            ]
          },
          "retry_after_ms": {
            "type": "integer",
            "description": "Present while processing — server's suggested poll delay in milliseconds."
          },
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Present when completed — the action's extracted/returned data."
          },
          "credits_used": {
            "type": "number"
          },
          "execution_ms": {
            "type": "number"
          },
          "error": {
            "$ref": "#/components/schemas/WireJobError"
          }
        }
      },
      "WireIdentitiesResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "Your saved Wire identities and their credentials (id, status, catalog)."
      },
      "WireLoginRequest": {
        "type": "object",
        "required": [
          "catalog_slug"
        ],
        "properties": {
          "catalog_slug": {
            "type": "string",
            "description": "The catalog to sign in to, e.g. \"neb\"."
          },
          "params": {
            "type": "object",
            "additionalProperties": true,
            "description": "Login fields defined by the catalog (e.g. email/password) — see that catalog's login_input_schema."
          },
          "identity_name": {
            "type": "string",
            "description": "Optional name for the identity. Derived from params in password mode; required when using a 1Password locator."
          },
          "source_id": {
            "type": "string",
            "description": "Optional 1Password identity-source ID (alternative to params)."
          },
          "source_ref": {
            "type": "object",
            "additionalProperties": true,
            "description": "Optional 1Password item locator { vault_id, item_id, fields } (use with source_id instead of params)."
          }
        }
      },
      "WireLoginResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "The resulting identity and credential."
      },
      "WireBuildRequest": {
        "type": "object",
        "required": [
          "website_url",
          "goal"
        ],
        "properties": {
          "website_url": {
            "type": "string",
            "description": "The site to build an action for. The domain is extracted automatically."
          },
          "goal": {
            "type": "string",
            "description": "Natural-language description of what the action should do or extract. Be specific — the builder synthesizes the scraper from this."
          },
          "catalog_id": {
            "type": "string",
            "description": "Optional — attach to an existing catalog instead of creating one."
          },
          "visibility": {
            "type": "string",
            "enum": [
              "private",
              "public"
            ],
            "description": "Action visibility.",
            "default": "private"
          },
          "force": {
            "type": "boolean",
            "description": "Build even if similar actions already exist for the domain (otherwise the request is rejected with ACTION_EXISTS).",
            "default": false
          },
          "actions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional list of separate capabilities to build, each as its own action, for example \"search products\"."
          },
          "country": {
            "type": "string",
            "description": "Optional 2-letter country code to build and test from, for example \"US\"."
          }
        }
      },
      "WireBuildResponse": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "status": {
            "type": "string",
            "description": "e.g. \"pending\" — the build runs asynchronously."
          }
        }
      },
      "MonitorCreateRequest": {
        "type": "object",
        "required": [
          "url",
          "intervalMinutes"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The URL to watch (root URL for site scope; the Wire site's URL for wire scope).",
            "example": "https://example.com"
          },
          "intervalMinutes": {
            "type": "integer",
            "description": "Check frequency in minutes. Minimum 15.",
            "minimum": 15
          },
          "scope": {
            "type": "string",
            "enum": [
              "page",
              "site",
              "wire"
            ],
            "description": "What to monitor: one page (default), a whole site, or a Wire action.",
            "default": "page"
          },
          "watchMode": {
            "type": "string",
            "enum": [
              "full_page",
              "specific_data"
            ],
            "description": "Compare the whole page (default) or only the fields in outputSchema, extracted with AI.",
            "default": "full_page"
          },
          "watchFormat": {
            "type": "string",
            "enum": [
              "markdown",
              "html",
              "cleaned_html"
            ],
            "description": "Format compared in full_page mode. Defaults to markdown.",
            "default": "markdown"
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true,
            "description": "JSON Schema of the fields to track. Required when watchMode is \"specific_data\"."
          },
          "aiMode": {
            "type": "boolean",
            "description": "AI meaningful-change filtering: ignores trivial noise (ads, timestamps) and summarizes real changes. +1 credit per check.",
            "default": false
          },
          "aiGoal": {
            "type": "string",
            "description": "Natural-language description of which changes count as meaningful (used with aiMode), e.g. \"only when the price drops or it goes out of stock\"."
          },
          "useBrowser": {
            "type": "boolean",
            "description": "Render checks with a stealth headless browser (needed for JS-heavy pages). Forced true when sessionId is set.",
            "default": false
          },
          "country": {
            "type": "string",
            "description": "Two-letter proxy country code. Defaults to \"us\".",
            "default": "us"
          },
          "sessionId": {
            "type": "string",
            "description": "Saved browser-session ID for monitoring login-protected pages (see List Browser Sessions)."
          },
          "isActive": {
            "type": "boolean",
            "description": "Start running immediately. Defaults to true.",
            "default": true
          },
          "expiresAt": {
            "type": "string",
            "description": "Optional end date (ISO 8601 timestamp or YYYY-MM-DD); the monitor auto-pauses when it passes."
          },
          "alertWebhookUrl": {
            "type": "string",
            "description": "Webhook URL that receives signed change alerts."
          },
          "alertEmails": {
            "type": "string",
            "description": "Comma-separated email recipients for change alerts."
          },
          "maxPages": {
            "type": "integer",
            "description": "Site scope: max pages crawled per run.",
            "minimum": 1
          },
          "maxDepth": {
            "type": "integer",
            "description": "Site scope: crawl depth (1–5). Defaults to 2.",
            "minimum": 1,
            "maximum": 5
          },
          "includePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Site scope: glob patterns or hand-picked same-site URLs to track."
          },
          "excludePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Site scope: glob patterns to skip."
          },
          "wireActionId": {
            "type": "string",
            "description": "Wire scope (required there): the Wire action run each check, e.g. \"amazon.search_products\" (see Discover Wire Actions)."
          },
          "wireCatalogSlug": {
            "type": "string",
            "description": "Wire scope: catalogue slug of the Wire site."
          },
          "wireCredentialId": {
            "type": "string",
            "description": "Wire scope: credential ID when the action needs auth (see List Wire Identities)."
          },
          "wireParams": {
            "type": "object",
            "additionalProperties": true,
            "description": "Wire scope: parameters passed to the action each check."
          },
          "wireWatchPaths": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Wire scope: JSON paths to diff instead of the whole response."
          }
        }
      },
      "Monitor": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "description": "Monitor ID."
          },
          "url": {
            "type": "string"
          },
          "intervalMinutes": {
            "type": "integer"
          },
          "scope": {
            "type": "string",
            "enum": [
              "page",
              "site",
              "wire"
            ]
          },
          "watchMode": {
            "type": "string",
            "enum": [
              "full_page",
              "specific_data"
            ]
          },
          "watchFormat": {
            "type": "string",
            "enum": [
              "markdown",
              "html",
              "cleaned_html"
            ]
          },
          "isActive": {
            "type": "boolean"
          },
          "alertWebhookSecret": {
            "type": "string",
            "description": "HMAC signing secret for verifying alert-webhook payloads. Treat as a credential."
          }
        }
      },
      "MonitorChangesResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "Detected changes for the monitor — typically a list of entries, each recording when the watched content differed from the previous check, with a diff/summary (and the AI change summary when aiMode is on)."
      },
      "MonitorMutationResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "Confirmation of the requested monitor state change."
      },
      "AIVisibilitySource": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        }
      },
      "AIVisibilitySearchRequest": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "description": "The question to ask every engine (max 2000 characters).",
            "maxLength": 2000
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Engine slugs to query (see List AI Visibility Sources). Omit to query all enabled engines."
          },
          "country": {
            "type": "string",
            "description": "Two-letter ISO country for the search geography (proxy exit). Defaults to \"us\".",
            "default": "us"
          }
        }
      },
      "AIVisibilitySearchResult": {
        "type": "object",
        "properties": {
          "search_id": {
            "type": "string",
            "description": "Search ID."
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "completed",
              "failed"
            ]
          },
          "country": {
            "type": "string"
          },
          "synthesis": {
            "type": "string",
            "description": "AI-generated synthesis of where the engines agree and diverge."
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "One entry per engine — status, answer summary (and full_content when requested), latency, credits used, and a consensus/outlier verdict."
          }
        }
      },
      "Session": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "description": "Session ID — pass as sessionId/session_id elsewhere."
          },
          "domain": {
            "type": "string",
            "description": "The website domain this session is authenticated for."
          }
        }
      },
      "SessionMutationResponse": {
        "type": "object",
        "additionalProperties": true,
        "description": "Confirmation of deletion."
      },
      "BrowserTaskRequest": {
        "type": "object",
        "required": [
          "prompt"
        ],
        "properties": {
          "prompt": {
            "type": "string",
            "description": "The task in natural language. Be specific about the goal and what to return. Never include passwords or secrets — use session_id for authenticated sites."
          },
          "async": {
            "type": "boolean",
            "description": "Run asynchronously and return a workflow_id to poll, instead of blocking the request until done (the synchronous mode can block for several minutes). Async is recommended for all clients.",
            "default": true
          },
          "url": {
            "type": "string",
            "description": "Navigate here before starting. Omit to let the agent follow URLs named in the prompt."
          },
          "session_id": {
            "type": "string",
            "description": "Saved browser-session ID (from List Browser Sessions) so the task runs logged in."
          },
          "max_steps": {
            "type": "integer",
            "description": "Cap on agent steps (navigation/click/type actions).",
            "minimum": 1
          },
          "timeout_ms": {
            "type": "integer",
            "description": "Task timeout in milliseconds (server caps runs at ~330s regardless).",
            "minimum": 1000
          },
          "output_schema": {
            "type": "object",
            "additionalProperties": true,
            "description": "JSON Schema for the result — the agent returns structured data conforming to it."
          }
        }
      },
      "BrowserTaskSubmitResponse": {
        "type": "object",
        "properties": {
          "workflow_id": {
            "type": "string",
            "description": "The workflow ID — pass to Get Browser Task Result to poll for completion."
          },
          "status": {
            "type": "string"
          }
        }
      },
      "BrowserTaskResult": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "success": {
            "type": "boolean"
          },
          "result": {
            "description": "The task's output — structured data matching output_schema when provided, otherwise a free-form result."
          },
          "steps": {
            "type": "array",
            "items": {},
            "description": "Per-step agent actions taken."
          },
          "iterations": {
            "type": "integer"
          },
          "cached": {
            "type": "boolean"
          },
          "run_id": {
            "type": "string"
          },
          "duration_ms": {
            "type": "integer"
          }
        }
      },
      "BrowserTaskJobResult": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "workflow_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "completed",
              "failed",
              "timed_out"
            ]
          },
          "run_id": {
            "type": "string"
          },
          "result": {
            "$ref": "#/components/schemas/BrowserTaskResult"
          },
          "error": {
            "type": "string",
            "description": "Populated when status is failed or timed_out."
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Scrape",
      "description": "Single-page web extraction — markdown or AI-structured JSON."
    },
    {
      "name": "Search",
      "description": "Synchronous AI-powered web search with citations."
    },
    {
      "name": "Agentic Search",
      "description": "Multi-stage AI research: search, scrape citations, extract structured data."
    },
    {
      "name": "Map",
      "description": "Discover a site's URL structure — internal links, external links, and counts."
    },
    {
      "name": "Crawl",
      "description": "Bulk-fetch markdown across many pages of a site."
    },
    {
      "name": "Wire",
      "description": "Catalog of pre-built read/write automation actions across hundreds of websites, plus identity/credential management and on-demand action building."
    },
    {
      "name": "Monitoring",
      "description": "Scheduled website/page/Wire-action watchers that alert on detected changes."
    },
    {
      "name": "AI Visibility",
      "description": "Compare how multiple AI answer engines respond to the same question."
    },
    {
      "name": "Browser Sessions",
      "description": "Saved, encrypted login states reused across Scrape, Crawl, Monitoring, and Browser Automation."
    },
    {
      "name": "Browser Automation",
      "description": "Natural-language AI agent that drives a real cloud browser to navigate, interact, and extract."
    }
  ],
  "externalDocs": {
    "description": "Anakin API reference",
    "url": "https://anakin.io/docs/api-reference"
  }
}
