{"openapi":"3.1.0","info":{"title":"Tellstack API","version":"1.0.0","description":"What any website is built with: technologies with categories, versions, confidence and the evidence that gave them away; bulk lookups; lists of sites using a technology; change history and webhooks. Every request carries an API key as Authorization: Bearer tsk_…","contact":{"email":"admin@onibaku.co.uk"}},"servers":[{"url":"https://tellstack.onibaku.co.uk"}],"security":[{"bearer":[]}],"tags":[{"name":"Lookups","description":"One domain at a time, from the index or scanned live."},{"name":"Jobs","description":"Bulk lookups of up to 10,000 domains, persisted and resumable."},{"name":"Technologies","description":"The fingerprint catalogue and sites using each technology."},{"name":"Watches","description":"Hear about stack changes on a site, or new sites adopting a technology."},{"name":"Webhooks","description":"Signed event deliveries with retries."},{"name":"Keys","description":"API keys with scopes, expiry and rotation."},{"name":"Account","description":"Plan and credit usage."}],"paths":{"/v1/openapi.json":{"get":{"tags":["Account"],"summary":"This OpenAPI document.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[]}},"/v1/me":{"get":{"tags":["Account"],"summary":"The key’s workspace, scopes and usage.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"}},"/v1/usage":{"get":{"tags":["Account"],"summary":"Credits and watches used this month.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"}},"/v1/lookup":{"get":{"tags":["Lookups"],"summary":"Technologies on a domain.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Not enough credits or watches left on the plan","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"The scan failed on our side; the credit is refunded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"One credit. Served from the index when the last scan is newer than maxAge days, otherwise scanned live (a few seconds). Sites that block or challenge our crawler come back with status \"blocked\" and whatever DNS shows.","x-scope":"lookup","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"example":"example.com"},{"name":"maxAge","in":"query","schema":{"type":"integer","minimum":0,"maximum":365,"default":30},"description":"Days; 0 always scans live."}]}},"/v1/domains/{domain}/history":{"get":{"tags":["Lookups"],"summary":"Technologies added, removed or upgraded on a domain over time.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/History"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}]}},"/v1/jobs":{"get":{"tags":["Jobs"],"summary":"Your bulk jobs, newest first.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}]},"post":{"tags":["Jobs"],"summary":"Start a bulk lookup.","responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewJob"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Not enough credits or watches left on the plan","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"A credit per distinct valid domain, charged up front. Send JSON, or text/csv with one domain per line.","x-scope":"lookup","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domains"],"properties":{"domains":{"type":"array","items":{"type":"string"},"maxItems":10000},"name":{"type":"string"},"maxAge":{"type":"integer","minimum":0,"maximum":365,"default":30}}}},"text/csv":{"schema":{"type":"string"}}}}}},"/v1/jobs/{id}":{"get":{"tags":["Jobs"],"summary":"A job’s progress.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/v1/jobs/{id}/results":{"get":{"tags":["Jobs"],"summary":"A job’s results, as JSON or CSV.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResults"}},"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"format","in":"query","schema":{"enum":["json","csv"]}},{"name":"evidence","in":"query","schema":{"type":"boolean"},"description":"Include evidence (JSON only)."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}]}},"/v1/categories":{"get":{"tags":["Technologies"],"summary":"Technology categories.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"}},"/v1/technologies":{"get":{"tags":["Technologies"],"summary":"The technologies we detect, most used first.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TechnologySummary"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"},"description":"Category slug."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}]}},"/v1/technologies/{slug}":{"get":{"tags":["Technologies"],"summary":"One technology, with how many indexed sites use it.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechnologyDetail"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/technologies/{slug}/sites":{"get":{"tags":["Technologies"],"summary":"Sites using a technology, most popular first.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sites"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Not enough credits or watches left on the plan","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"A credit per 10 rows returned. The free plan sees the first 25 rows; total is always the full count.","x-scope":"lookup","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string","format":"date"},"description":"Only sites first seen using it on or after this date."},{"name":"tld","in":"query","schema":{"type":"string"},"description":"e.g. uk or co.uk"},{"name":"minConfidence","in":"query","schema":{"type":"integer","minimum":0,"maximum":100,"default":50}},{"name":"format","in":"query","schema":{"enum":["json","csv"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}]}},"/v1/watches":{"get":{"tags":["Watches"],"summary":"Your watches.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Watch"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"},"post":{"tags":["Watches"],"summary":"Watch a domain or a technology.","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watch"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Not enough credits or watches left on the plan","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"A watched domain is rescanned weekly and fires domain.changed. A watched technology fires technology.added when a site we already knew starts using it.","x-scope":"watches:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"technology":{"type":"string","description":"Slug"}}}}}}}},"/v1/watches/{id}":{"delete":{"tags":["Watches"],"summary":"Stop watching.","responses":{"204":{"description":"Deleted"},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"watches:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Your webhooks.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"},"post":{"tags":["Webhooks"],"summary":"Add a webhook. The signing secret is shown once.","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewWebhook"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"webhooks:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"enum":["domain.changed","technology.added","job.completed"]}}}}}}}}},"/v1/webhooks/{id}":{"delete":{"tags":["Webhooks"],"summary":"Remove a webhook.","responses":{"204":{"description":"Deleted"},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"webhooks:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"The last 50 deliveries.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/v1/keys":{"get":{"tags":["Keys"],"summary":"Your API keys (never the secret).","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"read"},"post":{"tags":["Keys"],"summary":"Create a key. The key is shown once.","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewKey"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"keys:write","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"enum":["read","lookup","watches:write","webhooks:write","keys:write"]}},"expiresInDays":{"type":"integer","minimum":1,"maximum":3650}}}}}}}},"/v1/keys/{id}/rotate":{"post":{"tags":["Keys"],"summary":"Rotate a key: a new one now, the old one expires after graceHours (default 24).","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/NewKey"},{"type":"object","properties":{"previous":{"$ref":"#/components/schemas/Key"}}}]}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"keys:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"graceHours":{"type":"integer","minimum":0,"maximum":720}}}}}}}},"/v1/keys/{id}":{"delete":{"tags":["Keys"],"summary":"Revoke a key now.","responses":{"204":{"description":"Deleted"},"401":{"description":"Missing or invalid key","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"x-scope":"keys:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Problem":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}},"Usage":{"type":"object","required":["plan","creditsPerMonth","creditsUsed","creditsLeft","watchesAllowed","watchesUsed"],"properties":{"plan":{"enum":["free","pro"]},"blocks":{"type":"integer"},"creditsPerMonth":{"type":"integer"},"creditsUsed":{"type":"integer"},"creditsLeft":{"type":"integer"},"watchesAllowed":{"type":"integer"},"watchesUsed":{"type":"integer"},"listRowsCap":{"type":["integer","null"]},"history":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string"},"credits":{"type":"integer"}}}}}},"Me":{"type":"object","required":["workspaceId","email","scopes","usage"],"properties":{"workspaceId":{"type":"integer"},"email":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"usage":{"$ref":"#/components/schemas/Usage"}}},"Evidence":{"type":"object","required":["type"],"properties":{"type":{"enum":["url","html","text","css","scriptSrc","scripts","meta","dom","headers","cookies","robots","dns","certIssuer","implied"]},"key":{"type":"string","description":"Header, cookie, meta name, selector, DNS record type, or the implying technology"},"match":{"type":"string","description":"The text that matched, trimmed"},"url":{"type":"string"}}},"Technology":{"type":"object","required":["name","slug","categories","version","confidence"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"version":{"type":["string","null"]},"confidence":{"type":"integer","minimum":0,"maximum":100},"website":{"type":["string","null"]},"firstSeen":{"type":"string","format":"date-time"},"lastSeen":{"type":"string","format":"date-time"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/Evidence"}}}},"Lookup":{"type":"object","required":["domain","status","technologies"],"properties":{"domain":{"type":"string"},"status":{"enum":["ok","blocked","robots","error","pending"],"description":"ok: we read the site. blocked: it challenged or rate-limited us. robots: robots.txt disallows us. error: unreachable or an error page."},"reason":{"type":["string","null"]},"httpStatus":{"type":["integer","null"]},"finalUrl":{"type":["string","null"]},"scannedAt":{"type":["string","null"]},"cached":{"type":"boolean","description":"Served from the index rather than scanned for this request"},"technologies":{"type":"array","items":{"$ref":"#/components/schemas/Technology"}}}},"History":{"type":"object","required":["domain","data"],"properties":{"domain":{"type":"string"},"lastOkAt":{"type":["string","null"]},"data":{"type":"array","items":{"type":"object","required":["technology","kind","at"],"properties":{"technology":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}}},"kind":{"enum":["added","removed","version"]},"version":{"type":["string","null"]},"previousVersion":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}},"Job":{"type":"object","required":["id","status","total","done","createdAt"],"properties":{"id":{"type":"integer"},"name":{"type":["string","null"]},"status":{"enum":["running","done"]},"total":{"type":"integer"},"done":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"]},"resultsUrl":{"type":"string"}}},"NewJob":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","properties":{"rejected":{"type":"array","items":{"type":"string"},"description":"Lines that weren’t domains (not charged)"}}}]},"JobResults":{"type":"object","required":["job","data"],"properties":{"job":{"$ref":"#/components/schemas/Job"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Lookup"}}}},"Category":{"type":"object","required":["id","slug","name"],"properties":{"id":{"type":"integer"},"slug":{"type":"string"},"name":{"type":"string"},"priority":{"type":"integer"},"technologies":{"type":"integer"}}},"TechnologySummary":{"type":"object","required":["name","slug","categories","sites"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"website":{"type":["string","null"]},"sites":{"type":"integer","description":"Indexed sites using it"}}},"TechnologyDetail":{"type":"object","required":["name","slug","categories","sites","versions"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"website":{"type":["string","null"]},"description":{"type":["string","null"]},"saas":{"type":["boolean","null"]},"oss":{"type":["boolean","null"]},"sites":{"type":"integer"},"versions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"sites":{"type":"integer"}}}}}},"Sites":{"type":"object","required":["technology","data","total"],"properties":{"technology":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}}},"data":{"type":"array","items":{"type":"object","required":["domain","confidence","firstSeen"],"properties":{"domain":{"type":"string"},"rank":{"type":["integer","null"]},"version":{"type":["string","null"]},"confidence":{"type":"integer"},"firstSeen":{"type":"string"},"lastSeen":{"type":"string"}}}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"planRowCap":{"type":["integer","null"]}}},"Watch":{"type":"object","required":["id","createdAt"],"properties":{"id":{"type":"integer"},"domain":{"type":"string"},"technology":{"type":"string"},"createdAt":{"type":"string"}}},"Webhook":{"type":"object","required":["id","url","events","createdAt"],"properties":{"id":{"type":"integer"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"lastStatus":{"type":["integer","null"]},"lastError":{"type":["string","null"]},"lastAttemptAt":{"type":["string","null"]}}},"NewWebhook":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"type":"object","required":["secret"],"properties":{"secret":{"type":"string"}}}]},"Delivery":{"type":"object","properties":{"id":{"type":"integer"},"event":{"type":"string"},"status":{"enum":["pending","sending","delivered","failed"]},"attempts":{"type":"integer"},"lastStatus":{"type":["integer","null"]},"createdAt":{"type":"string"}}},"Key":{"type":"object","required":["id","name","scopes","prefix","createdAt"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"prefix":{"type":"string"},"createdAt":{"type":"string"},"expiresAt":{"type":["string","null"]},"lastUsedAt":{"type":["string","null"]},"requestCount":{"type":"integer"}}},"NewKey":{"allOf":[{"$ref":"#/components/schemas/Key"},{"type":"object","required":["key"],"properties":{"key":{"type":"string"}}}]}}}}