{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"sfbay.craigslist.org API — compiled by Unbrowse","version":"2026.09.28","summary":"Call sfbay.craigslist.org's own capabilities over HTTP, without a browser.","description":"The first-party capabilities of sfbay.craigslist.org, compiled from the site's own requests. Each tool is one POST with its inputs as a JSON body; the answer is the run, with the site's result when it is verified. Only verified results bill. The same tools are an MCP server at https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/mcp. Unofficial: not made or endorsed by sfbay.craigslist.org.","contact":{"name":"Unbrowse","url":"https://unbrowse.ai"}},"externalDocs":{"description":"Calling an indexed website","url":"https://unbrowse.ai/docs/site-apis"},"servers":[{"url":"https://unbrowse.ai","description":"Unbrowse"}],"security":[{"bearer":[]}],"tags":[{"name":"sfbay.craigslist.org","description":"Tools compiled from sfbay.craigslist.org"}],"paths":{"/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_field_price":{"post":{"operationId":"sfbay_craigslist_org__get_field_price","summary":"Read field price on sfbay.craigslist.org — SF bay area apartments / housing for rent - craigslist","description":"Read field price on sfbay.craigslist.org — SF bay area apartments / housing for rent - craigslist. Compiled from sfbay.craigslist.org's own requests and shared by an Unbrowse user. Inputs: max_price (optional). Returns data. Read-only on sfbay.craigslist.org.","tags":["sfbay.craigslist.org"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"max_price":{"type":"integer","description":"max price","default":"2500"},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":[],"additionalProperties":false},"example":{"max_price":2500}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"data":{"type":"object","properties":{"values":{"type":"array","items":{"type":"integer"}},"error":{"type":"string"}},"required":["values","error"]}},"required":["data"]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_field_price' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"max_price\":2500}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"sfbay.craigslist.org\", \"sfbay_craigslist_org__get_field_price\", {\n  max_price: 2500,\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_field_price\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"max_price\": 2500,\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.sfbay_craigslist_org.get_field_price","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.28"}},"/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_search_full":{"post":{"operationId":"sfbay_craigslist_org__get_search_full","summary":"Read search full on sfbay.craigslist.org — SF bay area apartments / housing for rent - craigslist","description":"Read search full on sfbay.craigslist.org — SF bay area apartments / housing for rent - craigslist. Compiled from sfbay.craigslist.org's own requests and shared by an Unbrowse user. Inputs: name; max_price. Also takes the site's own parameters, each optional (left out, the recorded value is sent): batch (recorded: \"0-0-360-0-0\"); searchPath (recorded: \"area/sfbay\"); cc (recorded: \"us\"). Returns apiVersion, configId, configTs, data, errors. A large answer comes back as its records at data.hubLinks (as results); pass select for other parts. Read-only on sfbay.craigslist.org.","tags":["sfbay.craigslist.org"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"},"max_price":{"type":"integer","description":"max price"},"batch":{"type":"string","description":"Optional: the site's own batch parameter (get_search_full). Left out, \"0-0-360-0-0\" is sent, as recorded.","default":"0-0-360-0-0"},"searchPath":{"type":"string","description":"Optional: the site's own searchPath parameter (get_search_full). Left out, \"area/sfbay\" is sent, as recorded.","default":"area/sfbay"},"cc":{"type":"string","description":"Optional: the site's own cc parameter (get_search_full). Left out, \"us\" is sent, as recorded.","default":"us"},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing. Left out on a large answer, its records at data.hubLinks come back as results (the rest is named in projection).","examples":[["data.hubLinks[]"]]},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":["name","max_price"],"additionalProperties":false}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"apiVersion":{"type":"integer"},"configId":{"type":"string"},"configTs":{"type":"integer"},"data":{"type":"object","properties":{"areas":{"type":"object","properties":{"1":{"type":"object","properties":{"areaUnits":{"type":"string"},"currency":{"type":"string"},"distanceUnits":{"type":"string"},"name":{"type":"string"}},"required":["areaUnits","currency","distanceUnits","name"]}},"required":["1"]},"bundleDups":{"type":"integer"},"cacheTs":{"type":"integer"},"canonicalUrl":{"type":"string"},"categoryAbbr":{"type":"string"},"decode":{"type":"object","properties":{"locationDescriptions":{"type":"array","items":{"type":["integer","string"]}},"locations":{"type":"array","items":{"type":["integer","array"]}},"maxPostedDate":{"type":"integer"},"minDate":{"type":"integer"},"minPostedDate":{"type":"integer"},"minPostingId":{"type":"integer"},"neighborhoods":{"type":"array","items":{"type":["integer","string"]}},"version":{"type":"integer"}},"required":["locationDescriptions","locations","maxPostedDate","minDate","minPostedDate","minPostingId","neighborhoods","version"]},"detailsOrder":{"type":"string"},"filterButtons":{"type":"array","items":{"type":"object","properties":{"buttonLabel":{"type":"string"},"formConfig":{"type":"object","properties":{"input_prefix":{"type":"string"},"is_default_button":{"type":"integer"},"label":{"type":"string"},"maxVal":{"type":"object"},"minVal":{"type":"object"},"name":{"type":"string"},"type":{"type":"string"},"variant":{"type":"string"},"options":{"type":"array","items":{"type":"object"}},"value":{"type":"integer"}},"required":["is_default_button","label","type"]},"isSet":{"type":["integer","string"]}},"required":["buttonLabel","formConfig","isSet"]}},"filters":{"type":"array","items":{"type":"object","properties":{"autocomplete":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"object"}},"value":{"type":"string"},"input_prefix":{"type":"string"},"maxVal":{"type":"object","properties":{"name":{"type":"string"},"placeholder":{"type":"string"}},"required":["name","placeholder"]},"minVal":{"type":"object","properties":{"name":{"type":"string"},"placeholder":{"type":"string"}},"required":["name","placeholder"]},"variant":{"type":"string"},"form":{"type":"array","items":{"type":"object"}}},"required":["type"]}},"hubLinks":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string"},"linkText":{"type":"string"},"name":{"type":"string"},"title":{"type":"string"}},"required":["href","linkText","name","title"]}},"humanReadableParams":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}},"required":["key","name","value"]}},"items":{"type":"array","items":{"type":"array","items":{"type":["integer","string","array"]}}},"lang":{"type":"string"},"location":{"type":"object","properties":{"areaId":{"type":"integer"},"city":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"postal":{"type":"string"},"radius":{"type":"integer"},"region":{"type":"string"},"url":{"type":"string"}},"required":["areaId","city","country","lat","lon","postal","radius","region","url"]},"pageTitle":{"type":"string"},"params":{"type":"object","properties":{"cat":{"type":"string"},"max_price":{"type":"string"},"query":{"type":"string"}},"required":["cat","max_price","query"]},"relatedSearches":{"type":"array"},"resultsOrder":{"type":"string"},"totalResultCount":{"type":"integer"},"updated":{"type":"integer"},"vicinity":{"type":"null"}},"required":["areas","bundleDups","cacheTs","canonicalUrl","categoryAbbr","decode","detailsOrder","filterButtons","filters","hubLinks","humanReadableParams","items","lang","location","pageTitle","params","relatedSearches","resultsOrder","totalResultCount","updated","vicinity"]},"errors":{"type":"array"}},"required":["apiVersion","configId","configTs","data","errors"]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_search_full' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"name\":\"<name>\",\"max_price\":1}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"sfbay.craigslist.org\", \"sfbay_craigslist_org__get_search_full\", {\n  name: \"<name>\",\n  max_price: 1,\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__get_search_full\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"name\": \"<name>\",\n        \"max_price\": 1,\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.sfbay_craigslist_org.get_search_full","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.28"}},"/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__read_page":{"post":{"operationId":"sfbay_craigslist_org__read_page","summary":"Read a craigslist.org page by max_price","description":"Read a craigslist.org page by max_price. Compiled from sfbay.craigslist.org's own requests and shared by an Unbrowse user. Inputs: max_price. Also takes the site's own parameters, each optional (left out, the recorded value is sent): availabilityMode (recorded: 0); cat (recorded: \"apa\"). Returns the page's title, readable text and links. A large answer comes back as its records at data (as results); pass select for other parts. Read-only on sfbay.craigslist.org.","tags":["sfbay.craigslist.org"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"max_price":{"type":"string","description":"max_price — the part of the craigslist.org address that changes"},"availabilityMode":{"type":"integer","description":"Optional: the site's own availabilityMode parameter in the address (read_page). Left out, 0 is sent, as recorded.","default":0},"cat":{"type":"string","description":"Optional: the site's own cat parameter in the address (read_page). Left out, \"apa\" is sent, as recorded.","default":"apa"},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing. Left out on a large answer, its records at data come back as results (the rest is named in projection).","examples":[["data[]"]]},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":["max_price"],"additionalProperties":false}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"item":{"type":"object","properties":{"address":{"type":"object","properties":{"@type":{"type":"string"},"streetAddress":{"type":"string"},"postalCode":{"type":"string"},"addressLocality":{"type":"string"},"addressRegion":{"type":"string"},"addressCountry":{"type":"string"}},"required":["streetAddress","postalCode","addressLocality","@type","addressRegion","addressCountry"]},"@context":{"type":"string"},"numberOfBedrooms":{"type":"integer"},"numberOfBathroomsTotal":{"type":"integer"},"@type":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["@context","address","numberOfBedrooms","numberOfBathroomsTotal","@type","name","longitude","latitude"]},"position":{"type":"string"},"@type":{"type":"string"}},"required":["item","position","@type"]}},"title":{"type":"string"},"text":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"href":{"type":"string"}},"required":["text","href"]}},"images":{"type":"array","items":{"type":"object","properties":{"alt":{"type":"string"},"src":{"type":"string"}},"required":["alt","src"]}}},"required":["data","title","text","links","images"]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__read_page' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"max_price\":\"<max_price>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"sfbay.craigslist.org\", \"sfbay_craigslist_org__read_page\", {\n  max_price: \"<max_price>\",\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__read_page\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"max_price\": \"<max_price>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.sfbay_craigslist_org.read_page","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}},"/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__render_page":{"post":{"operationId":"sfbay_craigslist_org__render_page","summary":"Search craigslist.org","description":"Search craigslist.org. Compiled from sfbay.craigslist.org's own requests and shared by an Unbrowse user. Inputs: max. Also takes the site's own parameters, each optional (left out, the recorded value is sent): cat (recorded: \"apa\"). Returns the page's title, readable text and links. Read-only on sfbay.craigslist.org.","tags":["sfbay.craigslist.org"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/Deadline"},{"$ref":"#/components/parameters/EndUser"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"max":{"type":"string","description":"max — what to search for on craigslist.org"},"cat":{"type":"string","description":"Optional: the site's own cat parameter in the address (render_page). Left out, \"apa\" is sent, as recorded.","default":"apa"},"select":{"type":"array","items":{"type":"string"},"description":"Keep only these parts of the result: dots walk keys, [] maps over a list, a final {a,b} keeps several keys (e.g. \"results[].{title,url}\"). Unmatched paths come back in selectMissing."},"deadlineMs":{"type":"integer","minimum":5000,"maximum":300000,"default":60000,"description":"Answer within this many ms (5,000–300,000). Past it: 504 run_timeout with a runId to poll; the run keeps going. The x-unbrowse-deadline-ms header wins."}},"required":["max"],"additionalProperties":false}}}},"responses":{"200":{"description":"The run finished: `status` succeeded carries the site's verified `result`; failed carries `error` (never billed).","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{"type":"object","properties":{"title":{"type":"string"},"text":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"href":{"type":"string"}},"required":["text","href"]}}},"required":["title","text","links"]},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true}}}},"202":{"description":"The run needs input (`status` input_required): answer `requirements` with POST /api/v1/runs/{runId}/responses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"400":{"description":"The body is not JSON, or a value is malformed (invalid_input, bad_request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or an invalid one: send Authorization: Bearer <key>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of verified calls this month (quota_exceeded) or out of paid credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tool on this site (not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The tool is quarantined (tool_quarantined): it failed its checks and is rechecked automatically; the message says what to use now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An input the tool does not take (unknown_argument): the message lists the ones it does.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (by the site or by Unbrowse): retry after the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"run_timeout: the run did not finish within its deadline. It keeps going: poll the given runId. A verified success is billed once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimeout"}}}}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__render_page' \\\n  -H \"authorization: Bearer $UNBROWSE_API_KEY\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\"max\":\"<max>\"}'"},{"lang":"TypeScript","label":"TypeScript","source":"import { Unbrowse } from \"@unbrowse/sdk\";\n\nconst ub = new Unbrowse(); // reads UNBROWSE_API_KEY\nconst run = await ub.callTool(\"sfbay.craigslist.org\", \"sfbay_craigslist_org__render_page\", {\n  max: \"<max>\",\n});\nif (run.status === \"succeeded\") console.log(run.result);"},{"lang":"Python","label":"Python","source":"import os, requests\n\nr = requests.post(\n    \"https://unbrowse.ai/api/v1/sites/sfbay.craigslist.org/call/sfbay_craigslist_org__render_page\",\n    headers={\"Authorization\": f\"Bearer {os.environ['UNBROWSE_API_KEY']}\"},\n    json={\n        \"max\": \"<max>\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nrun = r.json()\nif run[\"status\"] == \"succeeded\":\n    print(run[\"result\"])"}],"x-unbrowse-capability":"public.sfbay_craigslist_org.render_page","x-unbrowse-read-only":true,"x-unbrowse-version":"2026.09.22.1"}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An Unbrowse API key (ub_live_…, from https://unbrowse.ai/app/keys) or an OAuth access token."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Makes a retry safe: a repeat with the same key returns the same run instead of starting another."},"Deadline":{"name":"x-unbrowse-deadline-ms","in":"header","required":false,"schema":{"type":"integer","minimum":5000,"maximum":300000,"default":60000},"description":"Answer within this many ms; past it 504 run_timeout (the run keeps going). Same as deadlineMs in the body."},"EndUser":{"name":"X-Unbrowse-End-User","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"With an org key: run as this end user, in their own workspace with their own logins."}},"schemas":{"Run":{"type":"object","properties":{"runId":{"type":"string","description":"The run, for unbrowse_inspect / resume / cancel"},"status":{"type":"string","enum":["succeeded","input_required","failed","outcome_unknown","cancelled","working","accepted","expired"],"description":"succeeded carries the site's result; input_required lists what to answer (unbrowse_resume)"},"capabilityId":{"type":["string","null"]},"result":{},"error":{"type":["object","null"]},"requirements":{"type":"array"},"via":{"type":["string","null"],"enum":["http","rendered",null]}},"required":["runId","status"],"additionalProperties":true},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable, e.g. not_found, unknown_argument, quota_exceeded, run_timeout"},"message":{"type":"string","description":"What happened and what to do, in plain words"}},"additionalProperties":true}},"additionalProperties":true},"RunTimeout":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","runId","poll"],"properties":{"code":{"type":"string","const":"run_timeout"},"message":{"type":"string"},"runId":{"type":"string"},"deadlineMs":{"type":"integer"},"poll":{"type":"string","description":"GET this to read the run's answer when it lands"}},"additionalProperties":true}},"additionalProperties":true}}}}