{
  "openapi": "3.1.0",
  "info": {
    "title": "Browse AI API Documentation",
    "description": "Authenticate every request with your Browse AI API key, sent as a Bearer token in the `Authorization` header. [Generate your API key](https://dashboard.browse.ai/api).\n",
    "version": "v2"
  },
  "servers": [
    {
      "url": "https://api.browse.ai/v2"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "internal",
      "x-displayName": "Internal",
      "description": "There are some endpoints that are only used by our integrations, so we don't add this tag to our core resources\n"
    },
    {
      "name": "system",
      "x-displayName": "System",
      "description": "This tag is used for endpoints that are used to check the status of Browse AI infrastructure\n"
    },
    {
      "name": "robots",
      "x-displayName": "Robots",
      "description": "A robot can be trained do almost anything you do manually on the web. For example:\n\n  - Open a webpage,\n  - Log in,\n  - Click on buttons,\n  - Fill out forms,\n  - Extract structured data from a webpage into a spreadsheet,\n  - Take screenshots,\n  - Monitor specific parts of webpages for visual or content changes.\n\nRobots are created either by using Prebuilt Robots or using Browse AI Recorder and its click-and-extract interface.  Every robot has a few input parameters (like the webpage address) that you can adjust every time you run it.\n"
    },
    {
      "name": "robot drafts",
      "x-displayName": "Robot Drafts",
      "description": "**Beta.** This part of the API may change before it is generally available.\n\nCreate and retrain robots from code.\n\n**One robot per site.** A robot is not tied to one page. To extract data from another page on the same site, run the robot you already have with a different `originUrl` input parameter. You do not need a new robot for each page.\n\nA robot draft trains a robot on a webpage. Send an `originUrl` with overall `instructions`, a `schema` of the data to extract, or both. The `schema` is a JSON Schema: each property is a column, and its `description` holds the column's instructions. The draft starts a preview right away. Poll the draft until its `status` is `ready`, `partially_ready`, or `failed`, then look at its `latestPreview`. Save a `ready` draft to create the robot. There are no webhooks for drafts.\n\nTo retrain a robot, create a draft with the robot's `robotId`. Saving it writes a new version of the same robot. Robots created from a Prebuilt Robot can't be retrained.\n\nSaving does not use credits for training. It also starts the robot's first task, which uses task credits like any other task. Training may use credits once your plan's AI budget is used up.\n\nDrafts stay in the list after they are saved.\n"
    },
    {
      "name": "tasks",
      "x-displayName": "Tasks",
      "description": "Each robot is trained to perform a certain task. Every time you run that robot, it will perform that task and the  details, including the extracted data, will be stored under that task.\n\nIf you set up a monitoring robot to monitor a webpage for changes daily,  it will have to run a task every day or about 30 tasks per month for you.\n"
    },
    {
      "name": "monitors",
      "x-displayName": "Monitors",
      "description": "Each robot on Browse AI can optionally have one or more monitors. Monitoring robots come with one monitor by default.\n\nFor example, if you set up a monitoring robot to monitor a category page on an e-commerce site for changes daily,  you can set up additional monitors to monitor other category pages on the same site using the same robot.\n\nEach monitor can have different input parameters and schedule.\n"
    },
    {
      "name": "webhooks",
      "x-displayName": "Webhooks",
      "description": "After a robot finishes a task, its webhooks will be called.\n"
    },
    {
      "name": "bulk runs",
      "x-displayName": "Bulk Runs",
      "description": "You can run up to 50,000 tasks at once using a robot with different input parameters for each task.\n"
    }
  ],
  "paths": {
    "/status": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Endpoint for checking the status of Browse AI infrastructure",
        "operationId": "getSystemStatus",
        "description": "This endpoint provides you with real-time information regarding the operational status of the Browse AI infrastructure. It gives insights into the condition of the tasks queue, thus allowing you to understand if the services are running smoothly or are under maintenance.\n",
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/status\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/status\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/status\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/status\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/status',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/status\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/status\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/status\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/status\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/status\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/status \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/status\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/status\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON containing Browse AI infrastructure status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getSystemStatus-200"
                }
              }
            }
          }
        }
      }
    },
    "/teams": {
      "get": {
        "tags": [
          "internal"
        ],
        "summary": "Retrieve list of teams under user account",
        "operationId": "getUserTeams",
        "description": "this endpoint be used on Browse AI integrations to fetch all of the teams by auth0 access token\n",
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/teams\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/teams\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/teams\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/teams\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/teams',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/teams\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/teams\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/teams\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/teams\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/teams\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/teams \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/teams\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/teams\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON containing the total number of the user.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getUserTeams-200"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots": {
      "get": {
        "tags": [
          "robots"
        ],
        "summary": "Retrieve list of robots under your account",
        "operationId": "getRobots",
        "description": "If you have already created a few robots on [your dashboard](https://dashboard.browse.ai), you can use this endpoint to retrieve a list of them.\n  \nYou can then use other endpoints to retrieve more information about your robots or run robots.\n",
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON containing the total number of robots and an array of robots under this team.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobots-200"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}": {
      "get": {
        "tags": [
          "robots"
        ],
        "summary": "Retrieve single robot by ID",
        "operationId": "getRobot",
        "description": "You can use this endpoint to retrieve a single robot by ID.\n",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID You can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots/{robotId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON containing the total number of robots and an array of robots under this team.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobot-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing an error code and message.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobot-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/cookies": {
      "patch": {
        "tags": [
          "robots"
        ],
        "summary": "Update a robot's cookies",
        "operationId": "upsertRobotCookies",
        "description": "Update a robot's cookies",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/RobotCookie"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/cookies\");\nvar request = new RestRequest(Method.PATCH);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/cookies\"\n\n\tpayload := strings.NewReader(\"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.patch(\"https://api.browse.ai/v2/robots/{robotId}/cookies\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"PATCH\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/cookies\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify([\n  {\n    name: 'ACCOUNT_CHOOSER',\n    value: 12341234,\n    domain: '.example.com',\n    expirationDate: 1723659417,\n    path: '/products/',\n    secure: true,\n    httpOnly: true,\n    hostOnly: true\n  }\n]));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'PATCH',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/cookies',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: [\n    {\n      name: 'ACCOUNT_CHOOSER',\n      value: 12341234,\n      domain: '.example.com',\n      expirationDate: 1723659417,\n      path: '/products/',\n      secure: true,\n      httpOnly: true,\n      hostOnly: true\n    }\n  ],\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @[ @{ @\"name\": @\"ACCOUNT_CHOOSER\", @\"value\": @12341234, @\"domain\": @\".example.com\", @\"expirationDate\": @1723659417, @\"path\": @\"/products/\", @\"secure\": @YES, @\"httpOnly\": @YES, @\"hostOnly\": @YES } ];\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/cookies\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"PATCH\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/cookies\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"PATCH\",\n  CURLOPT_POSTFIELDS => \"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"PATCH\", \"/v2/robots/{robotId}/cookies\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/cookies\"\n\npayload = [\n    {\n        \"name\": \"ACCOUNT_CHOOSER\",\n        \"value\": 12341234,\n        \"domain\": \".example.com\",\n        \"expirationDate\": 1723659417,\n        \"path\": \"/products/\",\n        \"secure\": True,\n        \"httpOnly\": True,\n        \"hostOnly\": True\n    }\n]\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"PATCH\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/cookies\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Patch.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"[{\\\"name\\\":\\\"ACCOUNT_CHOOSER\\\",\\\"value\\\":12341234,\\\"domain\\\":\\\".example.com\\\",\\\"expirationDate\\\":1723659417,\\\"path\\\":\\\"/products/\\\",\\\"secure\\\":true,\\\"httpOnly\\\":true,\\\"hostOnly\\\":true}]\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request PATCH \\\n  --url https://api.browse.ai/v2/robots/{robotId}/cookies \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '[{\"name\":\"ACCOUNT_CHOOSER\",\"value\":12341234,\"domain\":\".example.com\",\"expirationDate\":1723659417,\"path\":\"/products/\",\"secure\":true,\"httpOnly\":true,\"hostOnly\":true}]'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method PATCH \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '[{\"name\":\"ACCOUNT_CHOOSER\",\"value\":12341234,\"domain\":\".example.com\",\"expirationDate\":1723659417,\"path\":\"/products/\",\"secure\":true,\"httpOnly\":true,\"hostOnly\":true}]' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/cookies\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  [\n    \"name\": \"ACCOUNT_CHOOSER\",\n    \"value\": 12341234,\n    \"domain\": \".example.com\",\n    \"expirationDate\": 1723659417,\n    \"path\": \"/products/\",\n    \"secure\": true,\n    \"httpOnly\": true,\n    \"hostOnly\": true\n  ]\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/cookies\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"PATCH\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the updated monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/upsertRobotCookies-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/upsertRobotCookies-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/tasks": {
      "get": {
        "tags": [
          "tasks"
        ],
        "summary": "Get all tasks by a robot",
        "operationId": "getRobotTasks",
        "description": "Get all of a robot's tasks\n",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            },
            "required": false,
            "description": "Page number"
          },
          {
            "in": "query",
            "name": "pageSize",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 10,
              "example": 10
            },
            "required": false,
            "description": "Page size"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "failed",
                "successful",
                "in-progress"
              ],
              "example": "successful"
            },
            "required": false,
            "description": "Task status"
          },
          {
            "in": "query",
            "name": "robotBulkRunId",
            "schema": {
              "type": "string",
              "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0"
            },
            "required": false,
            "description": "filter the result based on robot bulk run ID"
          },
          {
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string",
              "example": "-createdAt,finishedAt"
            },
            "required": false,
            "description": "A comma separated list of fields to sort by. Default sorting is ascending and prefixing field names with a hyphen '-' yields a descending order."
          },
          {
            "in": "query",
            "name": "includeRetried",
            "deprecated": true,
            "schema": {
              "type": "boolean",
              "example": false
            },
            "required": false,
            "description": "Deprecated and ignored. Automatic retries are part of the task and aren't listed separately.\n"
          },
          {
            "in": "query",
            "name": "fromDate",
            "schema": {
              "type": "integer",
              "example": 1678795867879
            },
            "required": false,
            "description": "From task creation date and time in the form of a Unix timestamp"
          },
          {
            "in": "query",
            "name": "toDate",
            "schema": {
              "type": "integer",
              "example": 1678795867879
            },
            "required": false,
            "description": "To task creation date and time in the form of a Unix timestamp"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/tasks?page=1\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/tasks',\n  qs: {page: '1'},\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/tasks?page=1\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/tasks\"\n\nquerystring = {\"page\":\"1\"}\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers, params=querystring)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url 'https://api.browse.ai/v2/robots/{robotId}/tasks?page=1' \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - 'https://api.browse.ai/v2/robots/{robotId}/tasks?page=1'\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/tasks?page=1\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON including robots list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotTasks-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotTasks-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "tasks"
        ],
        "summary": "Run a robot",
        "operationId": "newRobotTask",
        "description": "Run a robot on-demand with custom input parameters.\n\nWhen you need to run a robot and get its captured data, you can use this endpoint to run  the task, and then use webhooks to receive the captured data as soon as the task is finished.  Alternatively, you can poll the GET endpoint to retrieve a task's details as soon as it is finished.\n",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewRobotTaskBodyParams"
              }
            }
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/tasks\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/tasks\"\n\n\tpayload := strings.NewReader(\"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\")\n\n\treq, _ := http.NewRequest(\"POST\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robots/{robotId}/tasks\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/tasks\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  inputParameters: {\n    originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n  }\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/tasks',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    inputParameters: {\n      originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n    }\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"inputParameters\": @{ @\"originUrl\": @\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\" } };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/tasks\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/tasks\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_POSTFIELDS => \"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robots/{robotId}/tasks\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/tasks\"\n\npayload = {\"inputParameters\": {\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"}}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/tasks\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"}}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robots/{robotId}/tasks \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"}}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"}}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/tasks\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\"inputParameters\": [\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"]] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/tasks\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON including robots list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/newRobotTask-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/newRobotTask-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "The request can not be processed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditsLimitReachedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          },
          "503": {
            "description": "A JSON containing error attributes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotUnderMaintenanceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/tasks/{taskId}": {
      "get": {
        "tags": [
          "tasks"
        ],
        "summary": "Retrieve a task",
        "operationId": "getRobotTask",
        "description": "Retrieve a task's details and captured data. If the task is retried automatically, its status stays `in-progress` until the last retry finishes.\n",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "taskId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "f3672790-4561-424b-8a7b-7b7df182b236",
            "description": "Unique task ID"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/tasks/{taskId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/tasks/{taskId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/tasks/{taskId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON including robots list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotTask-200"
                },
                "examples": {
                  "capturedDataAvailable": {
                    "$ref": "#/components/examples/getRobotTask-200-capturedDataAvailable",
                    "summary": "Captured data available"
                  },
                  "capturedDataRemoved": {
                    "$ref": "#/components/examples/getRobotTask-200-capturedDataRemoved",
                    "summary": "Removed by data retention policy"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotTask-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/monitors": {
      "get": {
        "tags": [
          "monitors"
        ],
        "summary": "Retrieve a robot's monitors",
        "operationId": "getMonitors",
        "description": "Retrieve a robot's monitors list.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/monitors\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/monitors\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/monitors\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/monitors\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/monitors',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/monitors\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/monitors\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/monitors\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/monitors\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/monitors\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots/{robotId}/monitors \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/monitors\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/monitors\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON including monitors list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getMonitors-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getMonitors-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "monitors"
        ],
        "summary": "Create a new monitor on a robot",
        "operationId": "createNewMonitor",
        "description": "Create a new monitor on a robot.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateNewMonitorRequestBody"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/monitors\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/monitors\"\n\n\tpayload := strings.NewReader(\"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\")\n\n\treq, _ := http.NewRequest(\"POST\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robots/{robotId}/monitors\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/monitors\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  name: 'Monitor products',\n  inputParameters: {\n    originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n  },\n  schedule: 'FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR',\n  notifyOnCapturedScreenshotChange: true,\n  notifyOnCapturedTextChange: true,\n  capturedScreenshotNotificationThreshold: 15\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/monitors',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    name: 'Monitor products',\n    inputParameters: {\n      originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n    },\n    schedule: 'FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR',\n    notifyOnCapturedScreenshotChange: true,\n    notifyOnCapturedTextChange: true,\n    capturedScreenshotNotificationThreshold: 15\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"name\": @\"Monitor products\",\n                              @\"inputParameters\": @{ @\"originUrl\": @\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\" },\n                              @\"schedule\": @\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n                              @\"notifyOnCapturedScreenshotChange\": @YES,\n                              @\"notifyOnCapturedTextChange\": @YES,\n                              @\"capturedScreenshotNotificationThreshold\": @15 };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/monitors\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/monitors\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_POSTFIELDS => \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robots/{robotId}/monitors\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/monitors\"\n\npayload = {\n    \"name\": \"Monitor products\",\n    \"inputParameters\": {\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\n    \"schedule\": \"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n    \"notifyOnCapturedScreenshotChange\": True,\n    \"notifyOnCapturedTextChange\": True,\n    \"capturedScreenshotNotificationThreshold\": 15\n}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/monitors\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":true,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":15}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robots/{robotId}/monitors \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"name\":\"Monitor products\",\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\"schedule\":\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\"notifyOnCapturedScreenshotChange\":true,\"notifyOnCapturedTextChange\":true,\"capturedScreenshotNotificationThreshold\":15}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"name\":\"Monitor products\",\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\"schedule\":\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\"notifyOnCapturedScreenshotChange\":true,\"notifyOnCapturedTextChange\":true,\"capturedScreenshotNotificationThreshold\":15}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/monitors\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  \"name\": \"Monitor products\",\n  \"inputParameters\": [\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"],\n  \"schedule\": \"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n  \"notifyOnCapturedScreenshotChange\": true,\n  \"notifyOnCapturedTextChange\": true,\n  \"capturedScreenshotNotificationThreshold\": 15\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/monitors\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the newly created monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createNewMonitor-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateMonitorBadRequestResponse"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "A JSON containing error attributes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateMonitorForbiddenResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/monitors/{monitorId}": {
      "get": {
        "tags": [
          "monitors"
        ],
        "summary": "Retrieve a robot's monitor",
        "operationId": "getMonitor",
        "description": "Retrieve a robot's monitor.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "monitorId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "e524ab69-4269-4d9d-b3d8-678112a10d29",
            "description": "Unique monitor ID\n\nYou can find a monitor's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/monitors/{monitorId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/monitors/{monitorId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getMonitor-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getMonitor-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "monitors"
        ],
        "summary": "Update a robot's monitor",
        "operationId": "updateMonitor",
        "description": "Update a robot's monitor",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "monitorId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "e524ab69-4269-4d9d-b3d8-678112a10d29",
            "description": "Unique monitor ID\n\nYou can find a monitor's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonitorUpdateBodyParams"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\");\nvar request = new RestRequest(Method.PATCH);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\n\tpayload := strings.NewReader(\"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.patch(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"PATCH\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/monitors/{monitorId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  name: 'Monitor products',\n  inputParameters: {\n    originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n  },\n  schedule: 'FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR',\n  notifyOnCapturedScreenshotChange: false,\n  notifyOnCapturedTextChange: true,\n  capturedScreenshotNotificationThreshold: 16\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'PATCH',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    name: 'Monitor products',\n    inputParameters: {\n      originUrl: 'https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines'\n    },\n    schedule: 'FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR',\n    notifyOnCapturedScreenshotChange: false,\n    notifyOnCapturedTextChange: true,\n    capturedScreenshotNotificationThreshold: 16\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"name\": @\"Monitor products\",\n                              @\"inputParameters\": @{ @\"originUrl\": @\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\" },\n                              @\"schedule\": @\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n                              @\"notifyOnCapturedScreenshotChange\": @NO,\n                              @\"notifyOnCapturedTextChange\": @YES,\n                              @\"capturedScreenshotNotificationThreshold\": @16 };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"PATCH\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"PATCH\",\n  CURLOPT_POSTFIELDS => \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"PATCH\", \"/v2/robots/{robotId}/monitors/{monitorId}\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\npayload = {\n    \"name\": \"Monitor products\",\n    \"inputParameters\": {\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\n    \"schedule\": \"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n    \"notifyOnCapturedScreenshotChange\": False,\n    \"notifyOnCapturedTextChange\": True,\n    \"capturedScreenshotNotificationThreshold\": 16\n}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"PATCH\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Patch.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"name\\\":\\\"Monitor products\\\",\\\"inputParameters\\\":{\\\"originUrl\\\":\\\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\\\"},\\\"schedule\\\":\\\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\\\",\\\"notifyOnCapturedScreenshotChange\\\":false,\\\"notifyOnCapturedTextChange\\\":true,\\\"capturedScreenshotNotificationThreshold\\\":16}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request PATCH \\\n  --url https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"name\":\"Monitor products\",\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\"schedule\":\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\"notifyOnCapturedScreenshotChange\":false,\"notifyOnCapturedTextChange\":true,\"capturedScreenshotNotificationThreshold\":16}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method PATCH \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"name\":\"Monitor products\",\"inputParameters\":{\"originUrl\":\"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"},\"schedule\":\"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\"notifyOnCapturedScreenshotChange\":false,\"notifyOnCapturedTextChange\":true,\"capturedScreenshotNotificationThreshold\":16}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  \"name\": \"Monitor products\",\n  \"inputParameters\": [\"originUrl\": \"https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines\"],\n  \"schedule\": \"FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR\",\n  \"notifyOnCapturedScreenshotChange\": false,\n  \"notifyOnCapturedTextChange\": true,\n  \"capturedScreenshotNotificationThreshold\": 16\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"PATCH\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the updated monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/updateMonitor-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateMonitorBadRequestResponse"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "A JSON containing error attributes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateMonitorForbiddenResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "monitors"
        ],
        "summary": "Delete a robot's monitor",
        "operationId": "deleteMonitor",
        "description": "Delete a robot's monitor.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "monitorId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "e524ab69-4269-4d9d-b3d8-678112a10d29",
            "description": "Unique monitor ID\n\nYou can find a monitor's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\");\nvar request = new RestRequest(Method.DELETE);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.delete(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"DELETE\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/monitors/{monitorId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'DELETE',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"DELETE\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"DELETE\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"DELETE\", \"/v2/robots/{robotId}/monitors/{monitorId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"DELETE\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Delete.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request DELETE \\\n  --url https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method DELETE \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/monitors/{monitorId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"DELETE\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the deleted monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/deleteMonitor-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/deleteMonitor-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/bulk-runs": {
      "post": {
        "tags": [
          "bulk runs"
        ],
        "summary": "Bulk run tasks",
        "operationId": "newBulkRun",
        "description": "Bulk run up to 50,000 tasks at a time using a robot.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRunBodyParams"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\"\n\n\tpayload := strings.NewReader(\"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\")\n\n\treq, _ := http.NewRequest(\"POST\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/bulk-runs\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  title: 'Bulk Run Title',\n  inputParameters: [\n    {\n      originUrl: 'https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories'\n    },\n    {\n      originUrl: 'https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers'\n    }\n  ]\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    title: 'Bulk Run Title',\n    inputParameters: [\n      {\n        originUrl: 'https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories'\n      },\n      {\n        originUrl: 'https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers'\n      }\n    ]\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"title\": @\"Bulk Run Title\",\n                              @\"inputParameters\": @[ @{ @\"originUrl\": @\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\" }, @{ @\"originUrl\": @\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\" } ] };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_POSTFIELDS => \"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robots/{robotId}/bulk-runs\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\"\n\npayload = {\n    \"title\": \"Bulk Run Title\",\n    \"inputParameters\": [{\"originUrl\": \"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\"}, {\"originUrl\": \"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\"}]\n}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"title\\\":\\\"Bulk Run Title\\\",\\\"inputParameters\\\":[{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\\\"},{\\\"originUrl\\\":\\\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\\\"}]}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robots/{robotId}/bulk-runs \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"title\":\"Bulk Run Title\",\"inputParameters\":[{\"originUrl\":\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\"},{\"originUrl\":\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\"}]}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"title\":\"Bulk Run Title\",\"inputParameters\":[{\"originUrl\":\"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\"},{\"originUrl\":\"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\"}]}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/bulk-runs\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  \"title\": \"Bulk Run Title\",\n  \"inputParameters\": [[\"originUrl\": \"https://www.seattlecoffeegear.com/shop-gear/accessories/espresso-accessories\"], [\"originUrl\": \"https://www.seattlecoffeegear.com/shop-gear/coffee-makers/drip-brewers\"]]\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the newly created Bulk run.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/newBulkRun-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/newBulkRun-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "A JSON containing error attributes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/newBulkRun-403"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          },
          "503": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotUnderMaintenanceResponse"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "bulk runs"
        ],
        "summary": "Retrieve a robot's bulk runs list",
        "operationId": "getBulkRuns",
        "description": "Retrieve a robot's bulk runs list.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            },
            "required": false,
            "description": "Page number"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/bulk-runs?page=1\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs',\n  qs: {page: '1'},\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/bulk-runs?page=1\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs\"\n\nquerystring = {\"page\":\"1\"}\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers, params=querystring)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1' \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1'\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs?page=1\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the bulk runs list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getBulkRuns-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getBulkRuns-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/bulk-runs/{bulkRunId}": {
      "get": {
        "tags": [
          "bulk runs"
        ],
        "summary": "Retrieve a robot's bulk run",
        "operationId": "getBulkRun",
        "description": "Retrieve a robot's bulk run along with a list of tasks run within the bulk run.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "bulkRunId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
            "description": "Unique bulk run ID\n"
          },
          {
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            },
            "required": false,
            "description": "Page number"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}',\n  qs: {page: '1'},\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}\"\n\nquerystring = {\"page\":\"1\"}\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers, params=querystring)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1' \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - 'https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1'\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/bulk-runs/{bulkRunId}?page=1\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the bulk run information along with a paginated list of all its tasks.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getBulkRun-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getBulkRun-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/webhooks": {
      "get": {
        "tags": [
          "webhooks"
        ],
        "summary": "Retrieve a robot's webhooks",
        "operationId": "getWebhooks",
        "description": "Retrieve a robot's webhook list.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/webhooks\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/webhooks\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/webhooks',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/webhooks\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/webhooks\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robots/{robotId}/webhooks\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/webhooks\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robots/{robotId}/webhooks \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/webhooks\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/webhooks\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON including monitors list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getWebhooks-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getWebhooks-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Create a new webhook on a robot",
        "operationId": "createNewWebhook",
        "description": "Create a new webhook on a robot",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateNewWebhookBodyParams"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/webhooks\"\n\n\tpayload := strings.NewReader(\"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\")\n\n\treq, _ := http.NewRequest(\"POST\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/webhooks\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  hookUrl: 'https://example.com/v2/webhooks/callback/events',\n  eventType: 'taskFinished'\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/webhooks',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    hookUrl: 'https://example.com/v2/webhooks/callback/events',\n    eventType: 'taskFinished'\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"hookUrl\": @\"https://example.com/v2/webhooks/callback/events\",\n                              @\"eventType\": @\"taskFinished\" };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/webhooks\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/webhooks\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_POSTFIELDS => \"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robots/{robotId}/webhooks\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/webhooks\"\n\npayload = {\n    \"hookUrl\": \"https://example.com/v2/webhooks/callback/events\",\n    \"eventType\": \"taskFinished\"\n}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/webhooks\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"hookUrl\\\":\\\"https://example.com/v2/webhooks/callback/events\\\",\\\"eventType\\\":\\\"taskFinished\\\"}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robots/{robotId}/webhooks \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"hookUrl\":\"https://example.com/v2/webhooks/callback/events\",\"eventType\":\"taskFinished\"}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"hookUrl\":\"https://example.com/v2/webhooks/callback/events\",\"eventType\":\"taskFinished\"}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/webhooks\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  \"hookUrl\": \"https://example.com/v2/webhooks/callback/events\",\n  \"eventType\": \"taskFinished\"\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/webhooks\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the newly created webhook.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createNewWebhook-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createNewWebhook-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robots/{robotId}/webhooks/{webhookId}": {
      "delete": {
        "tags": [
          "webhooks"
        ],
        "summary": "Delete a robot's webhook",
        "operationId": "deleteWebhook",
        "description": "Delete a robot's webhook.",
        "parameters": [
          {
            "in": "path",
            "name": "robotId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "description": "Unique robot ID\n\nYou can find a robot's ID by opening it on the dashboard and copying its ID in the browser address bar.\n"
          },
          {
            "in": "path",
            "name": "webhookId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "6d7f1218-43fb-4735-ac71-21e81b1ab23e",
            "description": "Unique webhookId ID\n"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\");\nvar request = new RestRequest(Method.DELETE);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\"\n\n\treq, _ := http.NewRequest(\"DELETE\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.delete(\"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"DELETE\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robots/{robotId}/webhooks/{webhookId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'DELETE',\n  url: 'https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"DELETE\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"DELETE\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"DELETE\", \"/v2/robots/{robotId}/webhooks/{webhookId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"DELETE\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Delete.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request DELETE \\\n  --url https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method DELETE \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robots/{robotId}/webhooks/{webhookId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"DELETE\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the deleted monitor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/deleteWebhook-200"
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/deleteWebhook-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "The resource is not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        }
      }
    },
    "/robot-drafts": {
      "post": {
        "tags": [
          "robot drafts"
        ],
        "summary": "Create a robot draft",
        "operationId": "createRobotDraft",
        "description": "Train a new robot, or retrain an existing one, on a webpage. The preview starts right away; poll the draft to follow it.\n\nSend `originUrl` with `instructions`, `schema`, or both, like interactive mode in the app. With only `instructions`, the data to extract is worked out from them. With `schema`, `instructions` apply to the whole robot, on top of each column's `description`. Column suggestions are not made for drafts created through the API. Send `robotId` to retrain a robot.\n\nOn retrain, the draft starts with the robot's columns. With only `instructions`, those columns are kept and the instructions apply on top of them. With `schema`, the schema replaces them: columns it leaves out are removed.\n",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRobotDraftBodyParams"
              },
              "examples": {
                "createRobotWithInstructions": {
                  "summary": "Create a robot from instructions",
                  "value": {
                    "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                    "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry."
                  }
                },
                "createRobotWithSchema": {
                  "summary": "Create a robot with a schema",
                  "value": {
                    "originUrl": "https://www.ikea.com/us/en/",
                    "name": "IKEA KALLAX 2x4 shelf units",
                    "instructions": "Get the name, description, price and link of every KALLAX shelf unit with 2x4 cubes.",
                    "country": "USA",
                    "schema": {
                      "type": "object",
                      "properties": {
                        "Shelf Units": {
                          "type": "array",
                          "description": "Every KALLAX shelf unit with 2x4 cubes",
                          "maxItems": 50,
                          "items": {
                            "type": "object",
                            "properties": {
                              "Name": {
                                "type": "string"
                              },
                              "Description": {
                                "type": "string"
                              },
                              "Price": {
                                "type": "string",
                                "description": "As shown, with the currency symbol, like \"$89.99\""
                              },
                              "Link": {
                                "type": "string",
                                "description": "Link to the product page"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "retrainRobot": {
                  "summary": "Retrain an existing robot",
                  "value": {
                    "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                    "robotId": "YOUR_ROBOT_ID",
                    "instructions": "Only include companies in the B2B industry."
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robot-drafts\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robot-drafts\"\n\n\tpayload := strings.NewReader(\"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\")\n\n\treq, _ := http.NewRequest(\"POST\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robot-drafts\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robot-drafts\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  originUrl: 'https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI',\n  name: 'YC AI companies',\n  instructions: 'Extract the AI companies in this batch: name, one-line description, batch, and industry.',\n  schema: {\n    type: 'object',\n    properties: {\n      'Total Company Count': {\n        type: 'string',\n        description: 'The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\"'\n      },\n      'YC Companies': {\n        type: 'array',\n        description: 'Every company card in the results',\n        maxItems: 50,\n        items: {\n          type: 'object',\n          properties: {\n            'Company Name': {type: 'string'},\n            Description: {type: 'string'},\n            Batch: {type: 'string', description: 'Exactly as displayed, like \"FALL 2025\"'},\n            Industry: {type: 'string', description: 'The first industry tag, like \"B2B\"'},\n            'Company URL': {type: 'string', description: 'Link to the company\\'s page on YC'}\n          }\n        }\n      }\n    }\n  }\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robot-drafts',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    originUrl: 'https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI',\n    name: 'YC AI companies',\n    instructions: 'Extract the AI companies in this batch: name, one-line description, batch, and industry.',\n    schema: {\n      type: 'object',\n      properties: {\n        'Total Company Count': {\n          type: 'string',\n          description: 'The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\"'\n        },\n        'YC Companies': {\n          type: 'array',\n          description: 'Every company card in the results',\n          maxItems: 50,\n          items: {\n            type: 'object',\n            properties: {\n              'Company Name': {type: 'string'},\n              Description: {type: 'string'},\n              Batch: {type: 'string', description: 'Exactly as displayed, like \"FALL 2025\"'},\n              Industry: {type: 'string', description: 'The first industry tag, like \"B2B\"'},\n              'Company URL': {type: 'string', description: 'Link to the company\\'s page on YC'}\n            }\n          }\n        }\n      }\n    }\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"originUrl\": @\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\",\n                              @\"name\": @\"YC AI companies\",\n                              @\"instructions\": @\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\",\n                              @\"schema\": @{ @\"type\": @\"object\", @\"properties\": @{ @\"Total Company Count\": @{ @\"type\": @\"string\", @\"description\": @\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\" }, @\"YC Companies\": @{ @\"type\": @\"array\", @\"description\": @\"Every company card in the results\", @\"maxItems\": @50, @\"items\": @{ @\"type\": @\"object\", @\"properties\": @{ @\"Company Name\": @{ @\"type\": @\"string\" }, @\"Description\": @{ @\"type\": @\"string\" }, @\"Batch\": @{ @\"type\": @\"string\", @\"description\": @\"Exactly as displayed, like \\\"FALL 2025\\\"\" }, @\"Industry\": @{ @\"type\": @\"string\", @\"description\": @\"The first industry tag, like \\\"B2B\\\"\" }, @\"Company URL\": @{ @\"type\": @\"string\", @\"description\": @\"Link to the company's page on YC\" } } } } } } };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robot-drafts\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robot-drafts\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_POSTFIELDS => \"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robot-drafts\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robot-drafts\"\n\npayload = {\n    \"originUrl\": \"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\",\n    \"name\": \"YC AI companies\",\n    \"instructions\": \"Extract the AI companies in this batch: name, one-line description, batch, and industry.\",\n    \"schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"Total Company Count\": {\n                \"type\": \"string\",\n                \"description\": \"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"\n            },\n            \"YC Companies\": {\n                \"type\": \"array\",\n                \"description\": \"Every company card in the results\",\n                \"maxItems\": 50,\n                \"items\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"Company Name\": {\"type\": \"string\"},\n                        \"Description\": {\"type\": \"string\"},\n                        \"Batch\": {\n                            \"type\": \"string\",\n                            \"description\": \"Exactly as displayed, like \\\"FALL 2025\\\"\"\n                        },\n                        \"Industry\": {\n                            \"type\": \"string\",\n                            \"description\": \"The first industry tag, like \\\"B2B\\\"\"\n                        },\n                        \"Company URL\": {\n                            \"type\": \"string\",\n                            \"description\": \"Link to the company's page on YC\"\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robot-drafts\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"originUrl\\\":\\\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\\\",\\\"name\\\":\\\"YC AI companies\\\",\\\"instructions\\\":\\\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\\\",\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}}}}}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robot-drafts \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"originUrl\":\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\",\"name\":\"YC AI companies\",\"instructions\":\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\",\"schema\":{\"type\":\"object\",\"properties\":{\"Total Company Count\":{\"type\":\"string\",\"description\":\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"},\"YC Companies\":{\"type\":\"array\",\"description\":\"Every company card in the results\",\"maxItems\":50,\"items\":{\"type\":\"object\",\"properties\":{\"Company Name\":{\"type\":\"string\"},\"Description\":{\"type\":\"string\"},\"Batch\":{\"type\":\"string\",\"description\":\"Exactly as displayed, like \\\"FALL 2025\\\"\"},\"Industry\":{\"type\":\"string\",\"description\":\"The first industry tag, like \\\"B2B\\\"\"},\"Company URL\":{\"type\":\"string\",\"description\":\"Link to the company'\\''s page on YC\"}}}}}}}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"originUrl\":\"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\",\"name\":\"YC AI companies\",\"instructions\":\"Extract the AI companies in this batch: name, one-line description, batch, and industry.\",\"schema\":{\"type\":\"object\",\"properties\":{\"Total Company Count\":{\"type\":\"string\",\"description\":\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"},\"YC Companies\":{\"type\":\"array\",\"description\":\"Every company card in the results\",\"maxItems\":50,\"items\":{\"type\":\"object\",\"properties\":{\"Company Name\":{\"type\":\"string\"},\"Description\":{\"type\":\"string\"},\"Batch\":{\"type\":\"string\",\"description\":\"Exactly as displayed, like \\\"FALL 2025\\\"\"},\"Industry\":{\"type\":\"string\",\"description\":\"The first industry tag, like \\\"B2B\\\"\"},\"Company URL\":{\"type\":\"string\",\"description\":\"Link to the company'\\''s page on YC\"}}}}}}}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robot-drafts\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\n  \"originUrl\": \"https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI\",\n  \"name\": \"YC AI companies\",\n  \"instructions\": \"Extract the AI companies in this batch: name, one-line description, batch, and industry.\",\n  \"schema\": [\n    \"type\": \"object\",\n    \"properties\": [\n      \"Total Company Count\": [\n        \"type\": \"string\",\n        \"description\": \"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"\n      ],\n      \"YC Companies\": [\n        \"type\": \"array\",\n        \"description\": \"Every company card in the results\",\n        \"maxItems\": 50,\n        \"items\": [\n          \"type\": \"object\",\n          \"properties\": [\n            \"Company Name\": [\"type\": \"string\"],\n            \"Description\": [\"type\": \"string\"],\n            \"Batch\": [\n              \"type\": \"string\",\n              \"description\": \"Exactly as displayed, like \\\"FALL 2025\\\"\"\n            ],\n            \"Industry\": [\n              \"type\": \"string\",\n              \"description\": \"The first industry tag, like \\\"B2B\\\"\"\n            ],\n            \"Company URL\": [\n              \"type\": \"string\",\n              \"description\": \"Link to the company's page on YC\"\n            ]\n          ]\n        ]\n      ]\n    ]\n  ]\n] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robot-drafts\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the robot draft.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createRobotDraft-200"
                },
                "examples": {
                  "createRobotWithInstructions": {
                    "$ref": "#/components/examples/CreatedFromInstructions",
                    "summary": "Created from instructions"
                  },
                  "createRobotWithSchema": {
                    "$ref": "#/components/examples/CreatedWithSchema",
                    "summary": "Created with a schema"
                  },
                  "retrainRobot": {
                    "$ref": "#/components/examples/RetrainingRobot",
                    "summary": "Retraining a robot"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createRobotDraft-400"
                },
                "examples": {
                  "invalidBody": {
                    "$ref": "#/components/examples/RobotDraftInvalidBody",
                    "summary": "Invalid request body"
                  },
                  "unsupportedCountry": {
                    "$ref": "#/components/examples/UnsupportedCountry",
                    "summary": "Country not supported"
                  },
                  "bodyParseError": {
                    "$ref": "#/components/examples/RobotDraftBodyParseError",
                    "summary": "Body not valid JSON"
                  },
                  "robotNotEligibleForRetraining": {
                    "$ref": "#/components/examples/RobotNotEligibleForRetraining",
                    "summary": "Robot not eligible for retraining"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "The request can not be processed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/createRobotDraft-403"
                },
                "examples": {
                  "creditsLimitReached": {
                    "$ref": "#/components/examples/RobotDraftCreditsLimitReached",
                    "summary": "Credits limit reached"
                  },
                  "trainingNotOnPlan": {
                    "$ref": "#/components/examples/RobotDraftTrainingNotOnPlan",
                    "summary": "Training not included in the plan"
                  },
                  "trainingAiBudgetExhausted": {
                    "$ref": "#/components/examples/RobotDraftTrainingAiBudgetExhausted",
                    "summary": "AI budget used up"
                  },
                  "robotsLimitReached": {
                    "$ref": "#/components/examples/RobotDraftRobotsLimitReached",
                    "summary": "Robots limit reached"
                  },
                  "websitesLimitReached": {
                    "$ref": "#/components/examples/RobotDraftWebsitesLimitReached",
                    "summary": "Websites limit reached"
                  }
                }
              }
            }
          },
          "404": {
            "description": "`robotId` was sent, but no robot with that ID is in your workspace. Leave `robotId` out to create a new robot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        },
        "x-badges": [
          {
            "name": "Beta",
            "position": "before",
            "color": "#e9d7fe"
          }
        ]
      },
      "get": {
        "tags": [
          "robot drafts"
        ],
        "summary": "Retrieve list of robot drafts",
        "operationId": "getRobotDrafts",
        "description": "Retrieve all robot drafts in your workspace, newest first, including saved drafts. To keep the response small, `latestPreview` is not included. Use `GET /v2/robot-drafts/{draftId}` to get a draft's `latestPreview`.\n",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            },
            "required": false,
            "description": "Page number"
          },
          {
            "in": "query",
            "name": "pageSize",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 10,
              "example": 10
            },
            "required": false,
            "description": "Page size"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robot-drafts?page=1\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robot-drafts?page=1\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robot-drafts?page=1\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robot-drafts?page=1\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robot-drafts',\n  qs: {page: '1'},\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robot-drafts?page=1\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robot-drafts?page=1\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robot-drafts?page=1\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robot-drafts\"\n\nquerystring = {\"page\":\"1\"}\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers, params=querystring)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robot-drafts?page=1\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url 'https://api.browse.ai/v2/robot-drafts?page=1' \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - 'https://api.browse.ai/v2/robot-drafts?page=1'\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robot-drafts?page=1\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing a paginated list of robot drafts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotDrafts-200"
                },
                "examples": {
                  "draftsInDifferentStates": {
                    "$ref": "#/components/examples/DraftsInDifferentStates",
                    "summary": "Drafts in different states"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotDrafts-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        },
        "x-badges": [
          {
            "name": "Beta",
            "position": "before",
            "color": "#e9d7fe"
          }
        ]
      }
    },
    "/robot-drafts/{draftId}": {
      "get": {
        "tags": [
          "robot drafts"
        ],
        "summary": "Retrieve a robot draft",
        "operationId": "getRobotDraft",
        "description": "Retrieve a robot draft's status, schema, the data its finished preview extracted (`latestPreview`), and why its preview failed, if it did. Poll this endpoint until the preview finishes.\n",
        "parameters": [
          {
            "in": "path",
            "name": "draftId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "description": "Unique robot draft ID"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robot-drafts/{draftId}\");\nvar request = new RestRequest(Method.GET);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robot-drafts/{draftId}\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.get(\"https://api.browse.ai/v2/robot-drafts/{draftId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"GET\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robot-drafts/{draftId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.browse.ai/v2/robot-drafts/{draftId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robot-drafts/{draftId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"GET\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robot-drafts/{draftId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"GET\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"GET\", \"/v2/robot-drafts/{draftId}\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robot-drafts/{draftId}\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"GET\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robot-drafts/{draftId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Get.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request GET \\\n  --url https://api.browse.ai/v2/robot-drafts/{draftId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method GET \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robot-drafts/{draftId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robot-drafts/{draftId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"GET\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the robot draft.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotDraft-200"
                },
                "examples": {
                  "ready": {
                    "$ref": "#/components/examples/Ready",
                    "summary": "Preview ready"
                  },
                  "inProgress": {
                    "$ref": "#/components/examples/InProgress",
                    "summary": "Preview in progress"
                  },
                  "partiallyReady": {
                    "$ref": "#/components/examples/PartiallyReady",
                    "summary": "Preview partially ready"
                  },
                  "failed": {
                    "$ref": "#/components/examples/Failed",
                    "summary": "Preview failed"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/getRobotDraft-400"
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "404": {
            "description": "No robot draft with this `draftId` is in your workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        },
        "x-badges": [
          {
            "name": "Beta",
            "position": "before",
            "color": "#e9d7fe"
          }
        ]
      },
      "patch": {
        "tags": [
          "robot drafts"
        ],
        "summary": "Update a robot draft",
        "operationId": "updateRobotDraft",
        "description": "Change a robot draft's `originUrl`, `instructions`, `schema`, or `name`.\n\nSending `originUrl`, `instructions`, or `schema` starts a new preview. If a preview is still running, it is cancelled first. `latestPreview` is `null` until the new preview finishes. Changing only a list's `maxItems` in `schema` starts a new preview too, even though previews extract at most 50 items per list. Changing only `name` is saved without a new preview.\n\nNew `instructions` sent without `schema` start over, like editing the instructions in the app: the draft's columns are worked out again from the new instructions, so `schema` is `null` until the new preview finds them. To keep the columns, send `schema` with the instructions. A column the latest preview couldn't capture must be edited or removed first: keeping it is refused with `bad_request` at that column's path, for example `/schema/properties/Title`.\n\nSending the same values as the latest preview while it is in progress or finished (`ready` or `partially_ready`) is refused with `draft_unchanged`, unless `name` is sent too: then the name is saved and the preview is left as it is. A `failed` preview can be run again with the same values.\n\nSaved drafts cannot be updated.\n",
        "parameters": [
          {
            "in": "path",
            "name": "draftId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "description": "Unique robot draft ID"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRobotDraftBodyParams"
              },
              "examples": {
                "retrainDraft": {
                  "summary": "Update and retrain the draft",
                  "value": {
                    "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                    "name": "YC AI companies",
                    "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
                    "schema": {
                      "type": "object",
                      "properties": {
                        "Total Company Count": {
                          "type": "string",
                          "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                        },
                        "YC Companies": {
                          "type": "array",
                          "description": "Every company card in the results",
                          "maxItems": 50,
                          "items": {
                            "type": "object",
                            "properties": {
                              "Company Name": {
                                "type": "string"
                              },
                              "Description": {
                                "type": "string"
                              },
                              "Batch": {
                                "type": "string",
                                "description": "Exactly as displayed, like \"FALL 2025\""
                              },
                              "Industry": {
                                "type": "string",
                                "description": "The first industry tag, like \"B2B\""
                              },
                              "Company URL": {
                                "type": "string",
                                "description": "Link to the company's page on YC"
                              }
                            }
                          }
                        },
                        "Results Page": {
                          "type": "string",
                          "contentMediaType": "image/png",
                          "x-captureArea": "viewport",
                          "x-captureAt": "beforeExtraction"
                        }
                      }
                    }
                  }
                },
                "rename": {
                  "summary": "Rename only",
                  "value": {
                    "name": "YC AI companies, Fall 2025"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robot-drafts/{draftId}\");\nvar request = new RestRequest(Method.PATCH);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nrequest.AddParameter(\"undefined\", \"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\", ParameterType.RequestBody);\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robot-drafts/{draftId}\"\n\n\tpayload := strings.NewReader(\"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\")\n\n\treq, _ := http.NewRequest(\"PATCH\", url, payload)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.patch(\"https://api.browse.ai/v2/robot-drafts/{draftId}\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .body(\"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"PATCH\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robot-drafts/{draftId}\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.write(JSON.stringify({\n  schema: {\n    type: 'object',\n    properties: {\n      'Total Company Count': {\n        type: 'string',\n        description: 'The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\"'\n      },\n      'YC Companies': {\n        type: 'array',\n        description: 'Every company card in the results',\n        maxItems: 50,\n        items: {\n          type: 'object',\n          properties: {\n            'Company Name': {type: 'string'},\n            Description: {type: 'string'},\n            Batch: {type: 'string', description: 'Exactly as displayed, like \"FALL 2025\"'},\n            Industry: {type: 'string', description: 'The first industry tag, like \"B2B\"'},\n            'Company URL': {type: 'string', description: 'Link to the company\\'s page on YC'}\n          }\n        }\n      },\n      'Results Page': {\n        type: 'string',\n        contentMediaType: 'image/png',\n        'x-captureArea': 'viewport',\n        'x-captureAt': 'beforeExtraction'\n      }\n    }\n  }\n}));\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'PATCH',\n  url: 'https://api.browse.ai/v2/robot-drafts/{draftId}',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'},\n  body: {\n    schema: {\n      type: 'object',\n      properties: {\n        'Total Company Count': {\n          type: 'string',\n          description: 'The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\"'\n        },\n        'YC Companies': {\n          type: 'array',\n          description: 'Every company card in the results',\n          maxItems: 50,\n          items: {\n            type: 'object',\n            properties: {\n              'Company Name': {type: 'string'},\n              Description: {type: 'string'},\n              Batch: {type: 'string', description: 'Exactly as displayed, like \"FALL 2025\"'},\n              Industry: {type: 'string', description: 'The first industry tag, like \"B2B\"'},\n              'Company URL': {type: 'string', description: 'Link to the company\\'s page on YC'}\n            }\n          }\n        },\n        'Results Page': {\n          type: 'string',\n          contentMediaType: 'image/png',\n          'x-captureArea': 'viewport',\n          'x-captureAt': 'beforeExtraction'\n        }\n      }\n    }\n  },\n  json: true\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\nNSDictionary *parameters = @{ @\"schema\": @{ @\"type\": @\"object\", @\"properties\": @{ @\"Total Company Count\": @{ @\"type\": @\"string\", @\"description\": @\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\" }, @\"YC Companies\": @{ @\"type\": @\"array\", @\"description\": @\"Every company card in the results\", @\"maxItems\": @50, @\"items\": @{ @\"type\": @\"object\", @\"properties\": @{ @\"Company Name\": @{ @\"type\": @\"string\" }, @\"Description\": @{ @\"type\": @\"string\" }, @\"Batch\": @{ @\"type\": @\"string\", @\"description\": @\"Exactly as displayed, like \\\"FALL 2025\\\"\" }, @\"Industry\": @{ @\"type\": @\"string\", @\"description\": @\"The first industry tag, like \\\"B2B\\\"\" }, @\"Company URL\": @{ @\"type\": @\"string\", @\"description\": @\"Link to the company's page on YC\" } } } }, @\"Results Page\": @{ @\"type\": @\"string\", @\"contentMediaType\": @\"image/png\", @\"x-captureArea\": @\"viewport\", @\"x-captureAt\": @\"beforeExtraction\" } } } };\n\nNSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robot-drafts/{draftId}\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"PATCH\"];\n[request setAllHTTPHeaderFields:headers];\n[request setHTTPBody:postData];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robot-drafts/{draftId}\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"PATCH\",\n  CURLOPT_POSTFIELDS => \"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\npayload = \"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\"\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"PATCH\", \"/v2/robot-drafts/{draftId}\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robot-drafts/{draftId}\"\n\npayload = {\"schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"Total Company Count\": {\n                \"type\": \"string\",\n                \"description\": \"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"\n            },\n            \"YC Companies\": {\n                \"type\": \"array\",\n                \"description\": \"Every company card in the results\",\n                \"maxItems\": 50,\n                \"items\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"Company Name\": {\"type\": \"string\"},\n                        \"Description\": {\"type\": \"string\"},\n                        \"Batch\": {\n                            \"type\": \"string\",\n                            \"description\": \"Exactly as displayed, like \\\"FALL 2025\\\"\"\n                        },\n                        \"Industry\": {\n                            \"type\": \"string\",\n                            \"description\": \"The first industry tag, like \\\"B2B\\\"\"\n                        },\n                        \"Company URL\": {\n                            \"type\": \"string\",\n                            \"description\": \"Link to the company's page on YC\"\n                        }\n                    }\n                }\n            },\n            \"Results Page\": {\n                \"type\": \"string\",\n                \"contentMediaType\": \"image/png\",\n                \"x-captureArea\": \"viewport\",\n                \"x-captureAt\": \"beforeExtraction\"\n            }\n        }\n    }}\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"PATCH\", url, json=payload, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robot-drafts/{draftId}\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Patch.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\nrequest.body = \"{\\\"schema\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Total Company Count\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The number of companies shown with the results, exactly as displayed, like \\\\\\\"148\\\\\\\" or \\\\\\\"1,200+\\\\\\\"\\\"},\\\"YC Companies\\\":{\\\"type\\\":\\\"array\\\",\\\"description\\\":\\\"Every company card in the results\\\",\\\"maxItems\\\":50,\\\"items\\\":{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"Company Name\\\":{\\\"type\\\":\\\"string\\\"},\\\"Description\\\":{\\\"type\\\":\\\"string\\\"},\\\"Batch\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Exactly as displayed, like \\\\\\\"FALL 2025\\\\\\\"\\\"},\\\"Industry\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"The first industry tag, like \\\\\\\"B2B\\\\\\\"\\\"},\\\"Company URL\\\":{\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"Link to the company's page on YC\\\"}}}},\\\"Results Page\\\":{\\\"type\\\":\\\"string\\\",\\\"contentMediaType\\\":\\\"image/png\\\",\\\"x-captureArea\\\":\\\"viewport\\\",\\\"x-captureAt\\\":\\\"beforeExtraction\\\"}}}}\"\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request PATCH \\\n  --url https://api.browse.ai/v2/robot-drafts/{draftId} \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --data '{\"schema\":{\"type\":\"object\",\"properties\":{\"Total Company Count\":{\"type\":\"string\",\"description\":\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"},\"YC Companies\":{\"type\":\"array\",\"description\":\"Every company card in the results\",\"maxItems\":50,\"items\":{\"type\":\"object\",\"properties\":{\"Company Name\":{\"type\":\"string\"},\"Description\":{\"type\":\"string\"},\"Batch\":{\"type\":\"string\",\"description\":\"Exactly as displayed, like \\\"FALL 2025\\\"\"},\"Industry\":{\"type\":\"string\",\"description\":\"The first industry tag, like \\\"B2B\\\"\"},\"Company URL\":{\"type\":\"string\",\"description\":\"Link to the company'\\''s page on YC\"}}}},\"Results Page\":{\"type\":\"string\",\"contentMediaType\":\"image/png\",\"x-captureArea\":\"viewport\",\"x-captureAt\":\"beforeExtraction\"}}}}'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method PATCH \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --body-data '{\"schema\":{\"type\":\"object\",\"properties\":{\"Total Company Count\":{\"type\":\"string\",\"description\":\"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"},\"YC Companies\":{\"type\":\"array\",\"description\":\"Every company card in the results\",\"maxItems\":50,\"items\":{\"type\":\"object\",\"properties\":{\"Company Name\":{\"type\":\"string\"},\"Description\":{\"type\":\"string\"},\"Batch\":{\"type\":\"string\",\"description\":\"Exactly as displayed, like \\\"FALL 2025\\\"\"},\"Industry\":{\"type\":\"string\",\"description\":\"The first industry tag, like \\\"B2B\\\"\"},\"Company URL\":{\"type\":\"string\",\"description\":\"Link to the company'\\''s page on YC\"}}}},\"Results Page\":{\"type\":\"string\",\"contentMediaType\":\"image/png\",\"x-captureArea\":\"viewport\",\"x-captureAt\":\"beforeExtraction\"}}}}' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robot-drafts/{draftId}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\nlet parameters = [\"schema\": [\n    \"type\": \"object\",\n    \"properties\": [\n      \"Total Company Count\": [\n        \"type\": \"string\",\n        \"description\": \"The number of companies shown with the results, exactly as displayed, like \\\"148\\\" or \\\"1,200+\\\"\"\n      ],\n      \"YC Companies\": [\n        \"type\": \"array\",\n        \"description\": \"Every company card in the results\",\n        \"maxItems\": 50,\n        \"items\": [\n          \"type\": \"object\",\n          \"properties\": [\n            \"Company Name\": [\"type\": \"string\"],\n            \"Description\": [\"type\": \"string\"],\n            \"Batch\": [\n              \"type\": \"string\",\n              \"description\": \"Exactly as displayed, like \\\"FALL 2025\\\"\"\n            ],\n            \"Industry\": [\n              \"type\": \"string\",\n              \"description\": \"The first industry tag, like \\\"B2B\\\"\"\n            ],\n            \"Company URL\": [\n              \"type\": \"string\",\n              \"description\": \"Link to the company's page on YC\"\n            ]\n          ]\n        ]\n      ],\n      \"Results Page\": [\n        \"type\": \"string\",\n        \"contentMediaType\": \"image/png\",\n        \"x-captureArea\": \"viewport\",\n        \"x-captureAt\": \"beforeExtraction\"\n      ]\n    ]\n  ]] as [String : Any]\n\nlet postData = JSONSerialization.data(withJSONObject: parameters, options: [])\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robot-drafts/{draftId}\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"PATCH\"\nrequest.allHTTPHeaderFields = headers\nrequest.httpBody = postData as Data\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the updated robot draft.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/updateRobotDraft-200"
                },
                "examples": {
                  "retrainDraft": {
                    "$ref": "#/components/examples/RetrainingDraft",
                    "summary": "Retraining: new preview in progress"
                  },
                  "rename": {
                    "$ref": "#/components/examples/Renamed",
                    "summary": "Renamed, preview kept"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/updateRobotDraft-400"
                },
                "examples": {
                  "invalidBody": {
                    "$ref": "#/components/examples/RobotDraftInvalidBody",
                    "summary": "Invalid request body"
                  },
                  "columnNameTaken": {
                    "$ref": "#/components/examples/ColumnNameTaken",
                    "summary": "Column name taken"
                  },
                  "draftUnchanged": {
                    "$ref": "#/components/examples/DraftUnchanged",
                    "summary": "Nothing to update"
                  },
                  "draftNotEditable": {
                    "$ref": "#/components/examples/DraftNotEditable",
                    "summary": "Draft already saved"
                  },
                  "invalidDraftId": {
                    "$ref": "#/components/examples/InvalidDraftId",
                    "summary": "Invalid draft ID"
                  },
                  "bodyParseError": {
                    "$ref": "#/components/examples/RobotDraftBodyParseError",
                    "summary": "Body not valid JSON"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "The request can not be processed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDraftForbiddenResponse"
                },
                "examples": {
                  "creditsLimitReached": {
                    "$ref": "#/components/examples/RobotDraftCreditsLimitReached",
                    "summary": "Credits limit reached"
                  },
                  "trainingNotOnPlan": {
                    "$ref": "#/components/examples/RobotDraftTrainingNotOnPlan",
                    "summary": "Training not included in the plan"
                  },
                  "trainingAiBudgetExhausted": {
                    "$ref": "#/components/examples/RobotDraftTrainingAiBudgetExhausted",
                    "summary": "AI budget used up"
                  },
                  "websitesLimitReached": {
                    "$ref": "#/components/examples/RobotDraftWebsitesLimitReached",
                    "summary": "Websites limit reached"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No robot draft with this `draftId` is in your workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        },
        "x-badges": [
          {
            "name": "Beta",
            "position": "before",
            "color": "#e9d7fe"
          }
        ]
      }
    },
    "/robot-drafts/{draftId}/save": {
      "post": {
        "tags": [
          "robot drafts"
        ],
        "summary": "Save a robot draft",
        "operationId": "saveRobotDraft",
        "description": "Create the robot, or a new version of the robot being retrained, and start its first task. Only drafts whose `status` is `ready` can be saved.\n\nSaving does not use credits for training. The first task uses task credits like any other task. If there are not enough credits for it, or the workspace has reached its robot or website limit, nothing is created, and you can save again once the cause is fixed.\n\nThe response includes the saved draft, the robot, and the ID of its first task. To extract data from another page on the same site, run this robot with a different `originUrl`.\n",
        "parameters": [
          {
            "in": "path",
            "name": "draftId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "example": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "description": "Unique robot draft ID"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "C#",
            "label": "C#",
            "source": "var client = new RestClient(\"https://api.browse.ai/v2/robot-drafts/{draftId}/save\");\nvar request = new RestRequest(Method.POST);\nrequest.AddHeader(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\");\nIRestResponse response = client.Execute(request);\n"
          },
          {
            "lang": "Go",
            "label": "Go",
            "source": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"https://api.browse.ai/v2/robot-drafts/{draftId}/save\"\n\n\treq, _ := http.NewRequest(\"POST\", url, nil)\n\n\treq.Header.Add(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "HttpResponse<String> response = Unirest.post(\"https://api.browse.ai/v2/robot-drafts/{draftId}/save\")\n  .header(\"Authorization\", \"Bearer YOUR_SECRET_API_KEY\")\n  .asString();\n"
          },
          {
            "lang": "Node",
            "label": "Node (Native)",
            "source": "const http = require(\"https\");\n\nconst options = {\n  \"method\": \"POST\",\n  \"hostname\": \"api.browse.ai\",\n  \"port\": null,\n  \"path\": \"/v2/robot-drafts/{draftId}/save\",\n  \"headers\": {\n    \"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"\n  }\n};\n\nconst req = http.request(options, function (res) {\n  const chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function () {\n    const body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n});\n\nreq.end();\n"
          },
          {
            "lang": "Node",
            "label": "Node (request)",
            "source": "const request = require('request');\n\nconst options = {\n  method: 'POST',\n  url: 'https://api.browse.ai/v2/robot-drafts/{draftId}/save',\n  headers: {Authorization: 'Bearer YOUR_SECRET_API_KEY'}\n};\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n"
          },
          {
            "lang": "Objective-C",
            "label": "Objective-C",
            "source": "#import <Foundation/Foundation.h>\n\nNSDictionary *headers = @{ @\"Authorization\": @\"Bearer YOUR_SECRET_API_KEY\" };\n\nNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@\"https://api.browse.ai/v2/robot-drafts/{draftId}/save\"]\n                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy\n                                                   timeoutInterval:10.0];\n[request setHTTPMethod:@\"POST\"];\n[request setAllHTTPHeaderFields:headers];\n\nNSURLSession *session = [NSURLSession sharedSession];\nNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request\n                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {\n                                                if (error) {\n                                                    NSLog(@\"%@\", error);\n                                                } else {\n                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;\n                                                    NSLog(@\"%@\", httpResponse);\n                                                }\n                                            }];\n[dataTask resume];\n"
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n\n$curl = curl_init();\n\ncurl_setopt_array($curl, [\n  CURLOPT_URL => \"https://api.browse.ai/v2/robot-drafts/{draftId}/save\",\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_ENCODING => \"\",\n  CURLOPT_MAXREDIRS => 10,\n  CURLOPT_TIMEOUT => 30,\n  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n  CURLOPT_CUSTOMREQUEST => \"POST\",\n  CURLOPT_HTTPHEADER => [\n    \"Authorization: Bearer YOUR_SECRET_API_KEY\"\n  ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n  echo \"cURL Error #:\" . $err;\n} else {\n  echo $response;\n}\n"
          },
          {
            "lang": "Python",
            "label": "Python (python3)",
            "source": "import http.client\n\nconn = http.client.HTTPSConnection(\"api.browse.ai\")\n\nheaders = { 'Authorization': \"Bearer YOUR_SECRET_API_KEY\" }\n\nconn.request(\"POST\", \"/v2/robot-drafts/{draftId}/save\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nurl = \"https://api.browse.ai/v2/robot-drafts/{draftId}/save\"\n\nheaders = {\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"}\n\nresponse = requests.request(\"POST\", url, headers=headers)\n\nprint(response.text)\n"
          },
          {
            "lang": "Ruby",
            "label": "Ruby",
            "source": "require 'uri'\nrequire 'net/http'\nrequire 'openssl'\n\nurl = URI(\"https://api.browse.ai/v2/robot-drafts/{draftId}/save\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\nhttp.verify_mode = OpenSSL::SSL::VERIFY_NONE\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Authorization\"] = 'Bearer YOUR_SECRET_API_KEY'\n\nresponse = http.request(request)\nputs response.read_body\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (cURL)",
            "source": "curl --request POST \\\n  --url https://api.browse.ai/v2/robot-drafts/{draftId}/save \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY'\n"
          },
          {
            "lang": "Shell",
            "label": "Shell (wget)",
            "source": "wget --quiet \\\n  --method POST \\\n  --header 'Authorization: Bearer YOUR_SECRET_API_KEY' \\\n  --output-document \\\n  - https://api.browse.ai/v2/robot-drafts/{draftId}/save\n"
          },
          {
            "lang": "Swift",
            "label": "Swift",
            "source": "import Foundation\n\nlet headers = [\"Authorization\": \"Bearer YOUR_SECRET_API_KEY\"]\n\nlet request = NSMutableURLRequest(url: NSURL(string: \"https://api.browse.ai/v2/robot-drafts/{draftId}/save\")! as URL,\n                                        cachePolicy: .useProtocolCachePolicy,\n                                    timeoutInterval: 10.0)\nrequest.httpMethod = \"POST\"\nrequest.allHTTPHeaderFields = headers\n\nlet session = URLSession.shared\nlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in\n  if (error != nil) {\n    print(error)\n  } else {\n    let httpResponse = response as? HTTPURLResponse\n    print(httpResponse)\n  }\n})\n\ndataTask.resume()\n"
          }
        ],
        "responses": {
          "200": {
            "description": "A JSON object containing the saved draft, the robot, and its first task's ID.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/saveRobotDraft-200"
                },
                "examples": {
                  "newRobot": {
                    "$ref": "#/components/examples/NewRobot",
                    "summary": "New robot"
                  },
                  "retrainedRobot": {
                    "$ref": "#/components/examples/RetrainedRobot",
                    "summary": "Retrained robot"
                  }
                }
              }
            }
          },
          "400": {
            "description": "A JSON containing error attributes. This will happen if any of the parameters are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/saveRobotDraft-400"
                },
                "examples": {
                  "notSavableInProgress": {
                    "$ref": "#/components/examples/NotSavableInProgress",
                    "summary": "Preview still in progress"
                  },
                  "notSavablePartiallyReady": {
                    "$ref": "#/components/examples/NotSavablePartiallyReady",
                    "summary": "Preview partially ready"
                  },
                  "notSavableFailed": {
                    "$ref": "#/components/examples/NotSavableFailed",
                    "summary": "Preview failed"
                  },
                  "alreadySaved": {
                    "$ref": "#/components/examples/AlreadySaved",
                    "summary": "Draft already saved"
                  },
                  "robotNotEligibleForRetraining": {
                    "$ref": "#/components/examples/RobotNotEligibleForRetraining",
                    "summary": "Robot not eligible for retraining"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The request is not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            }
          },
          "403": {
            "description": "The request can not be processed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/saveRobotDraft-403"
                },
                "examples": {
                  "creditsLimitReached": {
                    "$ref": "#/components/examples/RobotDraftCreditsLimitReached",
                    "summary": "Credits limit reached"
                  },
                  "robotsLimitReached": {
                    "$ref": "#/components/examples/RobotDraftRobotsLimitReached",
                    "summary": "Robots limit reached"
                  },
                  "websitesLimitReached": {
                    "$ref": "#/components/examples/RobotDraftWebsitesLimitReached",
                    "summary": "Websites limit reached"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No robot draft with this `draftId` is in your workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            }
          },
          "500": {
            "description": "There was an error on the server",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternalServerResponse"
                }
              }
            }
          }
        },
        "x-badges": [
          {
            "name": "Beta",
            "position": "before",
            "color": "#e9d7fe"
          }
        ]
      }
    }
  },
  "webhooks": {
    "taskWebhook": {
      "post": {
        "summary": "Task Finished",
        "tags": [
          "webhooks"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "event",
                  "task"
                ],
                "properties": {
                  "event": {
                    "type": "string",
                    "enum": [
                      "task.finishedSuccessfully",
                      "task.finishedWithError",
                      "task.capturedDataChanged"
                    ],
                    "example": "task.finishedSuccessfully",
                    "description": "The event type that triggered the webhook"
                  },
                  "task": {
                    "$ref": "#/components/schemas/RobotTaskWebhook"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Your webhook URL is called up to three times if the initial attempt fails. Retries occur when the response status is not 200, indicating that your software may be experiencing issues with processing the request. This automatic retry mechanism helps ensure that events are successfully delivered without requiring constant monitoring on your end. Please ensure that the webhook URL is available and correctly configured to respond with a status code of 200. Retries are spaced out to provide sufficient time for any transient issues to resolve.",
            "content": {
              "application/json": {
                "example": {
                  "status": "success"
                }
              }
            }
          }
        }
      }
    },
    "tableExportWebhook": {
      "post": {
        "summary": "Table Export Finished (Beta)",
        "tags": [
          "webhooks",
          "Beta"
        ],
        "description": "This webhook is called when a table export is finished. The exported file can be a CSV, JSON, or zip file.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "exportId",
                  "exportFile",
                  "robotName",
                  "robotId",
                  "exportFinishedAt",
                  "exportCreatedAt"
                ],
                "properties": {
                  "exportId": {
                    "type": "string",
                    "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
                    "description": "The unique ID of the export"
                  },
                  "robotId": {
                    "type": "string",
                    "example": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
                    "description": "The unique ID of the robot"
                  },
                  "filesTemporaryUrl": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "example": [
                      "https://s3.amazonaws.com/some-bucket/your-export.csv"
                    ],
                    "description": "The URLs of the exported files"
                  },
                  "filesTemporaryUrlExpiresAt": {
                    "type": "number",
                    "format": "timestamp",
                    "example": 1678795867879,
                    "description": "The unix timestamp of when the file URL expires in milliseconds"
                  },
                  "exportFinishedAt": {
                    "type": "number",
                    "format": "timestamp",
                    "example": 1678795867879,
                    "description": "The unix timestamp of when the export was finished in milliseconds"
                  },
                  "exportCreatedAt": {
                    "type": "number",
                    "format": "timestamp",
                    "example": 1678795867879,
                    "description": "The unix timestamp of when the export was created in milliseconds"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Your webhook URL is called up to three times if the initial attempt fails. Retries occur when the response status is not 200, indicating that your software may be experiencing issues with processing the request. This automatic retry mechanism helps ensure that events are successfully delivered without requiring constant monitoring on your end. Please ensure that the webhook URL is available and correctly configured to respond with a status code of 200. Retries are spaced out to provide sufficient time for any transient issues to resolve.",
            "content": {
              "application/json": {
                "example": {
                  "status": "success"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Your Browse AI API key, sent as a Bearer token. [Generate an API key](https://dashboard.browse.ai/api).\n"
      }
    },
    "schemas": {
      "getSystemStatus-200": {
        "type": "object",
        "required": [
          "tasksQueueStatus"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "tasksQueueStatus": {
            "type": "string",
            "enum": [
              "OK",
              "UNDER_MAINTENANCE"
            ],
            "example": "OK"
          }
        }
      },
      "Team": {
        "type": "object",
        "required": [
          "id",
          "api",
          "createdAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "b04eaafa-00c2-41a2-9c6a-7f7d32805a91",
            "description": "Unique team ID"
          },
          "name": {
            "type": "string",
            "nullable": true,
            "example": "Browse AI team",
            "description": "Team name"
          },
          "api": {
            "type": "boolean",
            "example": true,
            "description": "API accessibility"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Team creation date and time in the form of a Unix timestamp"
          }
        }
      },
      "getUserTeams-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "teams"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "teams": {
            "type": "object",
            "required": [
              "totalCount",
              "items"
            ],
            "properties": {
              "totalCount": {
                "type": "integer",
                "example": 20,
                "description": "Total number of Team this user has."
              },
              "items": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Team"
                }
              }
            }
          }
        }
      },
      "UnauthorizedResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              401
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "unauthorized",
              "no_api_access"
            ],
            "example": "unauthorized"
          }
        }
      },
      "CommonParameterPart": {
        "type": "object",
        "required": [
          "name",
          "label"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Parameter type"
          },
          "name": {
            "type": "string",
            "example": "originUrl",
            "description": "Parameter name"
          },
          "label": {
            "type": "string",
            "example": "Origin URL",
            "description": "Parameter title"
          },
          "required": {
            "type": "boolean",
            "example": false,
            "description": "Whether a parameter is required or not"
          }
        }
      },
      "TextParameter": {
        "title": "Text Parameter",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonParameterPart"
          },
          {
            "type": "object",
            "required": [
              "defaultValue",
              "encrypted"
            ],
            "properties": {
              "encrypted": {
                "type": "boolean",
                "example": false,
                "description": "Whether parameter value and defaultValue are encrypted"
              },
              "defaultValue": {
                "type": "string",
                "example": "https://www.espressozone.com/espresso-machines/semi-automatic-espresso-machines",
                "description": "Parameter default value that will be used as a fallback if you do not specify a parameter's value when running a robot. If `encrypted` is `true`, this will appear as an arbitrary string like `******`. Parameter default values can be updated on robot Settings page on your dashboard.\n"
              }
            },
            "value": {
              "type": "string",
              "nullable": true,
              "example": null,
              "description": "Parameter value specified when running robot. If `encrypted` is `true`, this will appear as an arbitrary string like `******`. type:\n  type: string\n  enum: [\"text\"]\n  example: \"text\"\n  description: Parameter type\npattern:\n  type: string\n  description: Parameter Pattern\n"
            }
          }
        ]
      },
      "NumberParameter": {
        "title": "Numeric Parameter",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonParameterPart"
          },
          {
            "type": "object",
            "required": [
              "type",
              "name",
              "label",
              "defaultValue"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "number"
                ],
                "example": "number",
                "description": "Parameter type"
              },
              "name": {
                "type": "string",
                "example": "limit",
                "description": "Parameter name"
              },
              "label": {
                "type": "string",
                "example": "Limit",
                "description": "Parameter title"
              },
              "defaultValue": {
                "type": "number",
                "example": 10,
                "description": "Parameter default value that will be used if you do not specify a parameter's value when running a robot."
              },
              "value": {
                "type": "number",
                "nullable": true,
                "example": null,
                "description": "Parameter value specified when running robot."
              },
              "min": {
                "type": "number",
                "nullable": true,
                "example": 0,
                "description": "Minimum value this parameter accepts"
              },
              "max": {
                "type": "number",
                "nullable": true,
                "example": 200,
                "description": "Maximum value this parameter accepts"
              }
            }
          }
        ]
      },
      "URLParameter": {
        "title": "URL Parameter",
        "allOf": [
          {
            "$ref": "#/components/schemas/TextParameter"
          },
          {
            "type": "object",
            "required": [
              "type",
              "encrypted"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "url"
                ],
                "example": "url",
                "description": "Parameter type"
              },
              "encrypted": {
                "type": "boolean",
                "example": false,
                "description": "Whether parameter value and defaultValue are encrypted"
              }
            }
          }
        ]
      },
      "SelectParameterOption": {
        "type": "object",
        "required": [
          "label",
          "value"
        ],
        "properties": {
          "label": {
            "type": "string",
            "example": "Option 1",
            "description": "The label for the select option"
          },
          "value": {
            "type": "string",
            "example": "option1",
            "description": "The value for the select option"
          }
        }
      },
      "SelectParameter": {
        "title": "Select Parameter",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonParameterPart"
          },
          {
            "type": "object",
            "required": [
              "type",
              "name",
              "label",
              "defaultValue",
              "options"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "select"
                ],
                "example": "select",
                "description": "Parameter type"
              },
              "name": {
                "type": "string",
                "example": "choice",
                "description": "Parameter name"
              },
              "label": {
                "type": "string",
                "example": "Choice",
                "description": "Parameter title"
              },
              "defaultValue": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "example": [
                  "option_1",
                  "option_2"
                ],
                "description": "Parameter default value that will be used as a fallback if you do not specify a parameter's value when running a robot.\nIt should be an array of string values. Each string value should be one of the `value` or `label` of the `options` array. For each string value, if there is a matching `value` in the `options` array, it will be used as the default value. Otherwise, it looks for the `label` in the `options` and uses the `value` of the option with that `label`. If no matching `value` or `label` is found, it throws an error.\n"
              },
              "value": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "example": [
                  "option_1",
                  "option_2"
                ],
                "description": "Parameter value specified when running robot.\nIf it is specified, it should be an array of string values. Each string value should be one of the `value` or `label` of the `options` array. For each string value, if there is a matching `value` in the `options` array, it will be used as the default value. Otherwise, it looks for the `label` in the `options` and uses the `value` of the option with that `label`. If no matching `value` or `label` is found, it throws an error.\n"
              },
              "options": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SelectParameterOption"
                },
                "example": [
                  {
                    "label": "Option 1 label",
                    "value": "option_1"
                  },
                  {
                    "label": "Option 2 label",
                    "value": "option_2"
                  }
                ],
                "description": "Available options for the select parameter"
              }
            }
          }
        ]
      },
      "RobotInputParameters": {
        "type": "array",
        "items": {
          "oneOf": [
            {
              "$ref": "#/components/schemas/TextParameter"
            },
            {
              "$ref": "#/components/schemas/NumberParameter"
            },
            {
              "$ref": "#/components/schemas/URLParameter"
            },
            {
              "$ref": "#/components/schemas/SelectParameter"
            }
          ]
        }
      },
      "Robot": {
        "type": "object",
        "required": [
          "id",
          "createdAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "description": "Unique robot ID"
          },
          "name": {
            "type": "string",
            "example": "Extract data from Realtor.com",
            "description": "Robot name"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Robot creation date and time in the form of a Unix timestamp"
          },
          "inputParameters": {
            "$ref": "#/components/schemas/RobotInputParameters"
          }
        }
      },
      "getRobots-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "robots"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "robots": {
            "type": "object",
            "required": [
              "totalCount",
              "items"
            ],
            "properties": {
              "totalCount": {
                "type": "integer",
                "example": 20,
                "description": "Total number of robots this team has."
              },
              "items": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Robot"
                }
              }
            }
          }
        }
      },
      "getRobot-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "robot"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "robot": {
            "$ref": "#/components/schemas/Robot"
          }
        }
      },
      "getRobot-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "invalid_robot_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "NotFoundResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              404
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "not_found"
            ]
          }
        }
      },
      "InternalServerResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              500
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "internal_server_error"
            ]
          }
        }
      },
      "RobotCookie": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the cookie.",
            "example": "ACCOUNT_CHOOSER"
          },
          "value": {
            "type": "string",
            "description": "The value of the cookie.",
            "example": 12341234
          },
          "domain": {
            "type": "string",
            "description": "The domain associated with the cookie. Specifies the domains to which the cookie should be sent.",
            "example": ".example.com"
          },
          "expirationDate": {
            "type": "number",
            "format": "int64",
            "description": "The expiration date of the cookie in seconds since the UNIX epoch (e.g., POSIX time). If not provided, the cookie will be treated as a session cookie.",
            "example": 1723659417
          },
          "path": {
            "type": "string",
            "description": "The URL path to which the cookie should be sent. If not provided, it defaults to the current path of the document location.",
            "example": "/products/"
          },
          "secure": {
            "type": "boolean",
            "description": "Indicates whether the cookie should only be sent over secure (HTTPS) connections. If true, the cookie will not be sent over unencrypted HTTP connections.",
            "example": true
          },
          "httpOnly": {
            "type": "boolean",
            "description": "If true, the cookie is accessible only through the HTTP(S) protocol and cannot be accessed through JavaScript or other client-side scripts.",
            "example": true
          },
          "hostOnly": {
            "type": "boolean",
            "description": "If true, the cookie is only sent to the exact domain specified in the \"domain\" property. If false, the cookie is sent to subdomains as well, provided that the \"domain\" property allows it.",
            "example": true
          }
        },
        "required": [
          "name",
          "value"
        ]
      },
      "upsertRobotCookies-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "cookies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RobotCookie"
            }
          }
        }
      },
      "CookieError": {
        "type": "object",
        "required": [
          "summary",
          "fields"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the cookie",
            "example": "ACCOUNT_CHOOSER"
          },
          "summary": {
            "type": "string",
            "description": "Summary of the error",
            "example": "Errors found in existing cookie fields"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string",
                  "description": "Field name with the error",
                  "example": "value"
                },
                "message": {
                  "type": "string",
                  "description": "Error message for the field",
                  "example": "Required"
                }
              }
            }
          }
        }
      },
      "upsertRobotCookies-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request",
              "body_parse_error"
            ],
            "example": "bad_request"
          },
          "errors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CookieError"
            }
          }
        }
      },
      "InputParameters": {
        "type": "object",
        "description": "An object of input parameters to override default input parameters.",
        "example": {
          "originUrl": "https://www.ycombinator.com/companies/airbnb",
          "companies_skip": 0,
          "companies_limit": 10
        },
        "additionalProperties": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        }
      },
      "CapturedTexts": {
        "type": "object",
        "description": "Captured texts",
        "example": {
          "Product Name": "Alexis",
          "Width": "15",
          "Pattern Repeat": "PATTERN REPEAT",
          "Construction": "Hand woven",
          "Fiber": "100% Wool",
          "Color": null,
          "Main Image": "https://isteam.wsimg.com/ip/e31f7bba-252b-4669-9209-639d1c00765d/ols/258_original"
        },
        "additionalProperties": {
          "oneOf": [
            {
              "type": "string",
              "nullable": true
            },
            {
              "type": "number",
              "nullable": true
            },
            {
              "type": "boolean",
              "nullable": true
            }
          ]
        }
      },
      "CapturedScreenshots": {
        "type": "object",
        "description": "All screenshots captured in this task.",
        "example": {
          "top-ads": {
            "id": "b4d132f3-12d9-4770-ac7d-88e481fc5b47",
            "name": "Top ads",
            "src": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "width": 600,
            "height": 120,
            "x": 201,
            "y": 142,
            "deviceScaleFactor": 1.2,
            "full": "page",
            "comparedToScreenshotId": "29d742c2-6f45-4f29-9d48-ba6fe66e6e3d",
            "diffImageSrc": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "changePercentage": 20,
            "diffThreshold": 5,
            "fileRemovedAt": 1678795867879
          }
        },
        "additionalProperties": {
          "type": "object",
          "required": [
            "id",
            "src",
            "width",
            "height",
            "x",
            "y",
            "deviceScaleFactor",
            "changePercentage",
            "diffThreshold"
          ],
          "properties": {
            "id": {
              "type": "string",
              "example": "b4d132f3-12d9-4770-ac7d-88e481fc5b47",
              "description": "Unique screenshot ID"
            },
            "name": {
              "type": "string",
              "nullable": true,
              "example": "Top ads",
              "description": "Screenshot name"
            },
            "src": {
              "type": "string",
              "example": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
              "description": "Screenshot image link"
            },
            "width": {
              "type": "number",
              "example": 600,
              "minimum": 0,
              "description": "Screenshot rectangle width in pixels"
            },
            "height": {
              "type": "number",
              "example": 120,
              "minimum": 0,
              "description": "Screenshot rectangle height in pixels"
            },
            "x": {
              "type": "number",
              "example": 201,
              "description": "Screenshot rectangle distance from the left edge of the page in pixels"
            },
            "y": {
              "type": "number",
              "example": 142,
              "description": "Screenshot rectangle distance from the top edge of the page in pixels"
            },
            "deviceScaleFactor": {
              "type": "number",
              "example": 1.2,
              "description": "Device scale factor when screenshot was taken"
            },
            "full": {
              "type": "string",
              "nullable": true,
              "example": "page",
              "description": "Whether this is a full *page* screenshot, a *viewport* screenshot, or a different type of screenshot.\n\n`null` means it is either an HTML element screenshot or a particular rectangle (x, y, w, h) screenshot.\n"
            },
            "comparedToScreenshotId": {
              "type": "string",
              "nullable": true,
              "example": "29d742c2-6f45-4f29-9d48-ba6fe66e6e3d",
              "description": "If screenshot was taken in a monitoring check, this is the ID of the screenshot it was compared to."
            },
            "diffImageSrc": {
              "type": "string",
              "nullable": true,
              "example": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png",
              "description": "A transparent PNG highlighting changes compared to previous screenshot in red"
            },
            "changePercentage": {
              "type": "number",
              "example": 20,
              "minimum": 0,
              "description": "How much screenshot changed compared to previous screenshot"
            },
            "diffThreshold": {
              "type": "integer",
              "example": 5,
              "minimum": 0,
              "description": "The change percentage threshold above which the user would be notified of the change, based on monitor settings."
            },
            "fileRemovedAt": {
              "type": "integer",
              "nullable": true,
              "example": 1678795867879,
              "description": "After your account's data retention period, screenshots get removed and  this field will be screenshot removal date and time in the form of a Unix timestamp.\n"
            }
          }
        }
      },
      "CapturedLists": {
        "type": "object",
        "description": "All lists captured in this task.",
        "example": {
          "companies": [
            {
              "Position": "1",
              "name": "Airbnb",
              "location": "San Francisco, CA, USA",
              "description": "Book accommodations around the world."
            },
            {
              "Position": "2",
              "name": "Coin base",
              "location": "San Francisco, CA, USA",
              "description": "Buy, sell, and manage crypto currencies."
            },
            {
              "Position": "3",
              "name": "DoorDash",
              "location": "San Francisco, CA, USA",
              "description": "Restaurant delivery."
            }
          ]
        },
        "additionalProperties": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CapturedTexts"
          }
        }
      },
      "RobotTask": {
        "type": "object",
        "required": [
          "id",
          "inputParameters",
          "robotId",
          "createdAt",
          "runByAPI",
          "triedRecordingVideo",
          "capturedTexts",
          "capturedScreenshots",
          "capturedLists"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "description": "Unique task ID"
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters"
          },
          "robotId": {
            "type": "string",
            "example": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "description": "Unique robot ID"
          },
          "status": {
            "type": "string",
            "enum": [
              "failed",
              "successful",
              "in-progress"
            ],
            "example": "successful",
            "description": "task status"
          },
          "runByUserId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "User ID who ran the robot on the dashboard"
          },
          "robotBulkRunId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Robot bulk run ID associated with this task"
          },
          "runByTaskMonitorId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Monitor ID that ran this check"
          },
          "runByAPI": {
            "type": "boolean",
            "example": true,
            "description": "Whether the robot was ran through the API"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Task creation date and time in the form of a Unix timestamp. If the task was retried automatically, this is when its last retry was created, so it can be later than when the task was run.\n"
          },
          "startedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Task start date and time in the form of a Unix timestamp. If the task was retried automatically, this is when its last retry started.\n"
          },
          "finishedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Task finish date and time in the form of a Unix timestamp.\n\nIf `null`, it means robot is still running and capturing data.\n\nTasks time out with an error if they are not finished within 15 minutes (or the maximum duration allowed on your plan).\n"
          },
          "userFriendlyError": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "If task fails, a user-friendly error will be provided here."
          },
          "triedRecordingVideo": {
            "type": "boolean",
            "example": true,
            "description": "Whether the robot tried to record a video while performing this task.\n\nYou can change a robot's video recording setting on its Settings page. \n\nRobots try to record a video when a task is failed and auto-retried as well.\n"
          },
          "videoUrl": {
            "type": "string",
            "nullable": true,
            "example": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/system-1620230966-b1a9688b-05d3-4682-beeb-9ce035e482b1.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "description": "If a video was recorded for this task, this is the link to the video."
          },
          "videoRemovedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "After your account's data retention period, task videos get removed and  this field will be video removal date and time in the form of a Unix timestamp.\n"
          },
          "capturedDataRemovedAt": {
            "type": "integer",
            "nullable": true,
            "example": null,
            "description": "After your workspace's data retention period, captured texts and lists may be removed. If they are, this field holds the removal time in the form of a Unix timestamp; until then it is null.\n"
          },
          "retriedOriginalTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "retriedTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "retriedByTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "capturedDataTemporaryUrl": {
            "type": "string",
            "nullable": true,
            "example": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/system-1620230966-b1a9688b-05d3-4682-beeb-9ce035e482b1.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "description": "If your task's captured data exceeds 100KB, the data will be only accessible through this link. There's a 7 days expiration time for this link (you need to call this API again to get a new link if it expires)."
          },
          "capturedTexts": {
            "$ref": "#/components/schemas/CapturedTexts"
          },
          "capturedScreenshots": {
            "$ref": "#/components/schemas/CapturedScreenshots"
          },
          "capturedLists": {
            "$ref": "#/components/schemas/CapturedLists"
          }
        }
      },
      "getRobotTasks-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "type": "object",
            "required": [
              "robotTasks"
            ],
            "properties": {
              "robotTasks": {
                "type": "object",
                "required": [
                  "totalCount",
                  "pageNumber",
                  "hasMore",
                  "items"
                ],
                "properties": {
                  "totalCount": {
                    "type": "integer",
                    "example": 20,
                    "description": "Total number of tasks this robot has."
                  },
                  "pageNumber": {
                    "type": "integer",
                    "example": 1,
                    "description": "Current page number."
                  },
                  "hasMore": {
                    "type": "boolean",
                    "example": true,
                    "description": "Whether there are more tasks on the next page."
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/RobotTask"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "getRobotTasks-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request",
              "invalid_from_date",
              "invalid_to_date"
            ],
            "example": "invalid_robot_id"
          }
        }
      },
      "NewRobotTaskBodyParams": {
        "type": "object",
        "properties": {
          "recordVideo": {
            "type": "boolean",
            "example": false,
            "description": "Try to record a video while running the task. This is not guaranteed to work as the robot might skip video recording if the site is too heavy.",
            "minLength": 1,
            "maxLength": 200,
            "required": false
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters"
          }
        }
      },
      "newRobotTask-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/RobotTask"
          }
        }
      },
      "newRobotTask-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "body_parse_error",
              "invalid_robot_id",
              "invalid_input_parameters"
            ],
            "example": "bad_request"
          }
        }
      },
      "CreditsLimitReachedResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "credits_limit_reached"
            ]
          }
        }
      },
      "RobotUnderMaintenanceResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              503
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "robot_under_maintenance"
            ]
          }
        }
      },
      "getRobotTask-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/RobotTask"
          }
        }
      },
      "getRobotTask-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "invalid_robot_id",
              "invalid_task_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "Schedules": {
        "type": "array",
        "description": "Array of schedules.\n",
        "deprecated": true,
        "items": {
          "type": "object",
          "title": "Fixed interval schedule",
          "required": [
            "type",
            "everyMinutes"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "FIXED_INTERVAL"
              ],
              "example": "FIXED_INTERVAL",
              "description": "Schedule type"
            },
            "everyMinutes": {
              "type": "number",
              "example": 60,
              "description": "Schedule interval in minutes"
            }
          }
        },
        "example": [
          {
            "type": "FIXED_INTERVAL",
            "everyMinutes": 60
          }
        ]
      },
      "Schedule": {
        "type": "string",
        "description": "recurring schedule.\n",
        "example": "FREQ=HOURLY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR"
      },
      "Monitor": {
        "type": "object",
        "required": [
          "id",
          "name",
          "status",
          "pausedReason",
          "inputParameters",
          "notifyOnCapturedScreenshotChange",
          "notifyOnCapturedTextChange",
          "capturedScreenshotNotificationThreshold",
          "createdAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "description": "Unique robot monitor ID"
          },
          "name": {
            "type": "string",
            "example": "Monitor Products",
            "description": "Monitor name"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused"
            ],
            "example": "active",
            "description": "Represents the current state of the monitor. 'active' indicates that the monitor is currently operational and performing its intended functions, while 'paused' signifies that the monitor's activities are temporarily suspended. The 'paused' state may be due to reasons specified in the 'pausedReason' attribute."
          },
          "pausedReason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "lowCredits",
              "tooManyFailures",
              "userRequested",
              "userInactivity"
            ],
            "example": null,
            "description": "Specifies the reason why the monitor is in a paused state."
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters"
          },
          "schedules": {
            "$ref": "#/components/schemas/Schedules"
          },
          "schedule": {
            "$ref": "#/components/schemas/Schedule"
          },
          "notifyOnCapturedScreenshotChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured screenshots."
          },
          "notifyOnCapturedTextChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured texts."
          },
          "capturedScreenshotNotificationThreshold": {
            "type": "number",
            "example": 15,
            "description": "The \"screenshot changed\" email notification will be sent to you if the change is greater than this threshold (in percent)."
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Monitor creation date and time in the form of a Unix timestamp."
          },
          "pausedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Monitor pause date and time in the form of a Unix timestamp."
          },
          "updatedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Monitor last update date and time in the form of a Unix timestamp."
          }
        }
      },
      "getMonitors-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "monitors"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "monitors": {
            "type": "object",
            "required": [
              "totalCount",
              "items"
            ],
            "properties": {
              "totalCount": {
                "type": "number",
                "example": 10,
                "description": "Total number of monitors this robot has"
              },
              "items": {
                "type": "array",
                "description": "Array of all monitors",
                "items": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          }
        }
      },
      "getMonitors-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request"
            ],
            "example": "bad_request"
          }
        }
      },
      "CreateNewMonitorRequestBody": {
        "type": "object",
        "required": [
          "name",
          "inputParameters",
          "notifyOnCapturedScreenshotChange",
          "notifyOnCapturedTextChange",
          "capturedScreenshotNotificationThreshold"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "Monitor Products",
            "description": "Monitor name",
            "minLength": 1,
            "maxLength": 200
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters",
            "description": "An object of input parameters to override default input parameters."
          },
          "schedules": {
            "$ref": "#/components/schemas/Schedules"
          },
          "schedule": {
            "$ref": "#/components/schemas/Schedule"
          },
          "notifyOnCapturedScreenshotChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured screenshots."
          },
          "notifyOnCapturedTextChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured texts."
          },
          "capturedScreenshotNotificationThreshold": {
            "type": "number",
            "example": 15,
            "description": "The \"screenshot changed\" email notification will be sent to you if the change is greater than this threshold (in percent)."
          }
        }
      },
      "createNewMonitor-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "monitor"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "monitor": {
            "$ref": "#/components/schemas/Monitor"
          }
        }
      },
      "CreateOrUpdateMonitorBadRequestResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request",
              "body_parse_error",
              "invalid_name",
              "invalid_status",
              "invalid_input_parameters",
              "invalid_notifyOnCapturedScreenshotChange",
              "invalid_notifyOnCapturedTextChange",
              "invalid_capturedScreenshotNotificationThreshold",
              "invalid_schedules",
              "invalid_schedule",
              "invalid_monitor_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "CreateOrUpdateMonitorForbiddenResponse": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "schedule_interval_below_minimum"
            ],
            "example": "schedule_interval_below_minimum"
          }
        }
      },
      "getMonitor-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "monitor"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "monitor": {
            "$ref": "#/components/schemas/Monitor"
          }
        }
      },
      "getMonitor-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request",
              "invalid_monitor_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "deleteMonitor-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          }
        }
      },
      "deleteMonitor-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "invalid_monitor_id"
            ],
            "example": "invalid_robot_id"
          }
        }
      },
      "MonitorUpdateBodyParams": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "example": "Monitor Products",
            "description": "Monitor name",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused"
            ],
            "example": "active",
            "description": "If set to `paused`, the monitor will stop working until an `active` status is sent.",
            "nullable": true
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters",
            "nullable": true
          },
          "schedules": {
            "$ref": "#/components/schemas/Schedules"
          },
          "schedule": {
            "$ref": "#/components/schemas/Schedule"
          },
          "notifyOnCapturedScreenshotChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured screenshots.",
            "nullable": true
          },
          "notifyOnCapturedTextChange": {
            "type": "boolean",
            "example": true,
            "description": "If set to `true`, an email notification will be sent to you when a change is detected in captured texts.",
            "nullable": true
          },
          "capturedScreenshotNotificationThreshold": {
            "type": "number",
            "example": 15,
            "description": "The \"screenshot changed\" email notification will be sent to you if the change is greater than this threshold (in percent).",
            "nullable": true
          }
        }
      },
      "updateMonitor-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "monitor"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "monitor": {
            "$ref": "#/components/schemas/Monitor"
          }
        }
      },
      "BulkRun": {
        "type": "object",
        "required": [
          "id",
          "tasksCount",
          "robotId",
          "createdAt",
          "status",
          "successfulTasks",
          "failedTasks"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "description": "Unique bulk run ID"
          },
          "title": {
            "type": "string",
            "nullable": true,
            "example": "Bulk Run Title",
            "description": "An optional string that describes the bulk run.",
            "minLength": 1,
            "maxLength": 200
          },
          "status": {
            "type": "string",
            "enum": [
              "in-progress",
              "finished",
              "paused",
              "stopped"
            ],
            "example": "in-progress",
            "description": "The status of the bulk run."
          },
          "tasksCount": {
            "type": "integer",
            "example": 10,
            "description": "Total number of tasks under this bulk run."
          },
          "successfulTasks": {
            "type": "integer",
            "example": 8,
            "description": "Number of successfully finished tasks under this bulk run."
          },
          "failedTasks": {
            "type": "integer",
            "example": 0,
            "description": "Number of failed tasks under this bulk run."
          },
          "robotId": {
            "type": "string",
            "example": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "description": "Unique robot ID"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Bulk run creation date and time in the form of a Unix timestamp."
          }
        }
      },
      "BulkRuns": {
        "type": "object",
        "required": [
          "totalCount",
          "pageNumber",
          "hasMore",
          "items"
        ],
        "properties": {
          "totalCount": {
            "type": "integer",
            "example": 20,
            "description": "Total number of bulk runs a robot has had."
          },
          "pageNumber": {
            "type": "integer",
            "example": 1,
            "description": "Current page number."
          },
          "hasMore": {
            "type": "boolean",
            "example": true,
            "description": "Whether there are more bulk runs on the next page."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkRun"
            }
          }
        }
      },
      "getBulkRuns-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "$ref": "#/components/schemas/BulkRuns"
          }
        }
      },
      "getBulkRuns-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "invalid_robot_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "ArrayOfUserInputParameters": {
        "type": "array",
        "description": "An array of input parameters to override the task's default input parameters.",
        "example": [
          {
            "originUrl": "https://www.ycombinator.com/companies/airbnb",
            "companies_skip": 0,
            "companies_limit": 10
          },
          {
            "originUrl": "https://www.ycombinator.com/companies/coinbase",
            "companies_skip": 0,
            "companies_limit": 20
          }
        ],
        "items": {
          "$ref": "#/components/schemas/InputParameters"
        }
      },
      "BulkRunBodyParams": {
        "type": "object",
        "required": [
          "inputParameters"
        ],
        "properties": {
          "title": {
            "type": "string",
            "example": "Bulk Run Title",
            "description": "A string that describes the bulk run.",
            "minLength": 1,
            "maxLength": 200,
            "required": false
          },
          "inputParameters": {
            "$ref": "#/components/schemas/ArrayOfUserInputParameters"
          }
        }
      },
      "newBulkRun-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "type": "object",
            "properties": {
              "bulkRun": {
                "$ref": "#/components/schemas/BulkRun"
              }
            }
          }
        }
      },
      "newBulkRun-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "body_parse_error",
              "invalid_robot_id",
              "invalid_input_parameters",
              "zero_length_parameters"
            ],
            "example": "bad_request"
          }
        }
      },
      "newBulkRun-403": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "credits_limit_reached",
              "exceeded_bulk_run_threshold"
            ],
            "example": "exceeded_bulk_run_threshold"
          }
        }
      },
      "RobotTasks": {
        "type": "object",
        "description": "A paginated list of tasks.",
        "required": [
          "totalCount",
          "pageNumber",
          "hasMore",
          "items"
        ],
        "properties": {
          "totalCount": {
            "type": "integer",
            "example": 20,
            "description": "Total number of tasks."
          },
          "pageNumber": {
            "type": "integer",
            "example": 1,
            "description": "Current page number."
          },
          "hasMore": {
            "type": "boolean",
            "example": true,
            "description": "Whether there are more tasks on the next page."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RobotTask"
            }
          }
        }
      },
      "getBulkRun-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "type": "object",
            "required": [
              "bulkRun",
              "robotTasks"
            ],
            "properties": {
              "bulkRun": {
                "$ref": "#/components/schemas/BulkRun"
              },
              "robotTasks": {
                "$ref": "#/components/schemas/RobotTasks"
              }
            }
          }
        }
      },
      "getBulkRun-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request",
              "invalid_robot_id"
            ],
            "example": "bad_request"
          }
        }
      },
      "Webhook": {
        "type": "object",
        "required": [
          "id",
          "url",
          "webhookEvent",
          "createdAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "6d7f1218-43fb-4735-ac71-21e81b1ab23e",
            "description": "Unique webhook ID"
          },
          "url": {
            "type": "string",
            "example": "https://example.com/v2/webhooks/callback/events",
            "description": "Webhook URL"
          },
          "webhookEvent": {
            "type": "string",
            "enum": [
              "taskCapturedDataChanged",
              "taskFinished",
              "taskFinishedSuccessfully",
              "taskFinishedWithError",
              "tableExportFinishedSuccessfully"
            ],
            "example": "taskFinished"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Monitor creation date and time in the form of a Unix timestamp."
          }
        }
      },
      "getWebhooks-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "webhooks"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "webhooks": {
            "type": "object",
            "required": [
              "totalCount",
              "items"
            ],
            "properties": {
              "totalCount": {
                "type": "number",
                "example": 10,
                "description": "Total number of webhooks this robot has"
              },
              "items": {
                "type": "array",
                "description": "Array of all webhooks",
                "items": {
                  "$ref": "#/components/schemas/Webhook"
                }
              }
            }
          }
        }
      },
      "getWebhooks-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request"
            ],
            "example": "bad_request"
          }
        }
      },
      "CreateNewWebhookBodyParams": {
        "type": "object",
        "required": [
          "hookUrl",
          "eventType"
        ],
        "properties": {
          "hookUrl": {
            "type": "string",
            "example": "https://example.com/v2/webhooks/callback/events",
            "description": "Webhook URL"
          },
          "eventType": {
            "type": "string",
            "enum": [
              "taskCapturedDataChanged",
              "taskFinished",
              "taskFinishedSuccessfully",
              "taskFinishedWithError",
              "tableExportFinishedSuccessfully"
            ],
            "example": "taskFinished"
          }
        }
      },
      "createNewWebhook-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "webhook"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "webhook": {
            "$ref": "#/components/schemas/Webhook"
          }
        }
      },
      "createNewWebhook-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "bad_request",
              "body_parse_error",
              "invalid_hookUrl",
              "invalid_eventType"
            ],
            "example": "bad_request"
          }
        }
      },
      "deleteWebhook-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          }
        }
      },
      "deleteWebhook-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_robot_id",
              "invalid_webhook_id",
              "bad_request"
            ],
            "example": "invalid_robot_id"
          }
        }
      },
      "RobotDraftStatus": {
        "type": "string",
        "enum": [
          "in_progress",
          "ready",
          "partially_ready",
          "failed",
          "saved"
        ],
        "example": "ready",
        "description": "Status of a robot draft and its preview.\n\n- `in_progress`: The preview is being generated. Creating a draft, or updating its `originUrl`, `instructions`, or `schema`, starts a preview right away.\n- `ready`: The preview finished, and every column either has data or, on retrain, keeps the robot's existing extraction. The draft can be saved.\n- `partially_ready`: The preview finished, but some columns were not found. The draft cannot be saved. Change the schema or instructions to run a new preview.\n- `failed`: The preview failed, or the draft has no preview, for example a draft created in the app that never ran one. See `userFriendlyError`. The draft cannot be saved. You can run the preview again with an update request.\n- `saved`: The draft was saved and `robotId` points to the robot it created or updated.\n\nTask statuses use `in-progress` instead; robot drafts follow the snake_case of their other values.\n"
      },
      "RobotDraftCountry": {
        "type": "string",
        "pattern": "^[A-Z]{3}$",
        "example": "USA",
        "description": "The country the robot browses the site from, as a 3-letter ISO 3166-1 alpha-3 code in uppercase. Use it for sites that show different content in different countries. The preview runs from this country, and saving the draft makes it the robot's location.\n"
      },
      "RobotDraftTextProperty": {
        "title": "Text column",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "string"
            ],
            "example": "string"
          },
          "description": {
            "type": "string",
            "maxLength": 2000,
            "example": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\"",
            "description": "Instructions for this column, for example what to pick or how to format it. At least 2 words. An empty string means no description.\n"
          }
        }
      },
      "RobotDraftScreenshotProperty": {
        "title": "Screenshot column",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "contentMediaType"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "string"
            ],
            "example": "string"
          },
          "contentMediaType": {
            "type": "string",
            "enum": [
              "image/png"
            ],
            "example": "image/png",
            "description": "Makes this column a screenshot. Its value in `latestPreview.data` is the screenshot's URL, which expires after 7 days. Screenshot columns do not accept a `description`.\n"
          },
          "x-captureArea": {
            "type": "string",
            "enum": [
              "viewport",
              "fullPage"
            ],
            "default": "viewport",
            "example": "viewport",
            "description": "Capture only the visible part of the page (`viewport`) or the full page (`fullPage`)."
          },
          "x-captureAt": {
            "type": "string",
            "enum": [
              "beforeExtraction",
              "afterExtraction"
            ],
            "default": "beforeExtraction",
            "example": "beforeExtraction",
            "description": "Take the screenshot before or after the robot extracts the page's data."
          }
        }
      },
      "RobotDraftListProperty": {
        "title": "List column",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "items"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "array"
            ],
            "example": "array"
          },
          "description": {
            "type": "string",
            "maxLength": 2000,
            "example": "Every company card in the results",
            "description": "Instructions for this list, for example which items to include. At least 2 words. An empty string means no description.\n"
          },
          "maxItems": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5000,
            "default": 50,
            "example": 50,
            "description": "Maximum number of items the robot extracts from this list on each task. Previews show at most 50 items, whatever this value is. A list sent without `maxItems` gets 50, also in an update and on retrain, so send the current value to keep it.\n"
          },
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "type",
              "properties"
            ],
            "description": "The columns of every item of the list. Nested lists and screenshots are not supported.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "object"
                ],
                "example": "object"
              },
              "properties": {
                "type": "object",
                "minProperties": 1,
                "description": "The item's text columns, keyed by column name. The names follow the same rules as the robot's columns, and can't be `Position`, `Extract Date`, an input parameter such as `Origin URL`, or a list's `<List> Limit`.\n",
                "propertyNames": {
                  "minLength": 1,
                  "maxLength": 200
                },
                "additionalProperties": {
                  "$ref": "#/components/schemas/RobotDraftTextProperty"
                }
              },
              "required": {
                "type": "array",
                "description": "Accepted and ignored.",
                "items": {
                  "type": "string"
                }
              },
              "additionalProperties": {
                "type": "boolean",
                "description": "Accepted and ignored."
              }
            }
          }
        }
      },
      "RobotDraftSchemaProperty": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftTextProperty"
          },
          {
            "$ref": "#/components/schemas/RobotDraftScreenshotProperty"
          },
          {
            "$ref": "#/components/schemas/RobotDraftListProperty"
          }
        ]
      },
      "RobotDraftSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "properties"
        ],
        "description": "The data the robot extracts, as a JSON Schema. Each key of `properties` is a column name, and each column's `description` holds its instructions.\n\nNew columns are added in the order of `properties`. Moving an existing column to another position in `properties` does not reorder it, so a schema sent back unchanged keeps its order.\n\n- Text column: `{ \"type\": \"string\" }`\n- Screenshot column: `{ \"type\": \"string\", \"contentMediaType\": \"image/png\" }`\n- List: `{ \"type\": \"array\", \"maxItems\": 50, \"items\": { \"type\": \"object\", \"properties\": { ... } } }`, where every item property is a text column.\n\nOn the robot's tasks, text columns are in `capturedTexts`, screenshots in `capturedScreenshots`, and lists in `capturedLists`, under the same names. Formula columns are not supported.\n",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "object"
            ],
            "example": "object"
          },
          "properties": {
            "type": "object",
            "minProperties": 1,
            "description": "The robot's columns, keyed by column name. Names are trimmed, can't be blank, and can't contain `{` or `}`. Two columns can't share a name, ignoring case and surrounding spaces. A new column can't take the name of one of the draft's built-in columns, such as `Origin URL`, `Extract Date`, `Status`, or a list's `<List> Limit` (for a list named `Products`, `Products Limit`). Clashing names are refused with `bad_request` at the column's path.\n",
            "propertyNames": {
              "minLength": 1,
              "maxLength": 200
            },
            "additionalProperties": {
              "$ref": "#/components/schemas/RobotDraftSchemaProperty"
            }
          },
          "required": {
            "type": "array",
            "description": "Accepted and ignored.",
            "items": {
              "type": "string"
            }
          },
          "additionalProperties": {
            "type": "boolean",
            "description": "Accepted and ignored."
          }
        },
        "example": {
          "type": "object",
          "properties": {
            "Total Company Count": {
              "type": "string",
              "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
            },
            "YC Companies": {
              "type": "array",
              "description": "Every company card in the results",
              "maxItems": 50,
              "items": {
                "type": "object",
                "properties": {
                  "Company Name": {
                    "type": "string"
                  },
                  "Description": {
                    "type": "string"
                  },
                  "Batch": {
                    "type": "string",
                    "description": "Exactly as displayed, like \"FALL 2025\""
                  },
                  "Industry": {
                    "type": "string",
                    "description": "The first industry tag, like \"B2B\""
                  },
                  "Company URL": {
                    "type": "string",
                    "description": "Link to the company's page on YC"
                  }
                }
              }
            },
            "Results Page": {
              "type": "string",
              "contentMediaType": "image/png",
              "x-captureArea": "viewport",
              "x-captureAt": "beforeExtraction"
            }
          }
        }
      },
      "RobotDraft": {
        "type": "object",
        "required": [
          "id",
          "status",
          "userFriendlyError",
          "robotId",
          "name",
          "originUrl",
          "country",
          "createdAt",
          "updatedAt",
          "instructions",
          "schema"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "description": "Unique robot draft ID"
          },
          "status": {
            "$ref": "#/components/schemas/RobotDraftStatus"
          },
          "userFriendlyError": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Why the preview failed and what to do next, written so you can show it to your users. `null` unless `status` is `failed`.\n\nExample: \"The page couldn't be loaded. Check that the URL is correct and the page is available, then try again.\"\n\nThe wording may change. To check whether a preview failed, use `status`, not this message.\n"
          },
          "robotId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "On a retrain, the robot being retrained. Otherwise `null` until the draft is saved, then the ID of the new robot.\n"
          },
          "name": {
            "type": "string",
            "nullable": true,
            "example": "YC AI companies",
            "description": "Name of the robot this draft creates. If you do not send a name, it is `null` until a name is suggested for you, which can happen after the preview starts. A name you send is never replaced.\n\nOn retrain, the draft is named after the robot. Saving renames the robot only when you sent a `name` when creating or updating the draft.\n"
          },
          "originUrl": {
            "type": "string",
            "example": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "description": "The webpage the preview runs on."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftCountry"
              }
            ],
            "description": "The country the preview runs from. If none was sent, it was picked from the domain of `originUrl`, or on retrain it is the robot's current location.\n"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Draft creation date and time in the form of a Unix timestamp"
          },
          "updatedAt": {
            "type": "integer",
            "example": 1678795987879,
            "description": "Draft last update date and time in the form of a Unix timestamp"
          },
          "instructions": {
            "type": "string",
            "nullable": true,
            "example": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "description": "The overall instructions for the robot, or `null` if none were sent."
          },
          "schema": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftSchema"
              }
            ],
            "nullable": true,
            "description": "The draft's current columns, or `null` until it has any. A draft created with only `instructions` has no columns until its first preview works them out from the instructions.\n\nIt never includes `required` or `additionalProperties`. You can send it back unchanged in an update request.\n"
          }
        }
      },
      "RobotDrafts": {
        "type": "object",
        "required": [
          "totalCount",
          "pageNumber",
          "hasMore",
          "items"
        ],
        "properties": {
          "totalCount": {
            "type": "integer",
            "example": 20,
            "description": "Total number of robot drafts in the workspace."
          },
          "pageNumber": {
            "type": "integer",
            "example": 1,
            "description": "Current page number."
          },
          "hasMore": {
            "type": "boolean",
            "example": true,
            "description": "Whether there are more robot drafts on the next page."
          },
          "items": {
            "type": "array",
            "description": "The robot drafts, without `latestPreview`. Use `GET /v2/robot-drafts/{draftId}` to get a draft's `latestPreview`.\n",
            "items": {
              "$ref": "#/components/schemas/RobotDraft"
            }
          }
        }
      },
      "getRobotDrafts-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "type": "object",
            "required": [
              "robotDrafts"
            ],
            "properties": {
              "robotDrafts": {
                "$ref": "#/components/schemas/RobotDrafts"
              }
            }
          }
        }
      },
      "getRobotDrafts-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request"
            ],
            "example": "bad_request"
          }
        }
      },
      "CreateRobotDraftBodyParams": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "originUrl"
        ],
        "anyOf": [
          {
            "title": "With instructions",
            "required": [
              "originUrl",
              "instructions"
            ]
          },
          {
            "title": "With schema",
            "required": [
              "originUrl",
              "schema"
            ]
          }
        ],
        "properties": {
          "originUrl": {
            "type": "string",
            "example": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "description": "The webpage to train the robot on. After the draft is saved, you can run the same robot on other pages of the site by sending a different `originUrl` input parameter when you run a task.\n"
          },
          "instructions": {
            "type": "string",
            "maxLength": 5000,
            "example": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "description": "Overall instructions for the robot. Send `instructions`, `schema`, or both. Without `schema`, the data to extract is worked out from these instructions, except on retrain, where the robot's columns are kept. With `schema`, they apply to the whole robot, on top of each column's `description`. An empty or whitespace-only value counts as not sent.\n"
          },
          "schema": {
            "$ref": "#/components/schemas/RobotDraftSchema"
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftCountry"
              }
            ],
            "description": "The country the robot browses the site from. If you leave it out, the country is picked from the domain of `originUrl` (for example, `GBR` for a `.co.uk` site), or `USA` when the domain does not point to a country. On retrain, the robot's current location is kept. Saving the draft makes it the robot's location. It can't be changed after the draft is created. A country that previews can't run from is refused with `bad_request` at `/country`.\n"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "example": "YC AI companies",
            "description": "Robot name. It's trimmed, can't be blank, and can't be an ID (a UUID). If you leave it out, a name is suggested for you. On retrain, the draft is named after the robot unless you send a name, and saving renames the robot only when you send one.\n"
          },
          "robotId": {
            "type": "string",
            "description": "Send it to retrain an existing robot instead of creating a new one. Saving the draft writes a new version of that robot. A robot whose current version was saved from a robot draft (through this API or Table Studio) can always be retrained. A robot trained another way, such as in Robot Studio or the Chrome extension, is refused with `robot_not_eligible_for_retraining` when it logs in with saved browser storage or has interaction steps.\n\nThe draft starts with the robot's columns. A `schema` sent with `robotId` replaces them, so columns it leaves out are removed from the robot when the draft is saved. A robot that isn't in the workspace, or has no saved version, is refused with 404 `not_found`.\n"
          }
        }
      },
      "RobotDraftMissingColumns": {
        "type": "array",
        "example": [
          "/schema/properties/Job Function",
          "/schema/properties/Similar Jobs/items/properties/Similar Job Company"
        ],
        "description": "Each column the preview didn't find, as a JSON Pointer (RFC 6901) to the column in the draft's `schema`, the same way an error's `path` points at a column. A column inside a list points through the list's `items`. As in any JSON Pointer, `~` in a column name is written as `~0` and `/` as `~1`, so a `Price / Unit` column is `/schema/properties/Price ~1 Unit`.\n",
        "items": {
          "type": "string"
        }
      },
      "RobotDraftPreviewData": {
        "type": "object",
        "description": "The data the preview extracted, in the shape of the draft's `schema`: each key is a column name. Text columns are strings, screenshot columns are the screenshot's URL, and lists are arrays of objects with at most 50 items. A text or screenshot value the preview did not find is `null`, and a list it did not find is an empty array.\n\nScreenshot URLs expire after 7 days. Retrieve the draft again to get new ones.\n",
        "additionalProperties": {
          "oneOf": [
            {
              "type": "string",
              "nullable": true
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          ]
        },
        "example": {
          "Total Company Count": "148",
          "YC Companies": [
            {
              "Company Name": "Coasts",
              "Description": "Localhost service isolation and orchestration for git worktrees",
              "Batch": "FALL 2025",
              "Industry": "B2B",
              "Company URL": "https://www.ycombinator.com/companies/coasts"
            },
            {
              "Company Name": "Zephyr Fusion",
              "Description": "Powering tomorrow's industrial revolution in space",
              "Batch": "FALL 2025",
              "Industry": "INDUSTRIALS",
              "Company URL": "https://www.ycombinator.com/companies/zephyr-fusion"
            },
            {
              "Company Name": "Mayflower",
              "Description": "AI plug-in that automates HR immigration screening and compliance",
              "Batch": "FALL 2025",
              "Industry": "GOVERNMENT",
              "Company URL": "https://www.ycombinator.com/companies/mayflower"
            }
          ],
          "Results Page": "https://prod-browseai-captured-data.s3.amazonaws.com/0b6f1a2e-3c4d-4e5f-8a9b-1c2d3e4f5a6b/results-page.png"
        }
      },
      "RobotDraftLatestPreview": {
        "type": "object",
        "nullable": true,
        "required": [
          "finishedAt",
          "missingColumns",
          "data"
        ],
        "description": "The data of the draft's finished preview. It is only returned while `status` is `ready`, `partially_ready`, or `saved`, and is `null` otherwise: before the first preview finishes, while a new preview runs, and after a preview fails.\n\nOnly returned for a single draft, not in the list of robot drafts.\n",
        "properties": {
          "finishedAt": {
            "type": "integer",
            "example": 1678795987879,
            "description": "Date and time the preview that produced `data` finished, in the form of a Unix timestamp"
          },
          "missingColumns": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftMissingColumns"
              }
            ],
            "example": [],
            "description": "The columns the preview didn't find. Empty unless the draft's `status` is `partially_ready`."
          },
          "data": {
            "$ref": "#/components/schemas/RobotDraftPreviewData"
          }
        }
      },
      "RobotDraftWithLatestPreview": {
        "allOf": [
          {
            "$ref": "#/components/schemas/RobotDraft"
          },
          {
            "type": "object",
            "required": [
              "latestPreview"
            ],
            "properties": {
              "latestPreview": {
                "$ref": "#/components/schemas/RobotDraftLatestPreview"
              }
            }
          }
        ]
      },
      "createRobotDraft-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ],
            "example": "success"
          },
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftWithLatestPreview"
              },
              {
                "type": "object",
                "properties": {
                  "status": {
                    "example": "in_progress"
                  },
                  "updatedAt": {
                    "example": 1678795867879
                  },
                  "schema": {
                    "example": {
                      "type": "object",
                      "properties": {
                        "Total Company Count": {
                          "type": "string",
                          "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                        },
                        "YC Companies": {
                          "type": "array",
                          "description": "Every company card in the results",
                          "maxItems": 50,
                          "items": {
                            "type": "object",
                            "properties": {
                              "Company Name": {
                                "type": "string"
                              },
                              "Description": {
                                "type": "string"
                              },
                              "Batch": {
                                "type": "string",
                                "description": "Exactly as displayed, like \"FALL 2025\""
                              },
                              "Industry": {
                                "type": "string",
                                "description": "The first industry tag, like \"B2B\""
                              },
                              "Company URL": {
                                "type": "string",
                                "description": "Link to the company's page on YC"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "latestPreview": {
                    "example": null
                  }
                }
              }
            ]
          }
        }
      },
      "RobotDraftValidationError": {
        "type": "object",
        "required": [
          "path",
          "message"
        ],
        "properties": {
          "path": {
            "type": "string",
            "example": "/schema/properties/YC Companies/maxItems",
            "description": "Where the problem is, as a JSON Pointer (RFC 6901) into the request body, for example `/originUrl` or `/schema/properties/YC Companies/maxItems`. An empty string means the body as a whole, for example when neither `instructions` nor `schema` is sent.\n"
          },
          "message": {
            "type": "string",
            "example": "Too big: expected number to be <=5000",
            "description": "What is wrong with the value."
          }
        }
      },
      "RobotDraftValidationErrorResponse": {
        "title": "Invalid request body",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "The request body is not valid. `errors` lists every problem found, up to 50, so they can all be fixed before sending the request again.\n",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "example": [
              {
                "path": "/originUrl",
                "message": "Invalid URL"
              },
              {
                "path": "/schema/properties/YC Companies/maxItems",
                "message": "Too big: expected number to be <=5000"
              }
            ],
            "items": {
              "$ref": "#/components/schemas/RobotDraftValidationError"
            }
          }
        }
      },
      "createRobotDraft-400-other": {
        "title": "Body not valid JSON",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "body_parse_error"
            ],
            "example": "body_parse_error",
            "description": "The request body is not valid JSON."
          }
        }
      },
      "RobotNotEligibleForRetrainingResponse": {
        "title": "Robot not eligible for retraining",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "robot_not_eligible_for_retraining"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "This robot was trained outside Table Studio and logs in with saved browser storage, so it can't be retrained yet. Retrain it in Robot Studio.",
                  "description": "Names every reason, and where the robot can be retrained instead when it was trained in Robot Studio or the Chrome extension.\n"
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "reasons",
                    "trainingSystem"
                  ],
                  "properties": {
                    "trainingSystem": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "robot_studio",
                        "chrome_extension",
                        "prebuilt_robot",
                        null
                      ],
                      "example": "robot_studio",
                      "description": "Where the robot's current version was trained: `robot_studio`, `chrome_extension`, or `prebuilt_robot` for a robot created from a Prebuilt Robot. `null` when it isn't known.\n"
                    },
                    "reasons": {
                      "type": "array",
                      "example": [
                        "requires_login"
                      ],
                      "description": "Why the robot cannot be retrained.\n\n- `prebuilt_robot`: The robot was created from a Prebuilt Robot and follows its steps, so it can't be retrained anywhere. It is the only reason when it applies.\n- `requires_login`: The robot logs in with saved browser storage. Robots that log in with cookies can be retrained.\n- `has_interaction_steps`: The robot clicks, types, or moves between pages before extracting data. Retraining would drop those steps.\n",
                      "items": {
                        "type": "string",
                        "enum": [
                          "prebuilt_robot",
                          "requires_login",
                          "has_interaction_steps"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "createRobotDraft-400": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftValidationErrorResponse"
          },
          {
            "$ref": "#/components/schemas/createRobotDraft-400-other"
          },
          {
            "$ref": "#/components/schemas/RobotNotEligibleForRetrainingResponse"
          }
        ]
      },
      "RobotDraftCreditsLimitReachedResponse": {
        "title": "Credits limit reached",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "Not enough credits. On create and update, the credits are for the preview: previews use credits once the plan's AI budget is used up. On save, they are for the robot's first task. Add credits, then send the request again.\n",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "credits_limit_reached"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "Not enough credits: 20 are needed and 8 are available. Add credits, then try again."
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "availableCredits",
                    "requiredCredits",
                    "reservedCredits"
                  ],
                  "properties": {
                    "availableCredits": {
                      "type": "number",
                      "example": 8,
                      "description": "Credits the workspace can use now. Reserved credits are not included."
                    },
                    "requiredCredits": {
                      "type": "number",
                      "example": 20,
                      "description": "Credits that must be available for the request to go through, that is, `availableCredits` must be at least `requiredCredits`.\n"
                    },
                    "reservedCredits": {
                      "type": "number",
                      "example": 4,
                      "description": "Credits set aside for in-progress tasks. Reserved credits will be spent or become available again once those tasks finish.\n"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "RobotDraftTrainingDisabledResponse": {
        "title": "Training disabled",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "AI robot training is turned off for the workspace. Adding credits does not change this.\n",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "training_disabled"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "AI robot training isn't included in your plan. Contact support to add it. Your existing robots will keep running.",
                  "description": "Depends on `reason`. With `ai_budget_exhausted`: \"Your workspace has used its AI budget for this billing cycle, so AI robot training is limited. Contact support to keep training robots.\"\n"
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "reason"
                  ],
                  "properties": {
                    "reason": {
                      "type": "string",
                      "enum": [
                        "not_available_on_plan",
                        "ai_budget_exhausted"
                      ],
                      "example": "not_available_on_plan",
                      "description": "- `not_available_on_plan`: The plan does not include AI robot training.\n- `ai_budget_exhausted`: The workspace has used its AI budget for this billing cycle, and training with credits is not available for the workspace.\n"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "RobotDraftRobotsLimitReachedResponse": {
        "title": "Robots limit reached",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "The workspace has reached its robot limit. Upgrade the plan or delete a robot, then send the request again.",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "robots_limit_reached"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "Your workspace has reached its limit of 10 robots. Upgrade your plan or delete a robot, then try again."
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "robotCount",
                    "robotLimit"
                  ],
                  "properties": {
                    "robotCount": {
                      "type": "integer",
                      "example": 10,
                      "description": "Number of robots in the workspace."
                    },
                    "robotLimit": {
                      "type": "integer",
                      "example": 10,
                      "description": "Most robots the workspace's plan allows."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "RobotDraftWebsitesLimitReachedResponse": {
        "title": "Websites limit reached",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "The workspace has reached its website limit and `originUrl` is on a new website. Upgrade the plan, then send the request again.",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              403
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "websites_limit_reached"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "Your workspace has reached its limit of 5 websites. Add more websites to your plan or upgrade to continue."
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "websiteCount",
                    "websiteLimit"
                  ],
                  "properties": {
                    "websiteCount": {
                      "type": "integer",
                      "example": 6,
                      "description": "Number of websites the workspace's robots are on, counting the website of `originUrl`.\n"
                    },
                    "websiteLimit": {
                      "type": "integer",
                      "example": 5,
                      "description": "Most websites the workspace's plan allows."
                    }
                  }
                }
              }
            }
          }
        }
      },
      "createRobotDraft-403": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftCreditsLimitReachedResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftTrainingDisabledResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftRobotsLimitReachedResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftWebsitesLimitReachedResponse"
          }
        ]
      },
      "getRobotDraft-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ],
            "example": "success"
          },
          "result": {
            "$ref": "#/components/schemas/RobotDraftWithLatestPreview"
          }
        }
      },
      "getRobotDraft-400": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_draft_id"
            ],
            "example": "invalid_draft_id"
          }
        }
      },
      "UpdateRobotDraftBodyParams": {
        "type": "object",
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Send at least one field, and only the fields you want to change. Fields you leave out keep their current value. Sending `schema` replaces the whole schema, so include every column you want to keep.\n",
        "properties": {
          "originUrl": {
            "type": "string",
            "example": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "description": "The webpage the preview runs on."
          },
          "instructions": {
            "type": "string",
            "maxLength": 5000,
            "example": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "description": "Overall instructions for the robot. New instructions sent without `schema` replace the draft's columns: they are worked out again from the instructions. An empty string clears the instructions and starts a new preview with the draft's columns.\n"
          },
          "schema": {
            "$ref": "#/components/schemas/RobotDraftSchema"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "example": "YC AI companies",
            "description": "Robot name. It's trimmed, can't be blank, and can't be an ID (a UUID). Changing only the name does not start a new preview. On retrain, saving the draft renames the robot to this name.\n"
          }
        }
      },
      "updateRobotDraft-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ],
            "example": "success"
          },
          "result": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RobotDraftWithLatestPreview"
              },
              {
                "type": "object",
                "properties": {
                  "status": {
                    "example": "in_progress"
                  },
                  "updatedAt": {
                    "example": 1678796467879
                  },
                  "latestPreview": {
                    "example": null
                  }
                }
              }
            ]
          }
        }
      },
      "updateRobotDraft-400-other": {
        "title": "Other errors",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "body_parse_error",
              "invalid_draft_id",
              "draft_unchanged",
              "draft_not_editable"
            ],
            "example": "draft_unchanged",
            "description": "- `body_parse_error`: The request body is not valid JSON.\n- `invalid_draft_id`: `draftId` is not a valid ID.\n- `draft_unchanged`: No `name` was sent, and the values sent are the same as the latest preview, which is in progress or finished (`ready` or `partially_ready`).\n- `draft_not_editable`: The draft is saved and cannot be updated.\n"
          }
        }
      },
      "updateRobotDraft-400": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftValidationErrorResponse"
          },
          {
            "$ref": "#/components/schemas/updateRobotDraft-400-other"
          }
        ]
      },
      "RobotDraftForbiddenResponse": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftCreditsLimitReachedResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftTrainingDisabledResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftWebsitesLimitReachedResponse"
          }
        ]
      },
      "saveRobotDraft-200": {
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "result"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              200
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "success"
            ]
          },
          "result": {
            "type": "object",
            "required": [
              "draft",
              "robot",
              "taskId"
            ],
            "properties": {
              "draft": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/RobotDraftWithLatestPreview"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "status": {
                        "example": "saved"
                      },
                      "updatedAt": {
                        "example": 1678796107879
                      },
                      "robotId": {
                        "example": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06"
                      }
                    }
                  }
                ]
              },
              "robot": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Robot"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "name": {
                        "example": "YC AI companies"
                      }
                    }
                  }
                ]
              },
              "taskId": {
                "type": "string",
                "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
                "description": "ID of the robot's first task, started when the draft was saved. It uses task credits like any other task. Use the task endpoints to follow it.\n"
              }
            }
          }
        }
      },
      "saveRobotDraft-400-not-savable": {
        "title": "Draft not savable",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode",
          "errors"
        ],
        "description": "The draft cannot be saved yet. Its preview is not `ready`, or the draft is missing something a robot needs, such as at least one column with extracted data. `message` says which. Update the draft, wait for its preview to finish, then save it again.\n",
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "draft_not_savable"
            ]
          },
          "errors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "message",
                "metadata"
              ],
              "properties": {
                "message": {
                  "type": "string",
                  "example": "This draft can't be saved because its preview failed. Update the draft to run a new preview.",
                  "description": "Says why the draft can't be saved. While the preview is `in_progress`: \"This draft can't be saved until its preview is done.\" For a draft with no preview: \"This draft can't be saved because it has no preview. Update the draft to start one.\"\n"
                },
                "metadata": {
                  "type": "object",
                  "required": [
                    "status",
                    "missingColumns"
                  ],
                  "properties": {
                    "status": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/RobotDraftStatus"
                        }
                      ],
                      "example": "failed",
                      "description": "The draft's `status` when saving it was refused."
                    },
                    "missingColumns": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/RobotDraftMissingColumns"
                        }
                      ],
                      "example": [],
                      "description": "The columns the preview didn't find, as in `latestPreview.missingColumns`. Empty unless `status` is `partially_ready`.\n"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "saveRobotDraft-400-other": {
        "title": "Other errors",
        "type": "object",
        "required": [
          "statusCode",
          "messageCode"
        ],
        "properties": {
          "statusCode": {
            "type": "number",
            "enum": [
              400
            ]
          },
          "messageCode": {
            "type": "string",
            "enum": [
              "invalid_draft_id",
              "draft_already_saved"
            ],
            "example": "draft_already_saved",
            "description": "- `invalid_draft_id`: `draftId` is not a valid ID.\n- `draft_already_saved`: The draft was already saved. Retrieve the draft to get the robot it created or updated in `robotId`.\n"
          }
        }
      },
      "saveRobotDraft-400": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/saveRobotDraft-400-not-savable"
          },
          {
            "$ref": "#/components/schemas/saveRobotDraft-400-other"
          },
          {
            "$ref": "#/components/schemas/RobotNotEligibleForRetrainingResponse"
          }
        ]
      },
      "saveRobotDraft-403": {
        "description": "No robot was created or changed, and the draft can be saved again once the cause is fixed.\n",
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotDraftCreditsLimitReachedResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftRobotsLimitReachedResponse"
          },
          {
            "$ref": "#/components/schemas/RobotDraftWebsitesLimitReachedResponse"
          }
        ]
      },
      "RobotTaskWebhook": {
        "type": "object",
        "required": [
          "id",
          "inputParameters",
          "robotId",
          "createdAt",
          "runByAPI",
          "triedRecordingVideo",
          "capturedTexts",
          "capturedScreenshots",
          "capturedLists"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "description": "Unique task ID"
          },
          "inputParameters": {
            "$ref": "#/components/schemas/InputParameters"
          },
          "robotId": {
            "type": "string",
            "example": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "description": "Unique robot ID"
          },
          "status": {
            "type": "string",
            "enum": [
              "failed",
              "successful",
              "in-progress"
            ],
            "example": "successful",
            "description": "task status"
          },
          "runByUserId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "User ID who ran the robot on the dashboard"
          },
          "robotBulkRunId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Robot bulk run ID associated with this task"
          },
          "runByTaskMonitorId": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Monitor ID that ran this check"
          },
          "runByAPI": {
            "type": "boolean",
            "example": true,
            "description": "Whether the robot was ran through the API"
          },
          "createdAt": {
            "type": "integer",
            "example": 1678795867879,
            "description": "Task creation date and time in the form of a Unix timestamp. If the task was retried automatically, this is when its last retry was created, so it can be later than when the task was run.\n"
          },
          "startedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Task start date and time in the form of a Unix timestamp. If the task was retried automatically, this is when its last retry started.\n"
          },
          "finishedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "Task finish date and time in the form of a Unix timestamp.\n\nIf `null`, it means robot is still running and capturing data.\n\nTasks time out with an error if they are not finished within 15 minutes (or the maximum duration allowed on your plan).\n"
          },
          "userFriendlyError": {
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "If task fails, a user-friendly error will be provided here."
          },
          "triedRecordingVideo": {
            "type": "boolean",
            "example": true,
            "description": "Whether the robot tried to record a video while performing this task.\n\nYou can change a robot's video recording setting on its Settings page. \n\nRobots try to record a video when a task is failed and auto-retried as well.\n"
          },
          "videoUrl": {
            "type": "string",
            "nullable": true,
            "example": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/system-1620230966-b1a9688b-05d3-4682-beeb-9ce035e482b1.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQVG3TPBVXHSCAX63%2F20221031%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221031T185642Z&X-Amz-Expires=1800&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEJP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQDfX8VNAl5kBgttrCU85U5wc1ZtSOmshO6%2FPilXOv8nvgIhAIveFfsk%2B2CnEkrMZWriodEPsj0osO5a5zV6eVu%2FXfuZKp8DCHwQAhoMMDQ1NTU3NzA4OTA3IgyrbhVK0MP1WMFBXh0q%2FAJulP5qfaV5mn3NRbINqZN4hy4Dg3IujNrZjw8ef32sWE1Gj2D%2Fc0YTJUzvx%2Fnm7LxyNO6AR35mrVy%2FBm9Q80UIspkcLMl45EK%2FoUDO0fAvoUF8g6iZ905qS3MvnOTxXkObhM1PVmpFeJFMw3jksnOPfKE4X7Ut%2FJXNwD%2F5QzdkQCXkGem%2BlrYSSSf8jB8lihTAjT%2FNXmOKMv3jktmZ13T8J1R8F8zeuLPMQf7QphUzlKn5joPb28cConluQC97y%2BjwxqIYjvIFKXY9cZEoaHGh4c6FbXsia714zG3CQp8NSGLbqCCu93oJI1Z61E%2BZ6PhB3vZGdBvXi61AlJcxZ7sti6i0h4VAbWspiJIgWwoZzrsTtneBNNpUW9tvtacGgEZIwAKV%2F3AhVEZu3WC1eQ9HtfjT9%2FjW99SEB8VVGXwkM%2FA9mtT%2FuiL0cAfQZRMhtbQJXXDRdkYEw%2FWuhjJ3zxEtEB2m3uH%2B%2BUEzOzGTd5Knm%2Bero%2BhMfN8X%2Botm3DDbtICbBjqcAf5Riii0XE1w2TZvpm%2FPNHTchCu7FnNz5hfvflv8scpgO5M4bGpy%2FadI4%2F7AUQqCQXFw4scF0FCCdb8AKJZsFGG18W1jjDHyR0YuxZFQ%2FJQRt0JP3yr%2BkVxjAH7qTtc0AzF%2FnGTgy3MOF%2Bm6Y7EkyCWyV2r6o1JTBQMftlf7MI8Uvw4cSZE6JoZviaFtmKVLGGgR4F3cDiyU56augA%3D%3D&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "description": "If a video was recorded for this task, this is the link to the video."
          },
          "videoRemovedAt": {
            "type": "integer",
            "nullable": true,
            "example": 1678795867879,
            "description": "After your account's data retention period, task videos get removed and  this field will be video removal date and time in the form of a Unix timestamp.\n"
          },
          "capturedDataRemovedAt": {
            "type": "integer",
            "nullable": true,
            "example": null,
            "description": "After your workspace's data retention period, captured texts and lists may be removed. If they are, this field holds the removal time in the form of a Unix timestamp; until then it is null.\n"
          },
          "retriedOriginalTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "retriedTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "retriedByTaskId": {
            "deprecated": true,
            "type": "string",
            "nullable": true,
            "example": null,
            "description": "Deprecated and always `null`. Automatic retries are part of the task and aren't returned separately.\n"
          },
          "capturedTexts": {
            "$ref": "#/components/schemas/CapturedTexts"
          },
          "capturedScreenshots": {
            "$ref": "#/components/schemas/CapturedScreenshots"
          },
          "capturedLists": {
            "$ref": "#/components/schemas/CapturedLists"
          }
        }
      }
    },
    "examples": {
      "getRobotTask-200-capturedDataAvailable": {
        "summary": "Captured data available",
        "description": "A finished task whose captured texts and lists are still available.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "inputParameters": {
              "originUrl": "https://www.ycombinator.com/companies/airbnb",
              "companies_skip": 0,
              "companies_limit": 10
            },
            "robotId": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "status": "successful",
            "runByUserId": null,
            "robotBulkRunId": null,
            "runByTaskMonitorId": null,
            "runByAPI": true,
            "createdAt": 1678795867879,
            "startedAt": 1678795868412,
            "finishedAt": 1678795912204,
            "userFriendlyError": null,
            "triedRecordingVideo": true,
            "videoUrl": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/system-1620230966-b1a9688b-05d3-4682-beeb-9ce035e482b1.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T121210Z&X-Amz-Expires=604800&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "videoRemovedAt": null,
            "capturedDataRemovedAt": null,
            "retriedOriginalTaskId": null,
            "retriedTaskId": null,
            "retriedByTaskId": null,
            "capturedDataTemporaryUrl": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/system-1620230966-b1a9688b-05d3-4682-beeb-9ce035e482b1.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T121210Z&X-Amz-Expires=604800&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
            "capturedTexts": {
              "Product Name": "Alexis",
              "Width": "15",
              "Construction": "Hand woven",
              "Fiber": "100% Wool",
              "Main Image": "https://isteam.wsimg.com/ip/e31f7bba-252b-4669-9209-639d1c00765d/ols/258_original"
            },
            "capturedScreenshots": {
              "top-ads": {
                "id": "b4d132f3-12d9-4770-ac7d-88e481fc5b47",
                "name": "Top ads",
                "src": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T121210Z&X-Amz-Expires=604800&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
                "width": 600,
                "height": 120,
                "x": 201,
                "y": 142,
                "deviceScaleFactor": 1.2,
                "full": "page",
                "comparedToScreenshotId": "29d742c2-6f45-4f29-9d48-ba6fe66e6e3d",
                "diffImageSrc": "https://prod-browseai-captured-data.s3.amazonaws.com/1fae674a-2788-46a8-83c8-95c4664c6d25/6326b3c1-7b16-4256-a323-7d8d8954bd4e/1061671f-7f71-42ac-bb9a-207d126d1f3a/00001-user-1620230947-6f113cf2-90ef-4c66-a448-9d5c6bd64873.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T121210Z&X-Amz-Expires=604800&X-Amz-Signature=a7bb4d7597ad37cdf1f260890c3c474f7f49334db58c9650d75302a34126f7bc&X-Amz-SignedHeaders=host",
                "changePercentage": 20,
                "diffThreshold": 5,
                "fileRemovedAt": null
              }
            },
            "capturedLists": {
              "companies": [
                {
                  "Position": "1",
                  "name": "Airbnb",
                  "location": "San Francisco, CA, USA",
                  "description": "Book accommodations around the world."
                },
                {
                  "Position": "2",
                  "name": "Coin base",
                  "location": "San Francisco, CA, USA",
                  "description": "Buy, sell, and manage crypto currencies."
                },
                {
                  "Position": "3",
                  "name": "DoorDash",
                  "location": "San Francisco, CA, USA",
                  "description": "Restaurant delivery."
                }
              ]
            }
          }
        }
      },
      "getRobotTask-200-capturedDataRemoved": {
        "summary": "Removed by data retention policy",
        "description": "This task is older than your workspace's data retention period, so its captured texts, lists, screenshots and video were removed and are no longer returned. `capturedDataRemovedAt` shows when they were removed.\n",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
            "inputParameters": {
              "originUrl": "https://www.ycombinator.com/companies/airbnb",
              "companies_skip": 0,
              "companies_limit": 10
            },
            "robotId": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
            "status": "successful",
            "runByUserId": null,
            "robotBulkRunId": null,
            "runByTaskMonitorId": null,
            "runByAPI": true,
            "createdAt": 1678795867879,
            "startedAt": 1678795868412,
            "finishedAt": 1678795912204,
            "userFriendlyError": null,
            "triedRecordingVideo": true,
            "videoUrl": null,
            "videoRemovedAt": null,
            "capturedDataRemovedAt": 1681390313027,
            "retriedOriginalTaskId": null,
            "retriedTaskId": null,
            "retriedByTaskId": null,
            "capturedDataTemporaryUrl": null,
            "capturedTexts": {},
            "capturedScreenshots": {},
            "capturedLists": {}
          }
        }
      },
      "DraftsInDifferentStates": {
        "summary": "Drafts in different states",
        "description": "Newest first. Saved drafts are included, with `robotId` pointing at the robot they created or updated.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "robotDrafts": {
              "totalCount": 3,
              "pageNumber": 1,
              "hasMore": false,
              "items": [
                {
                  "id": "3f6d2a9c-7b41-4e8a-a0d5-91c2e4b7f630",
                  "status": "in_progress",
                  "userFriendlyError": null,
                  "robotId": null,
                  "name": "IKEA KALLAX 2x4 shelf units",
                  "originUrl": "https://www.ikea.com/us/en/",
                  "country": "USA",
                  "createdAt": 1678796867879,
                  "updatedAt": 1678796867879,
                  "instructions": "Get the name, description, price and link of every KALLAX shelf unit with 2x4 cubes.",
                  "schema": {
                    "type": "object",
                    "properties": {
                      "Shelf Units": {
                        "type": "array",
                        "description": "Every KALLAX shelf unit with 2x4 cubes",
                        "maxItems": 50,
                        "items": {
                          "type": "object",
                          "properties": {
                            "Name": {
                              "type": "string"
                            },
                            "Description": {
                              "type": "string"
                            },
                            "Price": {
                              "type": "string",
                              "description": "As shown, with the currency symbol, like \"$89.99\""
                            },
                            "Link": {
                              "type": "string",
                              "description": "Link to the product page"
                            }
                          }
                        }
                      }
                    }
                  }
                },
                {
                  "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
                  "status": "ready",
                  "userFriendlyError": null,
                  "robotId": null,
                  "name": "YC AI companies",
                  "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                  "country": "USA",
                  "createdAt": 1678795867879,
                  "updatedAt": 1678795987879,
                  "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
                  "schema": {
                    "type": "object",
                    "properties": {
                      "Total Company Count": {
                        "type": "string",
                        "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                      },
                      "YC Companies": {
                        "type": "array",
                        "description": "Every company card in the results",
                        "maxItems": 50,
                        "items": {
                          "type": "object",
                          "properties": {
                            "Company Name": {
                              "type": "string"
                            },
                            "Description": {
                              "type": "string"
                            },
                            "Batch": {
                              "type": "string",
                              "description": "Exactly as displayed, like \"FALL 2025\""
                            },
                            "Industry": {
                              "type": "string",
                              "description": "The first industry tag, like \"B2B\""
                            },
                            "Company URL": {
                              "type": "string",
                              "description": "Link to the company's page on YC"
                            }
                          }
                        }
                      }
                    }
                  }
                },
                {
                  "id": "b7e1c5d2-0a94-4c3f-8e62-5d9f1a7b2c48",
                  "status": "saved",
                  "userFriendlyError": null,
                  "robotId": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
                  "name": "YC AI companies",
                  "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                  "country": "USA",
                  "createdAt": 1678790000000,
                  "updatedAt": 1678790400000,
                  "instructions": "Only include companies in the B2B industry.",
                  "schema": {
                    "type": "object",
                    "properties": {
                      "Total Company Count": {
                        "type": "string",
                        "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                      },
                      "YC Companies": {
                        "type": "array",
                        "description": "Every company card in the results",
                        "maxItems": 50,
                        "items": {
                          "type": "object",
                          "properties": {
                            "Company Name": {
                              "type": "string"
                            },
                            "Description": {
                              "type": "string"
                            },
                            "Batch": {
                              "type": "string",
                              "description": "Exactly as displayed, like \"FALL 2025\""
                            },
                            "Industry": {
                              "type": "string",
                              "description": "The first industry tag, like \"B2B\""
                            },
                            "Company URL": {
                              "type": "string",
                              "description": "Link to the company's page on YC"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "CreatedFromInstructions": {
        "summary": "Created from instructions",
        "description": "`schema` is `null` until the first preview works out the columns from the instructions, and `name` is `null` until a name is suggested.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "in_progress",
            "userFriendlyError": null,
            "robotId": null,
            "name": null,
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795867879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": null,
            "latestPreview": null
          }
        }
      },
      "CreatedWithSchema": {
        "summary": "Created with a schema",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "3f6d2a9c-7b41-4e8a-a0d5-91c2e4b7f630",
            "status": "in_progress",
            "userFriendlyError": null,
            "robotId": null,
            "name": "IKEA KALLAX 2x4 shelf units",
            "originUrl": "https://www.ikea.com/us/en/",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795867879,
            "instructions": "Get the name, description, price and link of every KALLAX shelf unit with 2x4 cubes.",
            "schema": {
              "type": "object",
              "properties": {
                "Shelf Units": {
                  "type": "array",
                  "description": "Every KALLAX shelf unit with 2x4 cubes",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Price": {
                        "type": "string",
                        "description": "As shown, with the currency symbol, like \"$89.99\""
                      },
                      "Link": {
                        "type": "string",
                        "description": "Link to the product page"
                      }
                    }
                  }
                }
              }
            },
            "latestPreview": null
          }
        }
      },
      "RetrainingRobot": {
        "summary": "Retraining a robot",
        "description": "The draft is named after the robot and starts with the robot's columns, which the instructions apply on top of.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "b7e1c5d2-0a94-4c3f-8e62-5d9f1a7b2c48",
            "status": "in_progress",
            "userFriendlyError": null,
            "robotId": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
            "name": "YC AI companies",
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795867879,
            "instructions": "Only include companies in the B2B industry.",
            "schema": {
              "type": "object",
              "properties": {
                "Total Company Count": {
                  "type": "string",
                  "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                },
                "YC Companies": {
                  "type": "array",
                  "description": "Every company card in the results",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Company Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Batch": {
                        "type": "string",
                        "description": "Exactly as displayed, like \"FALL 2025\""
                      },
                      "Industry": {
                        "type": "string",
                        "description": "The first industry tag, like \"B2B\""
                      },
                      "Company URL": {
                        "type": "string",
                        "description": "Link to the company's page on YC"
                      }
                    }
                  }
                }
              }
            },
            "latestPreview": null
          }
        }
      },
      "RobotDraftInvalidBody": {
        "summary": "Invalid request body",
        "value": {
          "statusCode": 400,
          "messageCode": "bad_request",
          "errors": [
            {
              "path": "/originUrl",
              "message": "Invalid URL"
            },
            {
              "path": "/schema/properties/YC Companies/maxItems",
              "message": "Too big: expected number to be <=5000"
            }
          ]
        }
      },
      "UnsupportedCountry": {
        "summary": "Country not supported",
        "value": {
          "statusCode": 400,
          "messageCode": "bad_request",
          "errors": [
            {
              "path": "/country",
              "message": "Robots can't browse from ATA. Send another country, or leave it out to pick one from originUrl."
            }
          ]
        }
      },
      "RobotDraftBodyParseError": {
        "summary": "Body not valid JSON",
        "value": {
          "statusCode": 400,
          "messageCode": "body_parse_error"
        }
      },
      "RobotNotEligibleForRetraining": {
        "summary": "Robot not eligible for retraining",
        "value": {
          "statusCode": 400,
          "messageCode": "robot_not_eligible_for_retraining",
          "errors": [
            {
              "message": "This robot was trained outside Table Studio and logs in with saved browser storage, so it can't be retrained yet. Retrain it in Robot Studio.",
              "metadata": {
                "reasons": [
                  "requires_login"
                ],
                "trainingSystem": "robot_studio"
              }
            }
          ]
        }
      },
      "RobotDraftCreditsLimitReached": {
        "summary": "Credits limit reached",
        "value": {
          "statusCode": 403,
          "messageCode": "credits_limit_reached",
          "errors": [
            {
              "message": "Not enough credits: 20 are needed and 8 are available. Add credits, then try again.",
              "metadata": {
                "availableCredits": 8,
                "requiredCredits": 20,
                "reservedCredits": 4
              }
            }
          ]
        }
      },
      "RobotDraftTrainingNotOnPlan": {
        "summary": "Training not included in the plan",
        "value": {
          "statusCode": 403,
          "messageCode": "training_disabled",
          "errors": [
            {
              "message": "AI robot training isn't included in your plan. Contact support to add it. Your existing robots will keep running.",
              "metadata": {
                "reason": "not_available_on_plan"
              }
            }
          ]
        }
      },
      "RobotDraftTrainingAiBudgetExhausted": {
        "summary": "AI budget used up",
        "value": {
          "statusCode": 403,
          "messageCode": "training_disabled",
          "errors": [
            {
              "message": "Your workspace has used its AI budget for this billing cycle, so AI robot training is limited. Contact support to keep training robots.",
              "metadata": {
                "reason": "ai_budget_exhausted"
              }
            }
          ]
        }
      },
      "RobotDraftRobotsLimitReached": {
        "summary": "Robots limit reached",
        "value": {
          "statusCode": 403,
          "messageCode": "robots_limit_reached",
          "errors": [
            {
              "message": "Your workspace has reached its limit of 10 robots. Upgrade your plan or delete a robot, then try again.",
              "metadata": {
                "robotCount": 10,
                "robotLimit": 10
              }
            }
          ]
        }
      },
      "RobotDraftWebsitesLimitReached": {
        "summary": "Websites limit reached",
        "value": {
          "statusCode": 403,
          "messageCode": "websites_limit_reached",
          "errors": [
            {
              "message": "Your workspace has reached its limit of 5 websites. Add more websites to your plan or upgrade to continue.",
              "metadata": {
                "websiteCount": 6,
                "websiteLimit": 5
              }
            }
          ]
        }
      },
      "Ready": {
        "summary": "Preview ready",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "ready",
            "userFriendlyError": null,
            "robotId": null,
            "name": "YC AI companies",
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795987879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": {
              "type": "object",
              "properties": {
                "Total Company Count": {
                  "type": "string",
                  "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                },
                "YC Companies": {
                  "type": "array",
                  "description": "Every company card in the results",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Company Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Batch": {
                        "type": "string",
                        "description": "Exactly as displayed, like \"FALL 2025\""
                      },
                      "Industry": {
                        "type": "string",
                        "description": "The first industry tag, like \"B2B\""
                      },
                      "Company URL": {
                        "type": "string",
                        "description": "Link to the company's page on YC"
                      }
                    }
                  }
                }
              }
            },
            "latestPreview": {
              "finishedAt": 1678795987879,
              "missingColumns": [],
              "data": {
                "Total Company Count": "148",
                "YC Companies": [
                  {
                    "Company Name": "Coasts",
                    "Description": "Localhost service isolation and orchestration for git worktrees",
                    "Batch": "FALL 2025",
                    "Industry": "B2B",
                    "Company URL": "https://www.ycombinator.com/companies/coasts"
                  },
                  {
                    "Company Name": "Zephyr Fusion",
                    "Description": "Powering tomorrow's industrial revolution in space",
                    "Batch": "FALL 2025",
                    "Industry": "INDUSTRIALS",
                    "Company URL": "https://www.ycombinator.com/companies/zephyr-fusion"
                  },
                  {
                    "Company Name": "Mayflower",
                    "Description": "AI plug-in that automates HR immigration screening and compliance",
                    "Batch": "FALL 2025",
                    "Industry": "GOVERNMENT",
                    "Company URL": "https://www.ycombinator.com/companies/mayflower"
                  }
                ]
              }
            }
          }
        }
      },
      "InProgress": {
        "summary": "Preview in progress",
        "description": "`latestPreview` is `null` until the preview finishes. Poll the draft again.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "in_progress",
            "userFriendlyError": null,
            "robotId": null,
            "name": null,
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795867879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": null,
            "latestPreview": null
          }
        }
      },
      "PartiallyReady": {
        "summary": "Preview partially ready",
        "description": "The preview didn't find every column. `missingColumns` points at them. Change the schema or instructions to run a new preview.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "partially_ready",
            "userFriendlyError": null,
            "robotId": null,
            "name": "YC AI companies",
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795987879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": {
              "type": "object",
              "properties": {
                "Total Company Count": {
                  "type": "string",
                  "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                },
                "YC Companies": {
                  "type": "array",
                  "description": "Every company card in the results",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Company Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Batch": {
                        "type": "string",
                        "description": "Exactly as displayed, like \"FALL 2025\""
                      },
                      "Industry": {
                        "type": "string",
                        "description": "The first industry tag, like \"B2B\""
                      },
                      "Company URL": {
                        "type": "string",
                        "description": "Link to the company's page on YC"
                      }
                    }
                  }
                }
              }
            },
            "latestPreview": {
              "finishedAt": 1678795987879,
              "missingColumns": [
                "/schema/properties/YC Companies/items/properties/Industry"
              ],
              "data": {
                "Total Company Count": "148",
                "YC Companies": [
                  {
                    "Company Name": "Coasts",
                    "Description": "Localhost service isolation and orchestration for git worktrees",
                    "Batch": "FALL 2025",
                    "Industry": null,
                    "Company URL": "https://www.ycombinator.com/companies/coasts"
                  },
                  {
                    "Company Name": "Zephyr Fusion",
                    "Description": "Powering tomorrow's industrial revolution in space",
                    "Batch": "FALL 2025",
                    "Industry": null,
                    "Company URL": "https://www.ycombinator.com/companies/zephyr-fusion"
                  },
                  {
                    "Company Name": "Mayflower",
                    "Description": "AI plug-in that automates HR immigration screening and compliance",
                    "Batch": "FALL 2025",
                    "Industry": null,
                    "Company URL": "https://www.ycombinator.com/companies/mayflower"
                  }
                ]
              }
            }
          }
        }
      },
      "Failed": {
        "summary": "Preview failed",
        "description": "`userFriendlyError` says why. Fix the cause, then send an update request to run the preview again.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "failed",
            "userFriendlyError": "The page couldn't be loaded. Check that the URL is correct and the page is available, then try again.",
            "robotId": null,
            "name": null,
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678795987879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": null,
            "latestPreview": null
          }
        }
      },
      "RetrainingDraft": {
        "summary": "Retraining: new preview in progress",
        "description": "Sending `originUrl`, `instructions`, or `schema` starts a new preview, so `latestPreview` is `null` until it finishes.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "in_progress",
            "userFriendlyError": null,
            "robotId": null,
            "name": "YC AI companies",
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678796467879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": {
              "type": "object",
              "properties": {
                "Total Company Count": {
                  "type": "string",
                  "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                },
                "YC Companies": {
                  "type": "array",
                  "description": "Every company card in the results",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Company Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Batch": {
                        "type": "string",
                        "description": "Exactly as displayed, like \"FALL 2025\""
                      },
                      "Industry": {
                        "type": "string",
                        "description": "The first industry tag, like \"B2B\""
                      },
                      "Company URL": {
                        "type": "string",
                        "description": "Link to the company's page on YC"
                      }
                    }
                  }
                },
                "Results Page": {
                  "type": "string",
                  "contentMediaType": "image/png",
                  "x-captureArea": "viewport",
                  "x-captureAt": "beforeExtraction"
                }
              }
            },
            "latestPreview": null
          }
        }
      },
      "Renamed": {
        "summary": "Renamed, preview kept",
        "description": "Changing only `name` doesn't start a new preview, so `status` and `latestPreview` stay as they were.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
            "status": "ready",
            "userFriendlyError": null,
            "robotId": null,
            "name": "YC AI companies, Fall 2025",
            "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
            "country": "USA",
            "createdAt": 1678795867879,
            "updatedAt": 1678796467879,
            "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
            "schema": {
              "type": "object",
              "properties": {
                "Total Company Count": {
                  "type": "string",
                  "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                },
                "YC Companies": {
                  "type": "array",
                  "description": "Every company card in the results",
                  "maxItems": 50,
                  "items": {
                    "type": "object",
                    "properties": {
                      "Company Name": {
                        "type": "string"
                      },
                      "Description": {
                        "type": "string"
                      },
                      "Batch": {
                        "type": "string",
                        "description": "Exactly as displayed, like \"FALL 2025\""
                      },
                      "Industry": {
                        "type": "string",
                        "description": "The first industry tag, like \"B2B\""
                      },
                      "Company URL": {
                        "type": "string",
                        "description": "Link to the company's page on YC"
                      }
                    }
                  }
                }
              }
            },
            "latestPreview": {
              "finishedAt": 1678795987879,
              "missingColumns": [],
              "data": {
                "Total Company Count": "148",
                "YC Companies": [
                  {
                    "Company Name": "Coasts",
                    "Description": "Localhost service isolation and orchestration for git worktrees",
                    "Batch": "FALL 2025",
                    "Industry": "B2B",
                    "Company URL": "https://www.ycombinator.com/companies/coasts"
                  },
                  {
                    "Company Name": "Zephyr Fusion",
                    "Description": "Powering tomorrow's industrial revolution in space",
                    "Batch": "FALL 2025",
                    "Industry": "INDUSTRIALS",
                    "Company URL": "https://www.ycombinator.com/companies/zephyr-fusion"
                  },
                  {
                    "Company Name": "Mayflower",
                    "Description": "AI plug-in that automates HR immigration screening and compliance",
                    "Batch": "FALL 2025",
                    "Industry": "GOVERNMENT",
                    "Company URL": "https://www.ycombinator.com/companies/mayflower"
                  }
                ]
              }
            }
          }
        }
      },
      "ColumnNameTaken": {
        "summary": "Column name taken",
        "description": "A column can't be named like a list's limit column, which is the list's name followed by \"Limit\".",
        "value": {
          "statusCode": 400,
          "messageCode": "bad_request",
          "errors": [
            {
              "path": "/schema/properties/YC Companies Limit",
              "message": "\"YC Companies Limit\" clashes with one of the draft's columns or lists, or with the limit column of one. Give this column another name."
            }
          ]
        }
      },
      "DraftUnchanged": {
        "summary": "Nothing to update",
        "description": "The values sent match the latest preview, and no `name` was sent.",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_unchanged"
        }
      },
      "DraftNotEditable": {
        "summary": "Draft already saved",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_not_editable"
        }
      },
      "InvalidDraftId": {
        "summary": "Invalid draft ID",
        "value": {
          "statusCode": 400,
          "messageCode": "invalid_draft_id"
        }
      },
      "NewRobot": {
        "summary": "New robot",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "draft": {
              "id": "8a0c3b1e-5f8e-4f4b-9f39-2a5d6d5a3c11",
              "status": "saved",
              "userFriendlyError": null,
              "robotId": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
              "name": "YC AI companies",
              "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
              "country": "USA",
              "createdAt": 1678795867879,
              "updatedAt": 1678796107879,
              "instructions": "Extract the AI companies in this batch: name, one-line description, batch, and industry.",
              "schema": {
                "type": "object",
                "properties": {
                  "Total Company Count": {
                    "type": "string",
                    "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                  },
                  "YC Companies": {
                    "type": "array",
                    "description": "Every company card in the results",
                    "maxItems": 50,
                    "items": {
                      "type": "object",
                      "properties": {
                        "Company Name": {
                          "type": "string"
                        },
                        "Description": {
                          "type": "string"
                        },
                        "Batch": {
                          "type": "string",
                          "description": "Exactly as displayed, like \"FALL 2025\""
                        },
                        "Industry": {
                          "type": "string",
                          "description": "The first industry tag, like \"B2B\""
                        },
                        "Company URL": {
                          "type": "string",
                          "description": "Link to the company's page on YC"
                        }
                      }
                    }
                  }
                }
              },
              "latestPreview": {
                "finishedAt": 1678795987879,
                "missingColumns": [],
                "data": {
                  "Total Company Count": "148",
                  "YC Companies": [
                    {
                      "Company Name": "Coasts",
                      "Description": "Localhost service isolation and orchestration for git worktrees",
                      "Batch": "FALL 2025",
                      "Industry": "B2B",
                      "Company URL": "https://www.ycombinator.com/companies/coasts"
                    },
                    {
                      "Company Name": "Zephyr Fusion",
                      "Description": "Powering tomorrow's industrial revolution in space",
                      "Batch": "FALL 2025",
                      "Industry": "INDUSTRIALS",
                      "Company URL": "https://www.ycombinator.com/companies/zephyr-fusion"
                    },
                    {
                      "Company Name": "Mayflower",
                      "Description": "AI plug-in that automates HR immigration screening and compliance",
                      "Batch": "FALL 2025",
                      "Industry": "GOVERNMENT",
                      "Company URL": "https://www.ycombinator.com/companies/mayflower"
                    }
                  ]
                }
              }
            },
            "robot": {
              "id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
              "name": "YC AI companies",
              "createdAt": 1678796107879,
              "inputParameters": [
                {
                  "name": "originUrl",
                  "type": "url",
                  "label": "Origin URL",
                  "required": true,
                  "encrypted": false,
                  "defaultValue": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                  "value": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI"
                },
                {
                  "name": "yc_companies_limit",
                  "type": "number",
                  "label": "YC Companies Limit",
                  "required": true,
                  "encrypted": false,
                  "min": 1,
                  "max": 5000,
                  "defaultValue": 50,
                  "value": 50
                }
              ]
            },
            "taskId": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0"
          }
        }
      },
      "RetrainedRobot": {
        "summary": "Retrained robot",
        "description": "Saving a retrain draft writes a new version of the robot in `robotId`. The robot keeps its ID and creation date.",
        "value": {
          "statusCode": 200,
          "messageCode": "success",
          "result": {
            "draft": {
              "id": "b7e1c5d2-0a94-4c3f-8e62-5d9f1a7b2c48",
              "status": "saved",
              "userFriendlyError": null,
              "robotId": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
              "name": "YC AI companies",
              "originUrl": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
              "country": "USA",
              "createdAt": 1678795867879,
              "updatedAt": 1678796107879,
              "instructions": "Only include companies in the B2B industry.",
              "schema": {
                "type": "object",
                "properties": {
                  "Total Company Count": {
                    "type": "string",
                    "description": "The number of companies shown with the results, exactly as displayed, like \"148\" or \"1,200+\""
                  },
                  "YC Companies": {
                    "type": "array",
                    "description": "Every company card in the results",
                    "maxItems": 50,
                    "items": {
                      "type": "object",
                      "properties": {
                        "Company Name": {
                          "type": "string"
                        },
                        "Description": {
                          "type": "string"
                        },
                        "Batch": {
                          "type": "string",
                          "description": "Exactly as displayed, like \"FALL 2025\""
                        },
                        "Industry": {
                          "type": "string",
                          "description": "The first industry tag, like \"B2B\""
                        },
                        "Company URL": {
                          "type": "string",
                          "description": "Link to the company's page on YC"
                        }
                      }
                    }
                  }
                }
              },
              "latestPreview": {
                "finishedAt": 1678795987879,
                "missingColumns": [],
                "data": {
                  "Total Company Count": "148",
                  "YC Companies": [
                    {
                      "Company Name": "Coasts",
                      "Description": "Localhost service isolation and orchestration for git worktrees",
                      "Batch": "FALL 2025",
                      "Industry": "B2B",
                      "Company URL": "https://www.ycombinator.com/companies/coasts"
                    }
                  ]
                }
              }
            },
            "robot": {
              "id": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
              "name": "YC AI companies",
              "createdAt": 1677600000000,
              "inputParameters": [
                {
                  "name": "originUrl",
                  "type": "url",
                  "label": "Origin URL",
                  "required": true,
                  "encrypted": false,
                  "defaultValue": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI",
                  "value": "https://www.ycombinator.com/companies?batch=Fall%202025&tags=AI"
                },
                {
                  "name": "yc_companies_limit",
                  "type": "number",
                  "label": "YC Companies Limit",
                  "required": true,
                  "encrypted": false,
                  "min": 1,
                  "max": 5000,
                  "defaultValue": 50,
                  "value": 50
                }
              ]
            },
            "taskId": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0"
          }
        }
      },
      "NotSavableInProgress": {
        "summary": "Preview still in progress",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_not_savable",
          "errors": [
            {
              "message": "This draft can't be saved until its preview is done.",
              "metadata": {
                "status": "in_progress",
                "missingColumns": []
              }
            }
          ]
        }
      },
      "NotSavablePartiallyReady": {
        "summary": "Preview partially ready",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_not_savable",
          "errors": [
            {
              "message": "This draft can't be saved because its preview didn't find every column. Update the schema or instructions to run a new preview.",
              "metadata": {
                "status": "partially_ready",
                "missingColumns": [
                  "/schema/properties/YC Companies/items/properties/Industry"
                ]
              }
            }
          ]
        }
      },
      "NotSavableFailed": {
        "summary": "Preview failed",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_not_savable",
          "errors": [
            {
              "message": "This draft can't be saved because its preview failed. Update the draft to run a new preview.",
              "metadata": {
                "status": "failed",
                "missingColumns": []
              }
            }
          ]
        }
      },
      "AlreadySaved": {
        "summary": "Draft already saved",
        "value": {
          "statusCode": 400,
          "messageCode": "draft_already_saved"
        }
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Core Resources",
      "tags": [
        "system",
        "robots",
        "robot drafts",
        "tasks",
        "monitors",
        "webhooks",
        "bulk runs"
      ]
    }
  ]
}