{"openapi":"3.1.0","info":{"title":"Timbrica API","version":"v1","summary":"Run Timbrica tools programmatically, paid per call from a prepaid token balance.","description":"Every call is charged in prepaid tokens. Price a call before spending with `POST \/v1\/tools\/{slug}\/estimate`.\n\nSend `Idempotency-Key` on every run: a retried call returns the original result instead of charging twice.\n\nSome tools offer a `browser` lane \u2014 your own browser or agent does the work and we only issue a paid work order. Those runs answer `202` with a `work_order`.\n\nErrors are RFC 9457 problem+json and carry `code`, `hint` and `retryable`.","contact":{"url":"https:\/\/tembrica.com\/docs\/api"}},"servers":[{"url":"https:\/\/tembrica.com","description":"Current shard"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Discovery","description":"Catalogue and contracts. No key required."},{"name":"Runs","description":"Executing tools and inspecting past executions."},{"name":"Account","description":"Identity, balance and usage."},{"name":"Tools","description":"One operation per tool, generated from the manifest."}],"paths":{"\/v1\/tools":{"get":{"tags":["Discovery"],"summary":"List callable tools","security":[],"parameters":[{"name":"lane","in":"query","required":false,"description":"Filter by lane.","schema":{"type":"string","enum":["browser","server","headless"]}},{"name":"status","in":"query","required":false,"description":"Filter by contract status.","schema":{"type":"string","enum":["alpha","beta","stable","deprecated"]}}],"responses":{"200":{"description":"Catalogue","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/tools\/{slug}":{"get":{"tags":["Discovery"],"summary":"Full contract for one tool","security":[],"parameters":[{"name":"slug","in":"path","required":true,"description":"Tool slug from GET \/v1\/tools.","schema":{"type":"string"}}],"responses":{"200":{"description":"Tool contract","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/runs":{"get":{"tags":["Runs"],"summary":"List this key's runs","parameters":[{"name":"status","in":"query","required":false,"description":"Filter by status.","schema":{"type":"string"}},{"name":"tool","in":"query","required":false,"description":"Filter by tool slug.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max rows (1-100).","schema":{"type":"string"}}],"responses":{"200":{"description":"Runs","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/runs\/{id}":{"get":{"tags":["Runs"],"summary":"Fetch one run","parameters":[{"name":"id","in":"path","required":true,"description":"Run id (ULID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"404":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}},"delete":{"tags":["Runs"],"summary":"Cancel an in-flight run and release its hold","parameters":[{"name":"id","in":"path","required":true,"description":"Run id (ULID).","schema":{"type":"string"}}],"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"409":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/account":{"get":{"tags":["Account"],"summary":"Key, plan and limits","responses":{"200":{"description":"Account","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/balance":{"get":{"tags":["Account"],"summary":"Token balance and per-lane spendable pool","description":"Use `spendable_by_lane`, not `available`: some tokens (welcome grants) do not fund API traffic.","responses":{"200":{"description":"Balance","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/usage":{"get":{"tags":["Account"],"summary":"Runs and tokens over a period","parameters":[{"name":"from","in":"query","required":false,"description":"ISO date.","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"ISO date.","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Grouping.","schema":{"type":"string","enum":["day","tool"]}}],"responses":{"200":{"description":"Usage","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/billing\/topup_link":{"post":{"tags":["Account"],"summary":"Get a top-up link to hand to the account owner","description":"Card authentication (3-D Secure) cannot be completed by an agent, so funding always needs a human once.","responses":{"200":{"description":"Top-up link","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/feedback":{"post":{"tags":["Feedback"],"summary":"Report a problem or request a tool","description":"Free \u2014 reporting a defect never costs tokens. Telemetry already records what happened; this is for what it cannot infer: a call that succeeded with a wrong result, a schema that does not match reality, a tool we do not have yet. Quote `run_id` when a specific call misbehaved \u2014 it links your report to our full server-side record of it.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["type","message"],"properties":{"type":{"type":"string","enum":["bug","tool_request","docs","other"],"description":"bug = it misbehaved \u00b7 tool_request = please add one \u00b7 docs = the documentation is wrong."},"tool":{"type":"string","description":"Tool slug, when the report is about one."},"run_id":{"type":"string","description":"A run of yours that shows the problem. Must belong to your account."},"message":{"type":"string","maxLength":4000},"expected":{"type":"string","maxLength":2000},"actual":{"type":"string","maxLength":2000},"contact":{"type":"string","format":"email","description":"Where to reply. Defaults to the account email."}}}}}},"responses":{"201":{"description":"Received","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/v1\/tools\/dns-lookup\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_dns_lookup","summary":"Price a dns-lookup call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Domain name to resolve.","maxLength":253,"examples":["example.com"]},"type":{"type":"string","description":"DNS record type.","enum":["A","AAAA","MX","CNAME","NS","TXT","SOA","SRV","CAA","PTR"],"default":"A"},"resolver":{"type":"string","enum":["google","cloudflare","quad9"],"default":"google"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/dns-lookup\/runs":{"post":{"tags":["Tools"],"operationId":"run_dns_lookup","summary":"Resolve DNS records for a domain through Google, Cloudflare or Quad9 DoH.","description":"Server-side DNS-over-HTTPS proxy. Useful when the caller has no unrestricted outbound DNS, or wants to compare answers across resolvers.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Domain name to resolve.","maxLength":253,"examples":["example.com"]},"type":{"type":"string","description":"DNS record type.","enum":["A","AAAA","MX","CNAME","NS","TXT","SOA","SRV","CAA","PTR"],"default":"A"},"resolver":{"type":"string","enum":["google","cloudflare","quad9"],"default":"google"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/ssl-checker\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_ssl_checker","summary":"Price a ssl-checker call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["host"],"additionalProperties":false,"properties":{"host":{"type":"string","description":"Hostname to inspect. No scheme, no path.","maxLength":253,"examples":["example.com"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/ssl-checker\/runs":{"post":{"tags":["Tools"],"operationId":"run_ssl_checker","summary":"Inspect a host TLS certificate: issuer, validity window, chain and expiry.","description":"Opens a TLS connection to port 443 and reports the presented certificate. Hosts resolving only to private address space are refused.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["host"],"additionalProperties":false,"properties":{"host":{"type":"string","description":"Hostname to inspect. No scheme, no path.","maxLength":253,"examples":["example.com"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/whois-lookup\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_whois_lookup","summary":"Price a whois-lookup call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["domain"],"additionalProperties":false,"properties":{"domain":{"type":"string","description":"Domain name to look up. No scheme, no path.","maxLength":253,"examples":["example.com"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/whois-lookup\/runs":{"post":{"tags":["Tools"],"operationId":"run_whois_lookup","summary":"Look up domain registration data over RDAP.","description":"Registrar, status codes, creation and expiry dates and name servers, read from the registry over RDAP rather than scraped WHOIS text.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["domain"],"additionalProperties":false,"properties":{"domain":{"type":"string","description":"Domain name to look up. No scheme, no path.","maxLength":253,"examples":["example.com"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/ip-lookup\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_ip_lookup","summary":"Price a ip-lookup call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["query"],"additionalProperties":false,"properties":{"query":{"type":"string","description":"IPv4\/IPv6 address or host name.","maxLength":253,"examples":["8.8.8.8","example.com"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/ip-lookup\/runs":{"post":{"tags":["Tools"],"operationId":"run_ip_lookup","summary":"Geolocation, network and ASN data for an IP address or host name.","description":"Accepts an IPv4\/IPv6 address or a host name (resolved first). Private and reserved addresses are refused.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["query"],"additionalProperties":false,"properties":{"query":{"type":"string","description":"IPv4\/IPv6 address or host name.","maxLength":253,"examples":["8.8.8.8","example.com"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/redirect-checker\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_redirect_checker","summary":"Price a redirect-checker call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","description":"Absolute http(s) URL to follow.","maxLength":2000,"examples":["https:\/\/example.com\/"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/redirect-checker\/runs":{"post":{"tags":["Tools"],"operationId":"run_redirect_checker","summary":"Follow a URL hop by hop and report the whole redirect chain.","description":"Every hop is reported with its status code and target. Each hop is also validated: a redirect into private address space is refused rather than followed.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","description":"Absolute http(s) URL to follow.","maxLength":2000,"examples":["https:\/\/example.com\/"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/cookie-checker\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_cookie_checker","summary":"Price a cookie-checker call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["target"],"additionalProperties":false,"properties":{"target":{"type":"string","description":"Absolute http(s) URL of the page to inspect.","maxLength":2000,"examples":["https:\/\/example.com\/"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/cookie-checker\/runs":{"post":{"tags":["Tools"],"operationId":"run_cookie_checker","summary":"List the cookies a page sets, with their flags.","description":"Fetches the page server-side and reports each cookie with Secure, HttpOnly and SameSite \u2014 useful for compliance checks and audits.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["target"],"additionalProperties":false,"properties":{"target":{"type":"string","description":"Absolute http(s) URL of the page to inspect.","maxLength":2000,"examples":["https:\/\/example.com\/"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/profanity-check\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_profanity_check","summary":"Price a profanity-check call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","description":"Text to analyse.","minLength":1,"maxLength":50000},"strictness":{"type":"string","description":"slurs = only slurs; standard = slurs + profanity; all = includes euphemisms.","enum":["slurs","standard","all"],"default":"standard"},"mode":{"type":"string","description":"How matches are masked in the returned copy.","enum":["dot","star","remove","first"],"default":"dot"},"scope":{"type":"string","enum":["text","name"],"default":"text"},"categories":{"type":"array","description":"Restrict detection to these categories. Omit for all.","items":{"type":"string","enum":["ethnic","homophobic","ableist","religious","sexual","insult","profanity","euphemism"]}}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/profanity-check\/runs":{"post":{"tags":["Tools"],"operationId":"run_profanity_check","summary":"Detect and mask profanity, slurs and abusive language in a text.","description":"Returns a masked copy, severity-tagged segments, per-category counts and an overall verdict. The slur dictionary itself is never exposed, and the submitted text is not stored or logged.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","description":"Text to analyse.","minLength":1,"maxLength":50000},"strictness":{"type":"string","description":"slurs = only slurs; standard = slurs + profanity; all = includes euphemisms.","enum":["slurs","standard","all"],"default":"standard"},"mode":{"type":"string","description":"How matches are masked in the returned copy.","enum":["dot","star","remove","first"],"default":"dot"},"scope":{"type":"string","enum":["text","name"],"default":"text"},"categories":{"type":"array","description":"Restrict detection to these categories. Omit for all.","items":{"type":"string","enum":["ethnic","homophobic","ableist","religious","sexual","insult","profanity","euphemism"]}}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/currency-rates\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_currency_rates","summary":"Price a currency-rates call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"base":{"type":"string","description":"ISO 4217 base currency code.","pattern":"^[A-Za-z]{3}$","default":"USD","examples":["USD","EUR","RUB"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/currency-rates\/runs":{"post":{"tags":["Tools"],"operationId":"run_currency_rates","summary":"Latest exchange rates for a base currency.","description":"Returns current rates against the requested base. Served from a short server-side cache; a `stale` flag marks a fallback to the last good snapshot when the upstream feed is briefly unavailable.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"base":{"type":"string","description":"ISO 4217 base currency code.","pattern":"^[A-Za-z]{3}$","default":"USD","examples":["USD","EUR","RUB"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/qr-code\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_qr_code","summary":"Price a qr-code call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","required":["data"],"additionalProperties":false,"properties":{"data":{"type":"string","description":"Payload to encode \u2014 a URL when type=url, free text when type=text.","minLength":1,"maxLength":2000,"examples":["https:\/\/example.com"]},"type":{"type":"string","enum":["url","text"],"default":"url"},"format":{"type":"string","description":"Download format.","enum":["png","svg"],"default":"png"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/qr-code\/runs":{"post":{"tags":["Tools"],"operationId":"run_qr_code","summary":"Generate a QR code and download it as PNG or SVG.","description":"Runs in your own browser: we issue a work order, your agent opens the tool page and follows `recipe`, and the run settles when the file is saved. The image never passes through our servers.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","required":["data"],"additionalProperties":false,"properties":{"data":{"type":"string","description":"Payload to encode \u2014 a URL when type=url, free text when type=text.","minLength":1,"maxLength":2000,"examples":["https:\/\/example.com"]},"type":{"type":"string","enum":["url","text"],"default":"url"},"format":{"type":"string","description":"Download format.","enum":["png","svg"],"default":"png"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/audio-trim\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_audio_trim","summary":"Price a audio-trim call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","description":"Staged input file. Upload it with POST \/v1\/uploads (multipart `file`, or JSON {\"url\":\"\u2026\"}).","required":["file_id"],"additionalProperties":false,"properties":{"file_id":{"type":"string","description":"Id returned by POST \/v1\/uploads."}}},"trim_start":{"type":"number","description":"Start of the kept range, in seconds.","minimum":0,"default":0},"trim_end":{"type":"number","description":"End of the kept range, in seconds. Omit to keep to the end.","minimum":0},"format":{"type":"string","description":"Output format. Defaults to the input format.","enum":["mp3","wav","ogg","flac","m4a","aac","opus","wma","aiff","webm"]},"bitrate":{"type":"integer","description":"Output bitrate in kbps, for lossy formats.","minimum":8,"maximum":1536},"fade_in":{"type":"number","description":"Fade-in length, seconds.","minimum":0,"maximum":30},"fade_out":{"type":"number","description":"Fade-out length, seconds.","minimum":0,"maximum":30}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/audio-trim\/runs":{"post":{"tags":["Tools"],"operationId":"run_audio_trim","summary":"Trim an audio file to a time range, with optional fades and re-encoding.","description":"Cuts the given range out of an uploaded audio file and returns the result as a downloadable file. Stage the input with POST \/v1\/uploads first. ASYNCHRONOUS: the call returns 202 with a run id \u2014 poll GET \/v1\/runs\/{id}, or register a webhook and be told.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","server"],"default":"auto"},"input":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","description":"Staged input file. Upload it with POST \/v1\/uploads (multipart `file`, or JSON {\"url\":\"\u2026\"}).","required":["file_id"],"additionalProperties":false,"properties":{"file_id":{"type":"string","description":"Id returned by POST \/v1\/uploads."}}},"trim_start":{"type":"number","description":"Start of the kept range, in seconds.","minimum":0,"default":0},"trim_end":{"type":"number","description":"End of the kept range, in seconds. Omit to keep to the end.","minimum":0},"format":{"type":"string","description":"Output format. Defaults to the input format.","enum":["mp3","wav","ogg","flac","m4a","aac","opus","wma","aiff","webm"]},"bitrate":{"type":"integer","description":"Output bitrate in kbps, for lossy formats.","minimum":8,"maximum":1536},"fade_in":{"type":"number","description":"Fade-in length, seconds.","minimum":0,"maximum":30},"fade_out":{"type":"number","description":"Fade-out length, seconds.","minimum":0,"maximum":30}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/music-mastering\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_music_mastering","summary":"Price a music-mastering call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"target":{"type":"string","description":"Loudness target of the platform the track is going to. streaming = \u221214 LUFS \/ \u22121 dBTP (Spotify, YouTube), apple = \u221216 \/ \u22121, amazon = \u221214 \/ \u22122, club = \u22129 \/ \u22121, podcast = \u221216 \/ \u22121.5, cd = \u22129 \/ \u22120.3, broadcast = \u221223 \/ \u22121 (EBU R128). Omit for streaming.","enum":["streaming","apple","amazon","club","podcast","cd","broadcast"],"default":"streaming"},"style":{"type":"string","description":"Tonal character applied on top of the loudness match. `transparent` adds nothing and tracks the target most closely; `auto` lets the tool pick from the material.","enum":["auto","transparent","warm","punchy","clear","open","loud","aimusic"],"default":"transparent"},"format":{"type":"string","description":"Delivery format. WAV is the distributor-safe default; MP3 is 320 kbps.","enum":["wav","flac","mp3"],"default":"wav"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/music-mastering\/runs":{"post":{"tags":["Tools"],"operationId":"run_music_mastering","summary":"Master a track to a streaming-ready loudness target.","description":"Brings a mix up to the loudness and true-peak ceiling of a chosen platform (Spotify\/YouTube \u221214 LUFS, Apple \u221216, club \u22129 \u2026), with a tonal style on top. Runs entirely in the caller's own browser \u2014 our servers do none of the work, which is why it is priced as a browser-lane call and not per megabyte. Reports measured LUFS, true peak and LRA for both the original and the result, so an agent can verify the outcome instead of trusting it.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"target":{"type":"string","description":"Loudness target of the platform the track is going to. streaming = \u221214 LUFS \/ \u22121 dBTP (Spotify, YouTube), apple = \u221216 \/ \u22121, amazon = \u221214 \/ \u22122, club = \u22129 \/ \u22121, podcast = \u221216 \/ \u22121.5, cd = \u22129 \/ \u22120.3, broadcast = \u221223 \/ \u22121 (EBU R128). Omit for streaming.","enum":["streaming","apple","amazon","club","podcast","cd","broadcast"],"default":"streaming"},"style":{"type":"string","description":"Tonal character applied on top of the loudness match. `transparent` adds nothing and tracks the target most closely; `auto` lets the tool pick from the material.","enum":["auto","transparent","warm","punchy","clear","open","loud","aimusic"],"default":"transparent"},"format":{"type":"string","description":"Delivery format. WAV is the distributor-safe default; MP3 is 320 kbps.","enum":["wav","flac","mp3"],"default":"wav"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/heic-convert\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_heic_convert","summary":"Price a heic-convert call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Output format, as the page selects it.","enum":["image\/jpeg","image\/png","image\/webp"],"default":"image\/jpeg"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/heic-convert\/runs":{"post":{"tags":["Tools"],"operationId":"run_heic_convert","summary":"Convert HEIC\/HEIF photos to JPG, PNG or WebP.","description":"Runs in your own browser: we issue a work order, your agent opens the tool page and follows `recipe`, and the run settles when the converted file is saved. The photo never passes through our servers. Useful for iPhone photos, which arrive as HEIC and are rejected by most pipelines.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Output format, as the page selects it.","enum":["image\/jpeg","image\/png","image\/webp"],"default":"image\/jpeg"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/pdf-compress\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_pdf_compress","summary":"Price a pdf-compress call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{},"description":"No parameters in v1: the page chooses the compression settings. Target-size and lossless modes exist in the UI and will be exposed once their controls are stable enough to promise."}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/pdf-compress\/runs":{"post":{"tags":["Tools"],"operationId":"run_pdf_compress","summary":"Shrink a PDF by re-encoding the images inside it.","description":"Runs in your own browser. Analyses the byte budget of the document and re-compresses embedded images by their EFFECTIVE resolution, leaving the text layer intact \u2014 so the result stays searchable and selectable. The default mode chooses the settings itself.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{},"description":"No parameters in v1: the page chooses the compression settings. Target-size and lossless modes exist in the UI and will be exposed once their controls are stable enough to promise."}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/ocr\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_ocr","summary":"Price a ocr call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Export format. `json` carries per-block layout and confidence; `txt` is the plain reading order; `md` keeps headings and lists.","enum":["txt","md","json"],"default":"txt"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/ocr\/runs":{"post":{"tags":["Tools"],"operationId":"run_ocr","summary":"Read text out of a scanned image or PDF.","description":"Runs in your own browser. Recognises text in photos, scans and PDFs and exports it as plain text, Markdown or JSON with layout data. The most useful call in the catalogue for a model that has to work with paper: everything else downstream can read text, but nothing can read a scan.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Export format. `json` carries per-block layout and confidence; `txt` is the plain reading order; `md` keeps headings and lists.","enum":["txt","md","json"],"default":"txt"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/video-compress\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_video_compress","summary":"Price a video-compress call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"codec":{"type":"string","description":"Video codec. Omit to let the page choose. VP9 is deliberately absent \u2014 it crashes FFmpeg-WASM.","enum":["h264","av1"]}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/video-compress\/runs":{"post":{"tags":["Tools"],"operationId":"run_video_compress","summary":"Re-encode a video to a smaller file.","description":"Runs in your own browser through FFmpeg compiled to WebAssembly. The default mode picks a bitrate for you; the codec can be chosen explicitly. Note that a long video takes real minutes on the caller's own CPU \u2014 budget the wait, not the price.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"codec":{"type":"string","description":"Video codec. Omit to let the page choose. VP9 is deliberately absent \u2014 it crashes FFmpeg-WASM.","enum":["h264","av1"]}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/photo-resize\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_photo_resize","summary":"Price a photo-resize call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Output format. `same` keeps the source format.","enum":["same","jpeg","png","webp"],"default":"same"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/photo-resize\/runs":{"post":{"tags":["Tools"],"operationId":"run_photo_resize","summary":"Resize one photo into every size a set of platforms wants.","description":"Runs in your own browser. One upload produces the whole set of platform-correct crops at once, delivered as a ZIP \u2014 which is why this is one call and not fifteen. The subject is kept in frame rather than centre-cropped blindly.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","additionalProperties":false,"properties":{"format":{"type":"string","description":"Output format. `same` keeps the source format.","enum":["same","jpeg","png","webp"],"default":"same"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}},"\/v1\/tools\/barcode\/estimate":{"post":{"tags":["Tools"],"operationId":"estimate_barcode","summary":"Price a barcode call","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","required":["value"],"additionalProperties":false,"properties":{"value":{"type":"string","description":"The data to encode. Must satisfy the chosen symbology \u2014 EAN-13 wants 12 or 13 digits, Code 128 takes free text.","minLength":1,"maxLength":2000},"type":{"type":"string","description":"Barcode symbology, as the page names it.","enum":["ean13","ean8","upca","upce","code128","gs1_128","itf14","datamatrix"],"default":"code128"},"format":{"type":"string","description":"Export format. SVG stays sharp at print size.","enum":["png","svg"],"default":"png"}}}}}}}},"responses":{"200":{"description":"Estimate","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}}}},"\/v1\/tools\/barcode\/runs":{"post":{"tags":["Tools"],"operationId":"run_barcode","summary":"Generate a retail, logistics or 2D barcode as PNG or SVG.","description":"Runs in your own browser. Covers EAN\/UPC, Code 128, GS1-128, ITF-14, Data Matrix and the rest. Separate from `qr-code`: a QR is one symbology, this is the rest of them, and the check digits differ per family.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key. The same key replays the original run instead of charging again.","schema":{"type":"string","maxLength":64}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["input"],"properties":{"lane":{"type":"string","description":"`auto` picks the cheapest available lane.","enum":["auto","browser"],"default":"auto"},"input":{"type":"object","required":["value"],"additionalProperties":false,"properties":{"value":{"type":"string","description":"The data to encode. Must satisfy the chosen symbology \u2014 EAN-13 wants 12 or 13 digits, Code 128 takes free text.","minLength":1,"maxLength":2000},"type":{"type":"string","description":"Barcode symbology, as the page names it.","enum":["ean13","ean8","upca","upce","code128","gs1_128","itf14","datamatrix"],"default":"code128"},"format":{"type":"string","description":"Export format. SVG stays sharp at print size.","enum":["png","svg"],"default":"png"}}}}}}}},"responses":{"200":{"description":"Run","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}},"402":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Error","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"202":{"description":"Work order issued \u2014 your browser performs the run.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Run"}}}}}}}},"webhooks":{"run.settled":{"post":{"requestBody":{"description":"Sent when a run reaches a final state. Configure the URL in Settings \u2192 API.","content":{"application\/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["run.succeeded","run.failed"]},"data":{"$ref":"#\/components\/schemas\/Run"}}}}}},"parameters":[{"name":"Timbrica-Signature","in":"header","required":true,"description":"HMAC-SHA256 as `t=<unix>,v1=<hex>` over \"<t>.<raw body>\", keyed with your webhook secret. Verify BOTH the digest and the age of `t` \u2014 the timestamp is inside the signed string precisely so a captured delivery cannot be replayed later.","schema":{"type":"string"}}],"responses":{"2xx":{"description":"Any 2xx marks the delivery as accepted. Non-2xx is retried a few times, then dropped \u2014 GET \/v1\/runs\/{id} always remains the source of truth."}},"summary":"Run finished","operationId":"webhook_run_settled"}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key minted by a human in Settings \u2192 API. Format: `tmb_live_<shard>_\u2026`."}},"schemas":{"Run":{"type":"object","properties":{"id":{"type":"string","description":"ULID."},"object":{"type":"string","const":"run"},"tool":{"type":"string"},"contract_version":{"type":"integer"},"lane":{"type":"string","enum":["server","browser","headless"]},"mode":{"type":"string","enum":["live","test"]},"status":{"type":"string","enum":["queued","running","awaiting_client","succeeded","failed","cancelled","expired"]},"tokens_held":{"type":"integer"},"tokens_charged":{"type":"integer"},"output":{"type":"object"},"error":{"type":"object"},"work_order":{"$ref":"#\/components\/schemas\/WorkOrder"}}},"WorkOrder":{"type":"object","description":"Browser lane: open `url`, follow `recipe`; the run settles when the tool delivers a file.","properties":{"url":{"type":"string"},"recipe":{"type":"object"},"expires_at":{"type":"string"},"instructions":{"type":"string"}}},"Problem":{"type":"object","description":"RFC 9457 error. `hint` says what to do; `retryable` says whether retrying can help.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","enum":["invalid_key","key_revoked","key_suspended","fetch_quota_exceeded","missing_key","ip_not_allowed","tool_not_allowed","email_not_verified","plan_required","unknown_tool","unknown_run","unknown_lane","wrong_shard","validation_failed","insufficient_tokens","idempotency_conflict","run_not_cancellable","input_too_large","rate_limited","concurrency_limited","tool_unavailable","upstream_unavailable","api_disabled","internal_error"]},"detail":{"type":"string"},"hint":{"type":"string"},"retryable":{"type":"boolean"},"docs_url":{"type":"string"},"request_id":{"type":"string"}}}}}}