{"openapi":"3.1.0","info":{"title":"Nero Labs Agent Tools","version":"0.1.0","description":"Pay-per-call tools for AI agents, 52 in all: read web pages and RSS feeds, check which AI crawlers a site blocks, see which products AI shopping answers recommend, compare answers from several AI assistants, score influencer engagement rate and fake follower signs, find TikTok, Reels and YouTube videos that beat their creator's normal, check product ideas against live demand, OCR, PDF text, transcription; email, phone and domain checks; UK, Irish and Polish company lookups and UK risk reports; website contacts, tech stack and SEO audits; PageSpeed; AI review, job post and row enrichment; salary benchmarks and skills demand from job rows; local market saturation from Google Maps rows; Amazon review rating trends and complaint words; buyer intent leads from Instagram, TikTok and YouTube comments; the top questions people ask on Reddit; data cleaning, joins, dedupe and diffs; US and EU compliance rules. No account or API key: pay each call in USDC on Base over x402.","x-guidance":"Every route is paid per call over x402 (USDC on Base, no account). Data routes under /data, /phone-check and /whois take a JSON body and cost a per-row price (minimum per call, row cap per call; over the cap is refused before payment). Heavier routes (/ocr, /pagespeed, /company/*, /contact-finder, /tech-stack, /seo-audit, /rss, /ai-crawlers, /ai-shopping, /ai-answers, /logo, /image-convert, /lane-check, /pdf-extract, /ai/*, /transcribe) run a job that can take one to four minutes; the price is quoted from the items you send. Call the route; on HTTP 402 read the PAYMENT-REQUIRED header, sign, and retry with PAYMENT-SIGNATURE. Failed calls (bad input, unreachable page) are not charged. GET /read?url= reads a web page as clean text. GET /email-check?email= checks an address. GET /rules/us-minimum-wage?address=&date= gives the legal minimum wage. POST JSON to /rules/pay-transparency, /rules/us-sales-tax-nexus and /rules/breach-notification for compliance answers; each input schema is below.","contact":{"name":"Nero Labs","email":"founder@neroengine.com"}},"servers":[{"url":"https://x402-agent-tools.nerolabs.workers.dev"}],"paths":{"/read":{"get":{"operationId":"read","summary":"Read a web page as clean article text with title, author and date","description":"Fetches one public web page and returns its main article text, cleaned of menus, ads and footers (Mozilla Readability), plus title, author, publish and update dates, site name, language, image and canonical URL from the publisher's own data. Honours robots.txt. Use it to read a link before summarising or quoting it. Charged only when text comes back; blocked, missing or non-HTML pages are free.","tags":["web"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"authors":{"type":"array","items":{"type":"string"}},"publishedAt":{},"modifiedAt":{},"siteName":{"type":"string"},"description":{"type":"string"},"language":{"type":"string"},"imageUrl":{"type":"string"},"canonicalUrl":{"type":"string"},"paywalled":{"type":"boolean"},"pageType":{"type":"string"},"isArticle":{"type":"boolean"},"wordCount":{"type":"number"},"readingTimeMinutes":{"type":"number"},"truncated":{"type":"boolean"},"text":{"type":"string"},"_example_note":{"type":"string"}}},"example":{"url":"https://simonwillison.net/2024/Dec/31/llms-in-2024/","finalUrl":"https://simonwillison.net/2024/Dec/31/llms-in-2024/","title":"Things we learned about LLMs in 2024","author":"Simon Willison","authors":["Simon Willison"],"publishedAt":null,"modifiedAt":null,"siteName":"Simon Willison’s Weblog","description":"A lot has happened in the world of Large Language Models over the course of 2024. Here’s a review of things we figured out about the field i...","language":"en-gb","canonicalUrl":"https://simonwillison.net/2024/Dec/31/llms-in-2024/","paywalled":false,"pageType":"article","isArticle":true,"wordCount":6988,"readingTimeMinutes":30,"truncated":true,"text":"31st December 2024\n\nA lot has happened in the world of Large Language Models over the course of 2024. Here’s a review of things we figured out about the field in the past twelve months, plus my attemp...","_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The http or https address of the page to read."},"description":"The http or https address of the page to read."},{"name":"max_chars","in":"query","required":false,"schema":{"type":"integer","minimum":100,"maximum":200000,"description":"Longest text to return. Default 50000; longer articles come back cut with truncated true."},"description":"Longest text to return. Default 50000; longer articles come back cut with truncated true."}]}},"/email-check":{"get":{"operationId":"email_check","summary":"Check one email address: format, mail server, throwaway domain, role inbox, typo","description":"Checks one email address and returns valid, risky or invalid with the reasons: address format, whether the domain can receive mail (live MX lookup), known throwaway domains (mailinator and others, invalid), shared inboxes like info@ or sales@ (risky), likely typos such as gmial.com with the fix in didYouMean, and free providers such as gmail.com (flag only). Does not ping the mailbox (no SMTP), so valid is not a delivery guarantee.","tags":["email"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"status":{"type":"string"},"reason":{"type":"string"},"allReasons":{"type":"array","items":{"type":"string"}},"normalized":{"type":"string"},"domain":{"type":"string"},"syntaxValid":{"type":"boolean"},"domainReceivesMail":{"type":"boolean"},"mailServer":{"type":"string"},"isDisposable":{"type":"boolean"},"isRoleAddress":{"type":"boolean"},"isFreeProvider":{"type":"boolean"},"didYouMean":{},"note":{"type":"string"},"_example_note":{"type":"string"}}},"example":{"email":"info@mailinator.com","status":"invalid","reason":"disposable_domain","allReasons":["disposable_domain","role_address"],"normalized":"info@mailinator.com","domain":"mailinator.com","syntaxValid":true,"domainReceivesMail":true,"mailServer":"mail.mailinator.com","isDisposable":true,"isRoleAddress":true,"isFreeProvider":false,"didYouMean":null,"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"The email address to check, for example ana@example.com."},"description":"The email address to check, for example ana@example.com."}]}},"/rules/us-minimum-wage":{"get":{"operationId":"us_minimum_wage","summary":"Legal minimum wage and tipped wage for any US address on any date","description":"Returns the legal hourly minimum wage at a US address (or state plus city or county) on a date: the highest of the federal, state, county and city rates, which one sets it, the tipped cash wage, special industry rates, the next scheduled change and the government source per figure. Use it for payroll, job offers or wage checks. Unclear cases give the highest rate that could apply plus what it depends on. Information, not legal advice.","tags":["minimum wage"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"location":{"type":"object","properties":{"input":{"type":"string"},"matched_address":{"type":"string"},"state":{"type":"string"},"state_name":{"type":"string"},"county":{"type":"string"},"city":{"type":"string"}}},"date":{"type":"string"},"minimum_wage_hourly":{"type":"number"},"set_by":{"type":"string"},"answer_type":{"type":"string"},"rule":{"type":"string"},"tipped_minimum_cash_wage_hourly":{"type":"number"},"tipped_note":{"type":"string"},"breakdown":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string"},"jurisdiction":{"type":"string"},"applies_to":{"type":"string"},"hourly":{"type":"number"},"tipped_cash":{"type":"number"},"in_force_since":{"type":"string"},"applies_for_sure":{"type":"boolean"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"}}}},"upcoming_changes":{"type":"array"},"notes":{"type":"array","items":{"type":"string"}},"data_as_of":{"type":"string"},"disclaimer":{"type":"string"},"from":{"type":"string"},"related_rules_servers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"covers":{"type":"string"}}}},"_example_note":{"type":"string"}}},"example":{"location":{"input":"1600 Pennsylvania Ave NW, Washington, DC","matched_address":"1600 PENNSYLVANIA AVE NW, WASHINGTON, DC, 20500","state":"DC","state_name":"District of Columbia","county":"District of Columbia","city":"Washington"},"date":"2027-01-01","minimum_wage_hourly":18.4,"set_by":"District of Columbia (state)","answer_type":"exact","tipped_minimum_cash_wage_hourly":10.3,"breakdown":[{"level":"federal","jurisdiction":"Federal (FLSA)","applies_to":"covered employers","hourly":7.25,"tipped_cash":2.13,"in_force_since":"2009-07-24","applies_for_sure":true,"source":"https://www.dol.gov/agencies/whd/minimum-wage"}],"upcoming_changes":[],"disclaimer":"Information, not legal advice. Built from primary government sources (linked per figure); check the source before acting on a close call.","_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","description":"US street address, for example \"100 N Main St, Los Angeles, CA\". Resolved with the US Census Bureau geocoder."},"description":"US street address, for example \"100 N Main St, Los Angeles, CA\". Resolved with the US Census Bureau geocoder."},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"Two-letter state code or name. Needed when no address is given."},"description":"Two-letter state code or name. Needed when no address is given."},{"name":"city","in":"query","required":false,"schema":{"type":"string","description":"City name, for example \"Seattle\". Optional."},"description":"City name, for example \"Seattle\". Optional."},{"name":"county","in":"query","required":false,"schema":{"type":"string","description":"County name, for example \"Montgomery County\". Optional."},"description":"County name, for example \"Montgomery County\". Optional."},{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"Date the work is done, YYYY-MM-DD. Defaults to today. Future dates use rates already scheduled or announced."},"description":"Date the work is done, YYYY-MM-DD. Defaults to today. Future dates use rates already scheduled or announced."},{"name":"employer_size","in":"query","required":false,"schema":{"type":"integer","description":"Number of employees. Some places set different rates by employer size. Optional."},"description":"Number of employees. Some places set different rates by employer size. Optional."},{"name":"industry","in":"query","required":false,"schema":{"type":"string","description":"Optional, for example \"fast food\", \"hotel\", \"healthcare\". Used to flag special industry rates."},"description":"Optional, for example \"fast food\", \"hotel\", \"healthcare\". Used to flag special industry rates."},{"name":"annual_revenue","in":"query","required":false,"schema":{"type":"number","description":"Employer annual gross sales or receipts in US dollars. A few states (Ohio, Oklahoma, Montana) set a lower rate below a threshold. Optional."},"description":"Employer annual gross sales or receipts in US dollars. A few states (Ohio, Oklahoma, Montana) set a lower rate below a threshold. Optional."}]}},"/rules/pay-transparency":{"post":{"operationId":"pay_transparency","summary":"Pay transparency duties for a job post (US states and cities, Canada, EU)","description":"Checks a job post against pay transparency laws before it is published. Send the locations (and whether it is remote), employer headcount and posting date. Returns each law that applies or may apply, a merged checklist of what the post must show (pay range, benefits), salary history bans, penalties and the official source per law. Covers US states and cities, Canadian provinces and the EU Pay Transparency Directive country by country. Information, not legal advice.","tags":["pay transparency"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"locations":{"type":"array","items":{"type":"string"}},"verdict":{"type":"string"},"post_must_include":{"type":"array","items":{"type":"string"}},"do_not_ask_salary_history_in":{"type":"array","items":{"type":"string"}},"safe_default":{"type":"string"},"laws_that_apply":{"type":"array","items":{"type":"object","properties":{"law":{"type":"string"},"id":{"type":"string"},"where":{"type":"string"},"status_on_date":{"type":"string"},"in_force_since":{"type":"string"},"must_include_in_posting":{"type":"array"},"on_request_only":{"type":"boolean"},"salary_history_ban":{"type":"boolean"},"covered_employers":{"type":"object"},"covered_jobs":{"type":"string"},"recruiters_and_job_boards":{"type":"string"},"penalties":{"type":"string"},"summary":{"type":"string"},"citation":{"type":"string"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"why":{"type":"array"}}}},"may_apply":{"type":"array","items":{"type":"object","properties":{"law":{"type":"string"},"id":{"type":"string"},"where":{"type":"string"},"status_on_date":{"type":"string"},"in_force_since":{"type":"string"},"must_include_in_posting":{"type":"array"},"on_request_only":{"type":"boolean"},"salary_history_ban":{},"covered_employers":{"type":"object"},"covered_jobs":{"type":"string"},"recruiters_and_job_boards":{"type":"string"},"penalties":{"type":"string"},"summary":{"type":"string"},"citation":{"type":"string"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"note":{"type":"string"},"why":{"type":"array"},"why_uncertain":{"type":"string"}}}},"enacted_starting_later":{"type":"array","items":{"type":"object","properties":{"law":{"type":"string"},"id":{"type":"string"},"where":{"type":"string"},"status_on_date":{"type":"string"},"in_force_since":{"type":"string"},"must_include_in_posting":{"type":"array"},"on_request_only":{"type":"boolean"},"salary_history_ban":{"type":"boolean"},"covered_employers":{"type":"object"},"covered_jobs":{"type":"string"},"recruiters_and_job_boards":{"type":"string"},"penalties":{"type":"string"},"summary":{"type":"string"},"citation":{"type":"string"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"note":{"type":"string"},"why":{"type":"array"}}}},"not_applicable":{"type":"array","items":{"type":"object","properties":{"law":{"type":"string"},"why":{"type":"string"}}}},"data_as_of":{"type":"string"},"disclaimer":{"type":"string"},"from":{"type":"string"},"related_rules_servers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"covers":{"type":"string"}}}},"_example_note":{"type":"string"}}},"example":{"date":"2026-10-21","locations":["Denver, CO","New York City"],"verdict":"The post must follow at least one pay transparency law (see checklist).","post_must_include":["hourly rate or salary, or a good faith range (min and max) the employer expects to pay"],"laws_that_apply":[{"law":"Colorado Equal Pay for Equal Work Act (job posting rules)","id":"US-CO","where":"Colorado, US","status_on_date":"in_force","in_force_since":"2021-01-01","must_include_in_posting":["hourly rate or salary, or a good faith range (min and max) the employer expects to pay"],"on_request_only":false,"salary_history_ban":true,"covered_employers":{"min_employees":1,"counting":"Any employer with at least one employee working in Colorado. Out of state staff do not need to be counted; one Colorado employee is enough.","notes":"Public and private employers."},"covered_jobs":"All internal and external postings for jobs performed in Colorado, and remote jobs that could be done from Colorado, including promotion opp...","recruiters_and_job_boards":"Employer is responsible for postings it places through third parties.","penalties":"Fines of 500 to 10,000 US dollars per violation; each job posting is a separate violation.","summary":"Every Colorado job ad must show the pay or pay range plus a short benefits description and the deadline to apply. It applies to employers of...","citation":"C.R.S. 8-5-201; 7 CCR 1103-13 (Equal Pay Transparency Rules)","source":"https://cdle.colorado.gov/dlss/labor-laws-by-topic/equal-pay-for-equal-work-act","verified_on_primary_source":true,"why":["job located in Denver, CO"]}],"disclaimer":"Information, not legal advice. Built from primary government sources (linked per figure); check the source before acting on a close call.","_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"locations":{"type":"array","description":"Where the job is based or could be done. Each item is a string like \"Denver, CO\", \"New York City\", \"Ontario, Canada\", \"Germany\", or an object {country, state, city}.","items":{}},"remote":{"type":"boolean","description":"True if the job can be done remotely. Many US laws then apply to remote jobs that could be done in their state."},"remote_scope":{"type":"string","description":"If remote, where from: \"US\", \"EU\", \"Canada\" or \"anywhere\". Default: the countries of the locations given."},"employer_employees":{"type":"integer","description":"Total employees. Several laws only cover employers above a size. Optional."},"date":{"type":"string","description":"Posting date, YYYY-MM-DD. Defaults to today. Future dates include laws already enacted with a later start."}},"required":["locations"],"additionalProperties":false},"example":{"locations":["Denver, CO","New York City"],"remote":true,"employer_employees":40}}}}}},"/rules/us-sales-tax-nexus":{"post":{"operationId":"us_sales_tax_nexus","summary":"Which US states a remote seller must register in for sales tax","description":"Checks which US states a remote seller must register in to collect sales tax (economic nexus). Send sales and order counts per state for the last 12 months or a calendar year, and whether they include marketplace sales (Amazon, Etsy). Returns states over the threshold (must register), close to it (80 percent or more) and under it, with each state's threshold, measurement period, what counts and the revenue department source. Information, not tax advice.","tags":["sales tax"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"verdict":{"type":"string"},"must_register":{"type":"array","items":{"type":"object","properties":{"state":{"type":"string"},"name":{"type":"string"},"your_figures":{"type":"object"},"threshold":{"type":"string"},"percent_of_sales_threshold":{"type":"number"},"percent_of_transaction_threshold":{},"measurement_period":{"type":"string"},"what_counts":{"type":"string"},"marketplace_sales":{"type":"string"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"depends_on":{"type":"array"},"note":{"type":"string"},"result":{"type":"string"},"register_by":{"type":"string"},"register_by_date_if_crossed_today":{"type":"string"}}}},"under_threshold":{"type":"array","items":{"type":"object","properties":{"state":{"type":"string"},"name":{"type":"string"},"your_figures":{"type":"object"},"threshold":{"type":"string"},"percent_of_sales_threshold":{"type":"number"},"percent_of_transaction_threshold":{},"measurement_period":{"type":"string"},"what_counts":{"type":"string"},"marketplace_sales":{"type":"string"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"note":{"type":"string"},"result":{"type":"string"}}}},"also_check":{"type":"string"},"data_as_of":{"type":"string"},"disclaimer":{"type":"string"},"from":{"type":"string"},"related_rules_servers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"covers":{"type":"string"}}}},"_example_note":{"type":"string"}}},"example":{"date":"2026-10-21","verdict":"Register in 1 state: CA.","must_register":[{"state":"CA","name":"California","your_figures":{"sales_counted":612000,"transactions_counted":3400,"period":"last_12_months"},"threshold":"$500,000 in sales","percent_of_sales_threshold":122,"percent_of_transaction_threshold":null,"measurement_period":"previous or current calendar year (crossing in either counts)","what_counts":"Total combined sales of tangible personal property for delivery in California by the retailer and all related persons, including nontaxable...","marketplace_sales":"Counted: a marketplace seller must include its marketplace-facilitated sales together with its direct sales.","source":"https://www.cdtfa.ca.gov/industry/wayfair.htm","verified_on_primary_source":true,"depends_on":["Your figures cover the last 12 months; California measures previous or current calendar year (crossing in either counts). Re-run with figure..."],"note":"AB 147 passed 25 April 2019 and applied the $500,000 test to sales from 1 April 2019; district taxes from 25 April 2019. Retailers must also...","result":"Over the threshold on the figures given (SAFE answer): register to collect sales tax.","register_by":"Register and start collecting straight after the sale that takes total sales over $500,000 (CDTFA example: threshold passed on 6 July, regis...","register_by_date_if_crossed_today":"2026-10-21"}],"under_threshold":[{"state":"TX","name":"Texas","your_figures":{"sales_counted":90000,"transactions_counted":150,"period":"last_12_months"},"threshold":"$500,000 in sales","percent_of_sales_threshold":18,"percent_of_transaction_threshold":null,"measurement_period":"any rolling 12 month period","what_counts":"Total Texas revenue: gross revenue from taxable and nontaxable sales of goods and services into Texas, including separately stated handling,...","marketplace_sales":"Counted: include all sales, marketplace sales too, even when the marketplace collects (stated as of 1 April 2020).","source":"https://comptroller.texas.gov/taxes/sales/remote-sellers.php","verified_on_primary_source":true,"note":"Remote sellers may use a single local use tax rate instead of each local rate (not available to marketplace providers). To stop, a seller ne...","result":"Under the threshold."}],"disclaimer":"Information, not legal advice. Built from primary government sources (linked per figure); check the source before acting on a close call.","_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sales_by_state":{"type":"array","description":"One item per state the seller ships into: {\"state\":\"CA\",\"sales\":612000,\"transactions\":3400}. Optional per item: marketplace_sales and marketplace_transactions (the part made through marketplace facilitators like Amazon), retail_sales (sales excluding sales for resale), taxable_sales (sales excluding exempt sales). Dollars are US dollars.","items":{"type":"object"}},"period":{"type":"string","enum":["last_12_months","previous_calendar_year","current_calendar_year"],"description":"What period the figures cover: last_12_months (default), previous_calendar_year or current_calendar_year (year to date)."},"includes_marketplace_sales":{"type":"boolean","description":"True (default) if the sales and transactions figures include sales made through marketplace facilitators. Many states exclude those sales when testing a remote seller's threshold."},"date":{"type":"string","description":"The date to check the rules on, YYYY-MM-DD. Defaults to today. Thresholds changed in several states; past dates use the rule then in force."},"show_all_states":{"type":"boolean","description":"True to also list every sales tax state the seller did not report sales for. Default false."}},"required":["sales_by_state"],"additionalProperties":false},"example":{"sales_by_state":[{"state":"CA","sales":612000,"transactions":3400},{"state":"TX","sales":90000,"transactions":150}],"period":"last_12_months"}}}}}},"/rules/breach-notification":{"post":{"operationId":"breach_notification","summary":"Data breach notices owed and their deadlines (US states, HIPAA, SEC, GDPR, UK and more)","description":"Works out every data breach notice a company owes and the deadline for each. Send how many people were affected per US state or country, the data types exposed, whether it was encrypted, the discovery date and flags (SEC registrant, HIPAA, GLBA, NYDFS). Returns each notice owed (people, attorneys general, credit bureaus, HHS, SEC 8-K, FTC, EU and UK regulators, Canada, Australia) with a dated deadline where the law fixes one and the official source. Not legal advice.","tags":["data breach"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.003000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"date_discovered":{"type":"string"},"verdict":{"type":"string"},"notices_owed":{"type":"array","items":{"type":"object","properties":{"deadline_date":{},"deadline_rule":{"type":"string"},"deadline_note":{"type":"string"},"notify":{"type":"string"},"notice_type":{"type":"string"},"law":{"type":"string"},"id":{"type":"string"},"affected_here":{"type":"number"},"citation":{"type":"string"},"content_required":{"type":"array"},"how":{"type":"string"},"matched_data_types":{"type":"array"},"depends_on":{"type":"array"},"source":{"type":"string"},"verified_on_primary_source":{"type":"boolean"},"note":{"type":"string"},"submit_url":{"type":"string"}}}},"also_check":{"type":"array","items":{"type":"string"}},"without_unreasonable_delay":{"type":"string"},"data_as_of":{"type":"string"},"disclaimer":{"type":"string"},"from":{"type":"string"},"related_rules_servers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"covers":{"type":"string"}}}},"_example_note":{"type":"string"}}},"example":{"date_discovered":"2026-10-20","verdict":"4 notices owed under 2 laws. First fixed deadline: 2026-10-23 (The competent national data protection authority (lead authority for cross-bo...","notices_owed":[{"deadline_date":"2026-10-23","deadline_rule":"Without undue delay and, where feasible, no later than 72 hours after becoming aware. If later, give reasons for the delay. Information may...","deadline_note":"72 hours from becoming aware: the date shown assumes discovery at the start of 2026-10-20; count the hours from the actual time.","notify":"The competent national data protection authority (lead authority for cross-border processing)","notice_type":"data_protection_authority","law":"European Union and EEA (GDPR)","id":"EU-GDPR","affected_here":40,"citation":"Regulation (EU) 2016/679, Articles 33 and 34","content_required":["Nature of the breach, with categories and approximate numbers of people and records"],"how":"Each national authority's own breach form","matched_data_types":["ssn"],"depends_on":["Risk of harm test: Authority notice is not needed if the breach is unlikely to result in a risk to people's rights and freedoms. Individuals..."],"source":"https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679","verified_on_primary_source":true,"note":"Read on EUR-Lex. Every breach must be documented, reported or not (Art. 33(5)). Pending change: the European Commission's Digital Omnibus pr..."}],"disclaimer":"Information, not legal advice. Built from primary government sources (linked per figure); check the source before acting on a close call.","_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"affected":{"type":"array","description":"Where the affected people live: [{\"state\":\"CA\",\"count\":1200},{\"state\":\"TX\",\"count\":300},{\"country\":\"Germany\",\"count\":40},{\"country\":\"United Kingdom\",\"count\":15},{\"country\":\"Canada\",\"province\":\"Quebec\",\"count\":5}]. A bare two-letter code is read as a US state (CA = California); use {\"country\":\"CA\"} or \"Canada\" for Canada.","items":{"type":"object"}},"data_types":{"type":"array","items":{"type":"string"},"description":"Personal data exposed, for example [\"ssn\",\"drivers_license\",\"payment_card\"]. If left out every law is treated as triggered (SAFE)."},"encrypted":{"type":"boolean","description":"True only if all the exposed data was encrypted and the key was not exposed. Many US state laws then need no notice. Default false."},"date_discovered":{"type":"string","description":"Date the breach was discovered (or you became aware of it), YYYY-MM-DD. Defaults to today. Deadlines are counted from it."},"sec_registrant":{"type":"boolean","description":"True for a company that files reports with the US SEC (listed in the US). Adds Form 8-K Item 1.05."},"materiality_date":{"type":"string","description":"SEC registrants: date the company decided the incident is material, YYYY-MM-DD. The 8-K is due 4 business days after it."},"sector":{"type":"array","items":{"type":"string","enum":["hipaa_covered_entity","hipaa_business_associate","glba_financial","health_app","nydfs_licensee","telecom","critical_infrastructure"]},"description":"Sector rules that apply: hipaa_covered_entity, hipaa_business_associate, glba_financial (non-bank financial firms under the FTC Safeguards Rule), health_app (FTC Health Breach Notification Rule), nydfs_licensee (New York DFS regulated)."},"role":{"type":"string","enum":["owner","service_provider"],"description":"owner (default): the company that owns or licenses the data. service_provider: holds it for another company, which mostly means notifying that company quickly."}},"required":["affected"],"additionalProperties":false},"example":{"affected":[{"state":"CA","count":1200},{"country":"Germany","count":40}],"data_types":["ssn","email_address"],"date_discovered":"2026-10-20"}}}}}},"/data/filter":{"post":{"operationId":"data_filter","summary":"Filter, transform, sort and dedupe a list of JSON rows","description":"Filters, transforms, sorts and dedupes up to 500 JSON rows in one call: conditions (equals, contains, greater than, regex, empty), field renames, trims, case changes, number and date parsing, computed fields, sort, distinct by field, offset and limit. Returns the kept rows plus counts of rows dropped and why. $0.001 per row sent, $0.002 minimum. Same engine as the Apify actor nerolabs/dataset-filter-transform.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"city":{"type":"string"},"revenue":{"type":"string"}}}},"summary":{"type":"object","properties":{"inputRowCount":{"type":"number"},"keptRowCount":{"type":"number"},"excludedByFilter":{"type":"number"},"duplicatesRemoved":{"type":"number"},"droppedByLimit":{"type":"number"},"transformsApplied":{"type":"number"},"filtersApplied":{"type":"number"},"filterCombineMode":{"type":"string"},"sortedBy":{"type":"array","items":{"type":"object"}},"transformIssues":{"type":"object","properties":{}},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"name":"Acme Ltd","city":"Bristol","revenue":"120000"},{"name":"Crane plc","city":"Bristol","revenue":"980000"}],"summary":{"inputRowCount":3,"keptRowCount":2,"excludedByFilter":1,"duplicatesRemoved":0,"droppedByLimit":0,"transformsApplied":0,"filtersApplied":1,"filterCombineMode":"AND","sortedBy":[{"field":"name","direction":"asc"}],"transformIssues":{},"warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","description":"The rows to process. Each row is a JSON object. Keys may differ between rows.","items":{"type":"object"}},"transforms":{"type":"array","description":"Transform steps applied to every row, in order. Each step is an object with an \"op\" key, for example {\"op\":\"cast\",\"field\":\"price\",\"to\":\"number\"} or {\"op\":\"compute\",\"field\":\"total\",\"expression\":\"price * qty\"} or {\"op\":\"rename\",\"from\":\"e_mail\",\"to\":\"email\"}. Call list_capabilities for all 26 operations.","items":{"type":"object"}},"filters":{"type":"array","description":"Conditions a row must satisfy to be kept, for example {\"field\":\"country\",\"operator\":\"equals\",\"value\":\"UK\"} or {\"field\":\"price\",\"operator\":\"greaterThan\",\"value\":100}. Dot paths like \"address.city\" work. Call list_capabilities for all 25 operators.","items":{"type":"object"}},"filterCombineMode":{"type":"string","enum":["AND","OR"],"description":"Whether a row must match every filter (AND, the default) or any one of them (OR)."},"caseSensitiveFilters":{"type":"boolean","description":"Text comparisons are case-insensitive by default. Set true to make them exact."},"lenientNumbers":{"type":"boolean","description":"On by default: values like \"$1,234.50\", \"49 USD\" and \"12%\" are read as numbers. Set false to require real numeric values."},"sortBy":{"type":"array","description":"Sort the kept rows, for example [{\"field\":\"price\",\"direction\":\"desc\"}].","items":{"type":"object"}},"distinctBy":{"type":"array","description":"Keep only the first row for each combination of these fields. Applied after sorting, so sorting first lets you keep the newest row per key.","items":{"type":"string"}},"offset":{"type":"integer","description":"Skip this many rows after filtering and sorting."},"limit":{"type":"integer","description":"Return at most this many rows."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"name":"Acme Ltd","city":"Bristol","revenue":"120000"},{"name":"Bolt Co","city":"Leeds","revenue":"45000"},{"name":"Crane plc","city":"Bristol","revenue":"980000"}],"filters":[{"field":"city","operator":"equals","value":"Bristol"}],"sortBy":[{"field":"name","direction":"asc"}]}}}}}},"/data/clean":{"post":{"operationId":"data_clean","summary":"Clean messy rows: dedupe, flatten JSON, fix emails, phones, URLs and types","description":"Cleans up to 150 messy JSON rows: removes duplicates (exact, normalized or fuzzy), flattens nested JSON, trims and fixes emails, phone numbers and URLs, strips HTML, turns number and true/false text into real types, drops empty fields, keeps, removes or renames columns. Returns clean rows plus a report of what changed. $0.002 per row sent, $0.002 minimum. Same engine as nerolabs/dataset-cleaner-exporter.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.300000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"}}}},"summary":{"type":"object","properties":{"inputRowCount":{"type":"number"},"rowsAddedByExpansion":{"type":"number"},"duplicatesRemoved":{"type":"number"},"droppedByMaxItems":{"type":"number"},"outputRowCount":{"type":"number"},"dedupModeUsed":{"type":"string"},"dedupKeys":{"type":"array","items":{"type":"string"}},"keepStrategy":{"type":"string"},"fieldsFlattened":{"type":"boolean"},"outputFormat":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"fillRates":{"type":"object","properties":{"name":{"type":"number"},"email":{"type":"number"},"phone":{"type":"number"}}},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"name":"Ana Silva","email":"ana@silva.co.uk","phone":"01174960012"}],"summary":{"inputRowCount":2,"rowsAddedByExpansion":0,"duplicatesRemoved":1,"droppedByMaxItems":0,"outputRowCount":1,"dedupModeUsed":"normalized","dedupKeys":["email"],"keepStrategy":"most_complete","fieldsFlattened":true,"outputFormat":"json","columns":["name","email","phone"],"fillRates":{"name":1,"email":1,"phone":1},"warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","description":"The rows to clean. Each row is a JSON object; keys may differ between rows and values may be nested.","items":{"type":"object"}},"dedupMode":{"type":"string","enum":["none","exact","normalized","fuzzy"],"description":"How duplicates are found. normalized (default) ignores case and whitespace; exact needs identical values; fuzzy also merges near-duplicates (up to 100 rows and 1000 characters of key text, so name a short field in dedupKeys); none keeps every row."},"dedupKeys":{"type":"array","items":{"type":"string"},"description":"Fields that identify a duplicate, for example [\"Email\"]. Empty compares the whole row. Use the final column names: flattened (Details_founded) and renamed. Exact and case-sensitive. Rows where every key is empty count as duplicates of each other."},"keepStrategy":{"type":"string","enum":["most_complete","first","last"],"description":"Which duplicate survives: most_complete (default, fewest empty fields), first or last."},"similarityThreshold":{"type":"number","minimum":0.5,"maximum":0.99,"description":"Fuzzy mode only. 0.5 to 0.99, default 0.9. Higher is stricter."},"flatten":{"type":"boolean","description":"Default true. Turn nested objects into flat columns. Arrays become one JSON-text cell."},"flattenSeparator":{"type":"string","description":"Joins nested key paths when flattening. Default \"_\"."},"expandArrayField":{"type":"string","description":"Optional. One top-level array field (for example \"offers\") to explode into one row per entry, repeating the other fields. Object entries become columns. The expanded total must stay within the row limit."},"cleanFields":{"type":"boolean","description":"Default true. Normalize emails, phone numbers and URLs, detected by field name or value shape."},"stripHtml":{"type":"boolean","description":"Default false. Remove HTML tags and decode common entities in text."},"coerceTypes":{"type":"boolean","description":"Default false. Turn \"42\" into 42 and \"true\" into true. Leading-zero values like \"007\" stay text."},"emptyToNull":{"type":"boolean","description":"Default true. Blank text becomes null."},"dropEmptyFields":{"type":"boolean","description":"Default false. Remove null and empty fields from each row."},"columnsToKeep":{"type":"array","items":{"type":"string"},"description":"Keep only these columns (flattened names). Takes priority over columnsToRemove."},"columnsToRemove":{"type":"array","items":{"type":"string"},"description":"Drop these columns (flattened names). Ignored if columnsToKeep is set."},"columnRenameMap":{"description":"Rename columns after keep/remove, as [\"oldName:newName\"] or {\"oldName\":\"newName\"}, for example {\"Details_founded\":\"founded\"}.","anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","additionalProperties":{"type":"string"}}]},"maxItems":{"type":"integer","minimum":0,"description":"Optional cap: read at most this many rows and return at most this many. 0 (default) means no cap."},"outputFormat":{"type":"string","enum":["json","csv"],"description":"json (default) returns rows; csv returns the same result as CSV text in \"csv\" instead."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"name":" Ana Silva ","email":"ANA@SILVA.CO.UK ","phone":"0117 496 0012"},{"name":"Ana Silva","email":"ana@silva.co.uk","phone":"01174960012"}],"dedupMode":"normalized","dedupKeys":["email"]}}}}}},"/data/join":{"post":{"operationId":"data_join","summary":"Join two lists of JSON rows on a shared key (like a spreadsheet VLOOKUP)","description":"Joins two lists of JSON rows on one or more key fields, like a VLOOKUP or SQL join: inner, left, right, full or anti. Keys match exactly, or normalized (case, spacing and number-as-text differences ignored). Returns joined rows plus match counts and unmatched rows. Up to 500 rows a side. $0.002 per left row sent (right rows free), $0.002 minimum. Same engine as nerolabs/dataset-join-merge.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"company":{"type":"string"},"domain":{"type":"string"},"employees":{"type":"number"},"_joinStatus":{"type":"string"},"_matchCount":{"type":"number"}}}},"summary":{"type":"object","properties":{"leftRecordCount":{"type":"number"},"rightRecordCount":{"type":"number"},"joinType":{"type":"string"},"keyMatching":{"type":"string"},"multipleMatches":{"type":"string"},"leftKeyFields":{"type":"array","items":{"type":"string"}},"rightKeyFields":{"type":"array","items":{"type":"string"}},"counts":{"type":"object","properties":{"matchedRows":{"type":"number"},"passthroughRows":{"type":"number"},"leftRowsMatched":{"type":"number"},"rightRowsMatched":{"type":"number"},"leftRowsUnmatched":{"type":"number"},"rightRowsUnmatched":{"type":"number"}}},"leftMatchRate":{"type":"number"},"rightMatchRate":{"type":"number"},"outputRowCount":{"type":"number"},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"company":"Acme Ltd","domain":"acme.com","employees":40,"_joinStatus":"matched","_matchCount":1},{"company":"Bolt Co","domain":"bolt.io","_joinStatus":"left_only","_matchCount":0}],"summary":{"leftRecordCount":2,"rightRecordCount":1,"joinType":"left","keyMatching":"normalized","multipleMatches":"all","leftKeyFields":["domain"],"rightKeyFields":["website"],"counts":{"matchedRows":1,"passthroughRows":1,"leftRowsMatched":1,"rightRowsMatched":1,"leftRowsUnmatched":1,"rightRowsUnmatched":0},"leftMatchRate":0.5,"rightMatchRate":1,"outputRowCount":2,"warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"leftRows":{"type":"array","description":"The LEFT table: the main rows you want to keep or enrich. Each row is a JSON object; keys may differ between rows.","items":{"type":"object"}},"rightRows":{"type":"array","description":"The RIGHT table: the lookup rows to pull matching fields from. Each row is a JSON object.","items":{"type":"object"}},"leftKeyFields":{"type":"array","description":"The field name(s) on the left rows to match on, for example [\"email\"], or [\"firstName\",\"lastName\"] for a composite key. Required for every joinType except union.","items":{"type":"string"}},"rightKeyFields":{"type":"array","description":"The matching field name(s) on the right rows, in the same order as leftKeyFields, for example [\"contact_email\"]. Leave out when the right rows use the same names as the left.","items":{"type":"string"}},"joinType":{"type":"string","enum":["left","inner","right","full","leftAnti","rightAnti","union"],"description":"Which rows to keep. left (default): every left row, enriched where a match exists. inner: matched rows only. right: every right row. full: everything from both sides. leftAnti: left rows with no match on the right. rightAnti: right rows with no match on the left. union: stack both lists, no key needed."},"keyMatching":{"type":"string","enum":["normalized","exact"],"description":"normalized (default): case-insensitive, trimmed, repeated spaces collapsed, 123 matches \"123\". exact: values must be identical."},"rightFields":{"type":"array","description":"Only copy these fields from the matching right row, like choosing VLOOKUP return columns. Leave out to copy every right field.","items":{"type":"string"}},"onFieldConflict":{"type":"string","enum":["prefixRight","keepLeft","keepRight"],"description":"When a right field has the same name as a left field. prefixRight (default): keep both, the right one renamed with rightFieldPrefix. keepLeft: ignore the right value. keepRight: overwrite the left value."},"rightFieldPrefix":{"type":"string","description":"Prefix for conflicting right fields when onFieldConflict is prefixRight. Default \"right_\", so price becomes right_price."},"multipleMatches":{"type":"string","enum":["all","first"],"description":"When one key matches several right rows. all (default): one output row per matching pair, like SQL. first: only the first matching right row, like VLOOKUP, so each left row appears once."},"includeJoinInfo":{"type":"boolean","description":"On by default: every row gets _joinStatus (\"matched\", \"left_only\", \"right_only\") and _matchCount. Set false for rows with only your own fields."}},"required":["leftRows","rightRows"],"additionalProperties":false},"example":{"leftRows":[{"company":"Acme Ltd","domain":"acme.com"},{"company":"Bolt Co","domain":"bolt.io"}],"rightRows":[{"website":" ACME.com","employees":40}],"leftKeyFields":["domain"],"rightKeyFields":["website"],"joinType":"left","keyMatching":"normalized"}}}}}},"/data/aggregate":{"post":{"operationId":"data_aggregate","summary":"Group, total, average and pivot a list of JSON rows","description":"Groups up to 500 JSON rows and works out totals per group: count, sum, average, min, max, median, distinct count, first and last, with date buckets (day, week, month, quarter, year), a pivot table, sorting, top N and a totals row. Returns one row per group plus a summary. $0.001 per row sent, $0.002 minimum. Same engine as nerolabs/dataset-aggregate-pivot.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"region":{"type":"string"},"sum_sales":{"type":"number"},"count":{"type":"number"}}}},"summary":{"type":"object","properties":{"inputRowCount":{"type":"number"},"groupByFields":{"type":"array","items":{"type":"string"}},"aggregations":{"type":"array","items":{"type":"object"}},"pivot":{},"groupCount":{"type":"number"},"droppedByTopN":{"type":"number"},"totalsRowIncluded":{"type":"boolean"},"outputRowCount":{"type":"number"},"columns":{"type":"array","items":{"type":"string"}},"skippedValues":{"type":"object","properties":{}},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"region":"North","sum_sales":180,"count":2},{"region":"South","sum_sales":80,"count":1}],"summary":{"inputRowCount":3,"groupByFields":["region"],"aggregations":[{"field":"sales","function":"sum","alias":"sum_sales"},{"function":"count","alias":"count"}],"pivot":null,"groupCount":2,"droppedByTopN":0,"totalsRowIncluded":false,"outputRowCount":2,"columns":["region","sum_sales","count"],"skippedValues":{},"warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","description":"The records to aggregate, up to 500. Each row is a JSON object; keys may differ between rows.","items":{"type":"object"}},"groupByFields":{"type":"array","description":"One output row per distinct combination of these field values, like SQL GROUP BY, for example [\"region\"] or [\"city\", \"category\"]. Dot paths like \"address.city\" work. Empty or omitted aggregates every row into a single row.","items":{"type":"string"}},"aggregations":{"type":"array","description":"What to compute per group, for example [{\"function\":\"count\",\"alias\":\"orders\"}, {\"field\":\"amount\",\"function\":\"sum\",\"alias\":\"total_amount\"}]. Every function except count needs a field. alias is the output column name (defaults to function_field, or \"count\"). Omitted gives a plain row count per group. Up to 20.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field to aggregate. Optional for count, which then counts rows."},"function":{"type":"string","enum":["count","countDistinct","sum","avg","min","max","median","first","last","list","listDistinct"]},"alias":{"type":"string","description":"Output column name."}},"required":["function"]}},"groupMatching":{"type":"string","enum":["normalized","exact"],"description":"normalized (default) ignores letter case and extra whitespace when grouping, so \"South\" and \"south \" are one group. exact requires identical values."},"dateBucketField":{"type":"string","description":"A date or timestamp field to group by time period, for example \"orderedAt\". Adds a group column named like \"orderedAt_month\". Unreadable dates land in an \"(invalid date)\" group."},"dateBucketGranularity":{"type":"string","enum":["day","week","month","quarter","year"],"description":"Bucket size for dateBucketField: day (2026-08-19), week (2026-W34), month (2026-08, default), quarter (2026-Q3) or year."},"pivotField":{"type":"string","description":"Turns this field's distinct values into columns, pivot-table style: group by \"region\" and pivot on \"product\" for one row per region with a column per product. Must not also be a group-by field. At most 50 distinct values."},"pivotValueField":{"type":"string","description":"The field whose values fill the pivot cells, for example \"amount\". Omitted fills each cell with a row count."},"pivotFunction":{"type":"string","enum":["count","countDistinct","sum","avg","min","max","median","first","last","list","listDistinct"],"description":"How pivot cell values are combined. Defaults to sum when pivotValueField is set; ignored (row count) without one."},"lenientNumbers":{"type":"boolean","description":"On by default: \"$1,234.50\", \"49 USD\", \"12%\" and \"(300)\" count as numbers for sum, avg, min, max and median. Set false to accept only real numbers and plain numeric strings."},"sortBy":{"type":"string","description":"An output column to sort by: a group field, an aggregation alias such as \"total_amount\", or a pivot column. Omitted sorts by the group fields."},"sortDirection":{"type":"string","enum":["asc","desc"],"description":"asc (default) or desc. Use desc with topN for \"top N by\" questions."},"topN":{"type":"integer","minimum":1,"description":"After sorting, keep only the first N groups. The totals row still covers every input row."},"includeTotalsRow":{"type":"boolean","description":"Appends a grand-total row labelled \"(total)\" and adds a _rowType column (\"group\" or \"total\")."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"region":"North","sales":120},{"region":"South","sales":80},{"region":"North","sales":60}],"groupByFields":["region"],"aggregations":[{"field":"sales","function":"sum"},{"function":"count"}]}}}}}},"/data/diff":{"post":{"operationId":"data_diff","summary":"Compare an old and a new list of rows: what was added, removed or changed","description":"Compares an old and a new list of JSON rows by a key field and returns what was added, removed and changed, with the old and new value of every changed field. Use it to spot new leads, price changes or deleted items between two scrapes. Up to 500 rows a side. $0.001 per new row sent (old rows free), $0.002 minimum. Same engine as nerolabs/dataset-diff-detector.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string"},"key":{"type":"object"},"oldValues":{"type":"object"},"newValues":{"type":"object"},"changedFields":{"type":"array"}}}},"summary":{"type":"object","properties":{"oldRecordCount":{"type":"number"},"newRecordCount":{"type":"number"},"counts":{"type":"object","properties":{"added":{"type":"number"},"removed":{"type":"number"},"changed":{"type":"number"},"unchanged":{"type":"number"}}},"differenceCount":{"type":"number"},"returnedRowCount":{"type":"number"},"unchangedRowsIncluded":{"type":"boolean"},"keyFieldsUsed":{"type":"array","items":{"type":"string"}},"duplicateRowsSkipped":{"type":"object","properties":{"old":{"type":"number"},"new":{"type":"number"}}},"rowsMissingKeyFields":{"type":"object","properties":{"old":{"type":"number"},"new":{"type":"number"}}},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"status":"removed","key":{"sku":"B2"},"oldValues":{"sku":"B2","price":20}},{"status":"changed","key":{"sku":"A1"},"oldValues":{"sku":"A1","price":10},"newValues":{"sku":"A1","price":12},"changedFields":["price"]},{"status":"added","key":{"sku":"C3"},"newValues":{"sku":"C3","price":5}}],"summary":{"oldRecordCount":2,"newRecordCount":2,"counts":{"added":1,"removed":1,"changed":1,"unchanged":0},"differenceCount":3,"returnedRowCount":3,"unchangedRowsIncluded":false,"keyFieldsUsed":["sku"],"duplicateRowsSkipped":{"old":0,"new":0},"rowsMissingKeyFields":{"old":0,"new":0},"warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"oldRows":{"type":"array","description":"The before snapshot: a JSON array of row objects. At least one row. Keys may differ between rows.","items":{"type":"object"}},"newRows":{"type":"array","description":"The after snapshot: a JSON array of row objects, the same kind of rows as oldRows. At least one row.","items":{"type":"object"}},"keyFields":{"type":"array","description":"Field name(s) that uniquely identify a row on both sides, for example [\"sku\"] or [\"country\",\"sku\"]. Strongly recommended: without it a changed row is reported as one removed row plus one added row.","items":{"type":"string"}},"compareFields":{"type":"array","description":"Optional. Only these fields decide whether a matched row changed. Default: every field on either row.","items":{"type":"string"}},"ignoreFields":{"type":"array","description":"Optional. Fields never compared, for example [\"scrapedAt\",\"lastChecked\"], so a timestamp alone does not mark a row changed.","items":{"type":"string"}},"includeUnchanged":{"type":"boolean","description":"Optional, default false. Set true to also return matched rows with no difference (status \"unchanged\"). They are always counted in the summary."}},"required":["oldRows","newRows"],"additionalProperties":false},"example":{"oldRows":[{"sku":"A1","price":10},{"sku":"B2","price":20}],"newRows":[{"sku":"A1","price":12},{"sku":"C3","price":5}],"keyFields":["sku"]}}}}}},"/data/merge-dedupe":{"post":{"operationId":"data_merge_dedupe","summary":"Merge several lists into one and remove the duplicates between them","description":"Merges two or more lists of JSON rows (for example leads from Google Maps, a CRM export and a spreadsheet) into one list and removes the duplicates between them by a key such as phone, email or website, ignoring spacing, case and http/www. Keeps the most complete row, fills its blanks from the duplicates and labels which lists each record was in. Up to 500 rows in all. $0.001 per row sent, $0.002 minimum.","tags":["data"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string"},"website":{"type":"string"},"_source":{"type":"string"},"_foundInSources":{"type":"array"},"_duplicatesMerged":{"type":"number"}}}},"summary":{"type":"object","properties":{"rowsIn":{"type":"number"},"rowsOut":{"type":"number"},"duplicatesRemoved":{"type":"number"},"blanksFilled":{"type":"number"},"modeUsed":{"type":"string"},"lists":{"type":"number"}}},"warnings":{"type":"array"},"_example_note":{"type":"string"}}},"example":{"rows":[{"name":"ACME PLUMBING","phone":"01174960012","website":"https://www.acme.co.uk/","_source":"CRM","_foundInSources":["Google Maps","CRM"],"_duplicatesMerged":1}],"summary":{"rowsIn":2,"rowsOut":1,"duplicatesRemoved":1,"blanksFilled":0,"modeUsed":"normalized","lists":2},"warnings":[],"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lists":{"type":"array","description":"Two or more lists to merge, each {\"name\":\"Google Maps\",\"rows\":[{...},{...}]}. Every row is a JSON object. The name is returned on each row as the list it came from.","items":{"type":"object"}},"dedupKeys":{"type":"array","items":{"type":"string"},"description":"Fields that identify the same record, for example [\"phone\"] or [\"website\"]. Leave out to compare whole rows."},"dedupMode":{"type":"string","enum":["exact","normalized","fuzzy","none"],"description":"normalized (default) ignores case, spaces, punctuation and http/www, so \"0117 496 0012\" matches \"01174960012\". fuzzy also catches near matches (100 rows at most). none only merges, no dedupe."},"keepStrategy":{"type":"string","enum":["most_complete","first","last"],"description":"Which duplicate to keep: most_complete (default, the row with the most filled fields), first or last."},"fillBlanksFromDuplicates":{"type":"boolean","description":"Default true: copy values the kept row is missing from the duplicates it replaced."},"similarityThreshold":{"type":"number","description":"fuzzy only, 0.5 to 1. Default 0.9."}},"required":["lists"],"additionalProperties":false},"example":{"lists":[{"name":"Google Maps","rows":[{"name":"Acme Plumbing","phone":"0117 496 0012","website":""}]},{"name":"CRM","rows":[{"name":"ACME PLUMBING","phone":"01174960012","website":"https://www.acme.co.uk/"}]}],"dedupKeys":["phone"]}}}}}},"/phone-check":{"post":{"operationId":"phone_check","summary":"Validate and format phone numbers for any country (mobile or landline, E.164)","description":"Checks up to 100 phone numbers from any country: valid or not, the number in international E.164 format (+441174960012) and national format, country, and line type (mobile, landline, toll free, VoIP) from Google's libphonenumber data. Set defaultRegion (GB, US...) for numbers written without a country code. Does not call the number. $0.002 per number, $0.002 minimum. Same engine as nerolabs/phone-number-validator.","tags":["phone"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.200000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"inputMode":{"type":"string"},"phoneField":{"type":"string"},"phoneFieldDetected":{"type":"boolean"},"defaultRegion":{"type":"string"},"keep":{"type":"string"},"inputRecordCount":{"type":"number"},"checkedCount":{"type":"number"},"outputRecordCount":{"type":"number"},"counts":{"type":"object","properties":{"valid":{"type":"number"},"risky":{"type":"number"},"invalid":{"type":"number"},"duplicate":{"type":"number"}}},"reasonCounts":{"type":"object","properties":{"ok":{"type":"number"},"too_short":{"type":"number"}}},"typeCounts":{"type":"object","properties":{"fixed_line":{"type":"number"},"fixed_line_or_mobile":{"type":"number"}}},"countryCounts":{"type":"object","properties":{"GB":{"type":"number"},"US":{"type":"number"}}},"mobileCount":{"type":"number"},"undeterminedMobileCount":{"type":"number"},"liveLineCheckPerformed":{"type":"boolean"},"liveLineCheckNote":{"type":"string"},"notInThisServer":{"type":"string"},"warnings":{"type":"array"}}},"rows":{"type":"array","items":{"type":"object","properties":{"phone":{"type":"string"},"phoneStatus":{"type":"string"},"phoneReason":{"type":"string"},"phoneAllReasons":{"type":"array"},"phoneE164":{"type":"string"},"phoneNational":{"type":"string"},"phoneInternational":{"type":"string"},"phoneCountry":{"type":"string"},"phoneCountryCallingCode":{"type":"string"},"phoneType":{"type":"string"},"isMobile":{},"phoneExtension":{},"phoneValid":{"type":"boolean"},"lineChecked":{"type":"boolean"}}}},"_example_note":{"type":"string"}}},"example":{"summary":{"inputMode":"phones","phoneField":"phone","phoneFieldDetected":false,"defaultRegion":"GB","keep":"all","inputRecordCount":3,"checkedCount":3,"outputRecordCount":3,"counts":{"valid":2,"risky":0,"invalid":1,"duplicate":0},"reasonCounts":{"ok":2,"too_short":1},"typeCounts":{"fixed_line":1,"fixed_line_or_mobile":1},"countryCounts":{"GB":1,"US":1},"mobileCount":0,"undeterminedMobileCount":1,"liveLineCheckPerformed":false,"liveLineCheckNote":"These checks confirm that a number is correctly formed and exists in its country numbering plan, and report its country and line type. They ...","notInThisServer":"Region, allocated carrier and timezone lookups, Apify dataset / CSV / Excel / Google Sheet input, CSV and Excel export and webhooks are in t...","warnings":[]},"rows":[{"phone":"0117 496 0012","phoneStatus":"valid","phoneReason":"ok","phoneAllReasons":["ok"],"phoneE164":"+441174960012","phoneNational":"0117 496 0012","phoneInternational":"+44 117 496 0012","phoneCountry":"GB","phoneCountryCallingCode":"+44","phoneType":"fixed_line","isMobile":false,"phoneExtension":null,"phoneValid":true,"lineChecked":false},{"phone":"+1 (415) 555-0132","phoneStatus":"valid","phoneReason":"ok","phoneAllReasons":["ok"],"phoneE164":"+14155550132","phoneNational":"(415) 555-0132","phoneInternational":"+1 415 555 0132","phoneCountry":"US","phoneCountryCallingCode":"+1","phoneType":"fixed_line_or_mobile","isMobile":null,"phoneExtension":null,"phoneValid":true,"lineChecked":false},{"phone":"12345","phoneStatus":"invalid","phoneReason":"too_short","phoneAllReasons":["too_short"],"phoneE164":"+4412345","phoneNational":"12345","phoneInternational":"+44 12345","phoneCountry":"GB","phoneCountryCallingCode":"+44","phoneType":"unknown","isMobile":null,"phoneExtension":null,"phoneValid":false,"lineChecked":false}],"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"phones":{"type":"array","description":"A plain list of phone numbers in any format, for example [\"+44 20 7946 0123\", \"07825 123456\", \"(212) 555-0123\"]. Bare numbers such as 2079460123 are also accepted. Use this OR rows.","items":{"type":"string"}},"rows":{"type":"array","description":"JSON objects that each hold a phone number in one field. Every original field comes back untouched with the verdict fields added. Use this OR phones.","items":{"type":"object"}},"phoneField":{"type":"string","description":"Rows only. The field holding the number, for example \"phone\" or \"contact_number\". Leave out to detect it automatically."},"defaultRegion":{"type":"string","description":"Two-letter ISO country code assumed for numbers written without a country code, for example GB, US, AU, DE. Numbers starting with + are unaffected."},"flagPremiumRate":{"type":"boolean","description":"Default true: premium-rate numbers come back risky rather than valid."},"flagVoip":{"type":"boolean","description":"Default true: VoIP numbers come back risky."},"flagNonPersonal":{"type":"boolean","description":"Default true: toll free, shared cost, UAN, pager and voicemail numbers come back risky."},"markDuplicates":{"type":"boolean","description":"Default true: later repeats of the same E.164 number in this call come back duplicate."},"keep":{"type":"string","enum":["all","valid","valid_and_risky","problems","mobile"],"description":"Which rows to return. all (default), valid, valid_and_risky, problems, or mobile (confirmed mobiles only, for SMS). The summary still counts every number."}},"additionalProperties":false},"example":{"phones":["0117 496 0012","+1 (415) 555-0132","12345"],"defaultRegion":"GB"}}}}}},"/engagement-rate":{"post":{"operationId":"engagement_rate","summary":"Engagement rate, fake follower signs and a shortlist verdict for Instagram, TikTok and YouTube creators","description":"Scores creators from rows an Instagram, TikTok or YouTube scraper already returned (or your own rows): engagement rate by followers and by views, typical rate for that size, fake follower warning signs with reasons, a 0 to 100 score, grade A to F and a shortlist, check or skip verdict. No scraping. $0.003 per creator found in the rows (8 videos of one creator = 1), 100 creators at most. Not charged if none can be scored.","tags":["influencer"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.003000","max":"0.300000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"creators":{"type":"array","items":{"type":"object","properties":{"authenticityScore":{"type":"number"},"avgComments":{"type":"number"},"avgLikes":{"type":"number"},"avgSaves":{},"avgShares":{},"avgViews":{},"benchmarkEngagementRate":{"type":"number"},"confidence":{"type":"string"},"creatorScore":{"type":"number"},"daysSinceLastPost":{},"displayName":{},"engagementBasis":{"type":"string"},"engagementLevel":{"type":"string"},"engagementRate":{"type":"number"},"engagementRateByViews":{},"engagementVsBenchmark":{"type":"number"},"followers":{"type":"number"},"following":{"type":"number"},"grade":{"type":"string"},"handle":{"type":"string"},"lastPostAt":{},"likeToCommentRatio":{"type":"number"},"medianEngagementRate":{"type":"number"},"medianLikes":{},"nicheMatch":{"type":"boolean"},"nicheWordsFound":{"type":"array","items":{"type":"string"}},"platform":{"type":"string"},"postsAnalyzed":{"type":"number"},"postsPerWeek":{},"profileUrl":{},"riskSignalCodes":{"type":"array","items":{"type":"string"}},"riskSignals":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"detail":{"type":"string"}}}},"sponsoredPostShare":{},"status":{"type":"string"},"tier":{"type":"string"},"topHashtags":{"type":"array","items":{"type":"string"}},"totalPosts":{},"verdict":{"type":"string"},"verdictReason":{"type":"string"},"verified":{},"viewsToFollowersPercent":{}}}},"summary":{"type":"object","properties":{"creatorsFound":{"type":"number"},"creatorsScored":{"type":"number"},"rowsIn":{"type":"number"},"unreadableRows":{"type":"number"},"verdicts":{"type":"object","properties":{"check":{"type":"number"},"shortlist":{"type":"number"},"skip":{"type":"number"}}}}}}},"example":{"creators":[{"status":"ok","platform":"instagram","handle":"example_trail_runner","displayName":null,"profileUrl":null,"followers":48200,"following":610,"totalPosts":412,"verified":null,"postsAnalyzed":4,"avgLikes":1551,"avgComments":69,"avgViews":21000,"avgShares":null,"avgSaves":null,"medianLikes":1545,"postsPerWeek":1.5,"lastPostAt":"2026-10-28T09:00:00.000Z","daysSinceLastPost":4,"sponsoredPostShare":0,"topHashtags":["trailrunning","ultra"],"nicheMatch":true,"nicheWordsFound":["running"],"engagementRate":3.36,"medianEngagementRate":3.35,"engagementRateByViews":6.89,"viewsToFollowersPercent":43.6,"engagementBasis":"(likes + comments) / followers per post","tier":"micro","benchmarkEngagementRate":2.2,"engagementVsBenchmark":1.52,"engagementLevel":"typical","likeToCommentRatio":22,"riskSignals":[],"riskSignalCodes":[],"authenticityScore":100,"creatorScore":86,"grade":"A","verdict":"shortlist","verdictReason":"Shortlist: typical engagement for a micro account and no serious warning signs.","confidence":"medium"},{"status":"ok","platform":"instagram","handle":"example_home_baker","displayName":null,"profileUrl":null,"followers":12000,"following":11400,"totalPosts":null,"verified":null,"postsAnalyzed":0,"avgLikes":40,"avgComments":1,"avgViews":null,"avgShares":null,"avgSaves":null,"medianLikes":null,"postsPerWeek":null,"lastPostAt":null,"daysSinceLastPost":null,"sponsoredPostShare":null,"topHashtags":[],"nicheMatch":false,"nicheWordsFound":[],"engagementRate":0.34,"medianEngagementRate":0.34,"engagementRateByViews":null,"viewsToFollowersPercent":null,"engagementBasis":"(likes + comments) / followers per post","tier":"micro","benchmarkEngagementRate":2.2,"engagementVsBenchmark":0.16,"engagementLevel":"very low","likeToCommentRatio":40,"riskSignals":[{"code":"low_engagement","detail":"Engagement is 0.34% ((likes + comments) / followers per post), about a third or less of the 2.2% typical for a micro account. Common with inactive or bought followers."},{"code":"follow_back","detail":"Follows 11k accounts with 12k followers. Follow-for-follow growth inflates the count."}],"riskSignalCodes":["low_engagement","follow_back"],"authenticityScore":45,"creatorScore":29,"grade":"F","verdict":"skip","verdictReason":"Skip: low engagement and follow back.","confidence":"low"}],"summary":{"rowsIn":2,"creatorsFound":2,"creatorsScored":2,"unreadableRows":0,"verdicts":{"shortlist":1,"check":0,"skip":1}}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Rows straight from an Instagram profile or post scraper, a TikTok video scraper or a YouTube video scraper, or your own rows with username, platform, followers and either posts or avgLikes/avgComments/engagementRate. Posts and profiles of the same creator are merged. 100 creators and 3000 rows at most."},"nicheKeywords":{"type":"array","items":{"type":"string"},"description":"Optional words to look for in the bio, captions and hashtags (fitness, vegan...). Sets nicheMatch on each creator; nobody is left out."},"maxPostsPerCreator":{"type":"integer","minimum":1,"maximum":200,"description":"Newest posts to judge per creator. Default 30."},"lookbackDays":{"type":"integer","minimum":0,"maximum":3650,"description":"Only judge posts from the last N days when at least 3 fall inside. Default 120; 0 means no limit."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"username":"example_trail_runner","followersCount":48200,"followsCount":610,"postsCount":412,"biography":"Trail running and ultra training","latestPosts":[{"id":"p1","type":"Image","likesCount":1610,"commentsCount":74,"timestamp":"2026-10-28T09:00:00Z","caption":"Hill reps #trailrunning"},{"id":"p2","type":"Video","likesCount":1395,"commentsCount":51,"videoViewCount":21000,"timestamp":"2026-10-24T09:00:00Z","caption":"Race day #ultra"},{"id":"p3","type":"Image","likesCount":1720,"commentsCount":88,"timestamp":"2026-10-19T09:00:00Z","caption":"New shoes test #trailrunning"},{"id":"p4","type":"Image","likesCount":1480,"commentsCount":63,"timestamp":"2026-10-14T09:00:00Z","caption":"Recovery week"}]},{"username":"example_home_baker","platform":"instagram","followers":12000,"following":11400,"avgLikes":40,"avgComments":1}],"nicheKeywords":["running"]}}}}}},"/video-outliers":{"post":{"operationId":"video_outliers","summary":"Find TikTok, Reels and YouTube videos that beat their creator's normal views (outlier score, hook, hashtags)","description":"Scores videos from rows a TikTok, Instagram Reels or YouTube scraper already returned (or your own rows): views divided by the same creator's median views, level (viral 10x, strong 5x, outlier, rising), pace for new videos, engagement against their normal, the hook and a plain reason, plus hashtags that overperform. No scraping. $0.002 per video found, 500 at most. Not charged if none can be scored.","tags":["tiktok"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"creators":{"type":"array","items":{"type":"object","properties":{"bestOutlierScore":{},"bestVideoUrl":{},"creator":{"type":"string"},"followers":{},"medianViews":{},"outliers":{"type":"number"},"platform":{"type":"string"},"status":{"type":"string"},"videosGiven":{"type":"number"},"videosInBaseline":{"type":"number"}}}},"hashtagsThatOverperform":{"type":"array","items":{"type":"object","properties":{"allVideos":{"type":"number"},"hashtag":{"type":"string"},"lift":{"type":"number"},"outlierVideos":{"type":"number"}}}},"notScored":{"type":"array","items":{}},"summary":{"type":"object","properties":{"creators":{"type":"number"},"outliers":{"type":"number"},"rowsIn":{"type":"number"},"unreadableRows":{"type":"number"},"videosFound":{"type":"number"},"videosScored":{"type":"number"}}},"videos":{"type":"array","items":{"type":"object","properties":{"ageDays":{},"caption":{},"comments":{},"creator":{"type":"string"},"creatorMedianEngagementRate":{},"creatorMedianViews":{},"creatorUrl":{},"durationSec":{},"engagementRate":{},"engagementVsCreator":{},"followers":{},"hashtags":{"type":"array","items":{"type":"string"}},"hook":{"type":"string"},"isOutlier":{"type":"boolean"},"level":{"type":"string"},"likes":{},"outlierScore":{"type":"number"},"paceScore":{},"pinned":{},"platform":{"type":"string"},"postedBy":{},"publishedAt":{},"rankInCreator":{"type":"number"},"rankOverall":{"type":"number"},"reason":{"type":"string"},"saves":{},"shares":{},"sponsored":{},"status":{"type":"string"},"videoId":{},"videoUrl":{},"videosInBaseline":{},"views":{"type":"number"},"viewsPerDay":{},"viewsToFollowers":{}}}}}},"example":{"videos":[{"status":"ok","platform":"tiktok","creator":"example_dance_coach","followers":null,"hook":"The one move beginners get wrong","hashtags":["dance"],"publishedAt":"2026-10-13T00:00:00.000Z","ageDays":19.8,"views":240000,"likes":20000,"outlierScore":11.43,"creatorMedianViews":21000,"paceScore":7.72,"viewsPerDay":12116,"viewsToFollowers":null,"engagementRate":8.33,"creatorMedianEngagementRate":8.33,"engagementVsCreator":1,"level":"viral","isOutlier":true,"reason":"240K views, 11.4x example_dance_coach's median of 21K across 6 videos.","rankInCreator":1,"rankOverall":1},{"status":"ok","platform":"tiktok","creator":"example_dance_coach","followers":null,"hook":"Try this","hashtags":["tutorial"],"publishedAt":"2026-10-25T00:00:00.000Z","ageDays":7.8,"views":61000,"likes":5083,"outlierScore":2.9,"creatorMedianViews":21000,"paceScore":4.98,"viewsPerDay":7812,"viewsToFollowers":null,"engagementRate":8.33,"creatorMedianEngagementRate":8.33,"engagementVsCreator":1,"level":"outlier","isOutlier":true,"reason":"61K views, 2.9x example_dance_coach's median of 21K across 6 videos.","rankInCreator":2,"rankOverall":2}],"notScored":[],"creators":[{"creator":"example_dance_coach","platform":"tiktok","followers":null,"videosGiven":6,"videosInBaseline":6,"medianViews":22900,"outliers":2,"bestVideoUrl":null,"bestOutlierScore":11.43,"status":"ok"}],"hashtagsThatOverperform":[{"hashtag":"tutorial","outlierVideos":1,"allVideos":1,"lift":3},{"hashtag":"dance","outlierVideos":1,"allVideos":2,"lift":1.5}],"summary":{"rowsIn":6,"videosFound":6,"videosScored":6,"outliers":2,"creators":1,"unreadableRows":0}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Rows straight from a TikTok video scraper, an Instagram Reel, post or profile scraper or a YouTube video scraper, or your own rows with creator, views and optionally likes, comments, shares, date, url and caption. Send 5 to 30 videos per creator so their normal can be worked out. 500 videos at most."},"minOutlierScore":{"type":"number","minimum":1.1,"maximum":1000,"description":"A video is an outlier when its views are at least this many times the creator's median views. Default 2."},"minVideosPerCreator":{"type":"integer","minimum":3,"maximum":500,"description":"Videos with views needed to know a creator's normal. Default 5, minimum 3."},"onlyOutliers":{"type":"boolean","description":"Return only outlier and rising videos (all videos are still scored and billed). Default false."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"creator":"example_dance_coach","platform":"tiktok","views":21000,"likes":1750,"date":"2026-10-05","caption":"Warm up #dance"},{"creator":"example_dance_coach","platform":"tiktok","views":18500,"likes":1542,"date":"2026-10-09","caption":"Slow version"},{"creator":"example_dance_coach","platform":"tiktok","views":240000,"likes":20000,"date":"2026-10-13","caption":"The one move beginners get wrong #dance"},{"creator":"example_dance_coach","platform":"tiktok","views":24800,"likes":2067,"date":"2026-10-17","caption":"Studio tour"},{"creator":"example_dance_coach","platform":"tiktok","views":19900,"likes":1658,"date":"2026-10-21","caption":"Q and A"},{"creator":"example_dance_coach","platform":"tiktok","views":61000,"likes":5083,"date":"2026-10-25","caption":"Try this #tutorial"}]}}}}}},"/best-time-to-post":{"post":{"operationId":"best_time_to_post","summary":"Best weekday and hour to post for Instagram, TikTok, YouTube, X or Facebook accounts, from their own posts","description":"Ranks the weekday and hour slots when each account's posts did best, from rows a post scraper already returned (or your own rows with account, date and likes): each post against the account's own median, slots scored with a pull towards normal, best days, best hours, the most used and weakest slot, a heatmap and a reason, in your time zone. No scraping. $0.02 per account found, 20 at most. Not charged if none can be analysed.","tags":["best time to post"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.020000","max":"0.400000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"type":"array","items":{"type":"object","properties":{"account":{"type":"string"},"accountUrl":{},"baselineMetric":{"type":"number"},"bestDay":{},"bestDayLift":{},"bestDays":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string"},"hours":{},"medianLift":{"type":"number"},"posts":{"type":"number"},"score":{"type":"number"},"slot":{"type":"string"},"startHour":{}}}},"bestHourBlock":{"type":"string"},"bestHourLift":{"type":"number"},"bestHours":{"type":"array","items":{"type":"object","properties":{"day":{},"hours":{"type":"string"},"medianLift":{"type":"number"},"posts":{"type":"number"},"score":{"type":"number"},"slot":{"type":"string"},"startHour":{"type":"number"}}}},"bestSlot":{},"bestSlotLift":{},"bestSlots":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string"},"hours":{"type":"string"},"medianLift":{"type":"number"},"posts":{"type":"number"},"score":{"type":"number"},"slot":{"type":"string"},"startHour":{"type":"number"}}}},"blockHours":{"type":"number"},"confidence":{"type":"string"},"firstPostAt":{"type":"string"},"followers":{},"heatmap":{},"lastPostAt":{"type":"string"},"metric":{"type":"string"},"mostUsedSlot":{"type":"string"},"mostUsedSlotLift":{"type":"number"},"platform":{"type":"string"},"postsAnalysed":{"type":"number"},"postsFound":{"type":"number"},"postsPerWeek":{"type":"number"},"postsWithTime":{"type":"number"},"reason":{"type":"string"},"scope":{"type":"string"},"status":{"type":"string"},"timeZone":{"type":"string"},"worstSlot":{},"worstSlotLift":{}}}},"allAccounts":{},"notAnalysed":{"type":"array","items":{}},"summary":{"type":"object","properties":{"accounts":{"type":"number"},"accountsAnalysed":{"type":"number"},"postsFound":{"type":"number"},"rowsIn":{"type":"number"},"timeZone":{"type":"string"},"unreadableRows":{"type":"number"}}}}},"example":{"accounts":[{"status":"ok","scope":"account","platform":"other","account":"example_bakery","accountUrl":null,"followers":null,"timeZone":"America/New_York","metric":"engagement","blockHours":3,"postsFound":12,"postsAnalysed":12,"postsWithTime":12,"firstPostAt":"2026-10-01T23:30:00.000Z","lastPostAt":"2026-10-23T15:30:00.000Z","postsPerWeek":3.88,"baselineMetric":226.5,"bestSlot":null,"bestSlotLift":null,"bestDay":null,"bestDayLift":null,"bestHourBlock":"18:00-21:00","bestHourLift":1.43,"mostUsedSlot":"Sat 18:00-21:00","mostUsedSlotLift":1.5,"worstSlot":null,"worstSlotLift":null,"confidence":"low","reason":"Too few posts per day to rank slots; scrape more posts. Best hours 18:00-21:00 on any day (1.43x). Confidence low.","bestSlots":[],"bestDays":[],"bestHours":[{"slot":"18:00-21:00","day":null,"hours":"18:00-21:00","startHour":18,"posts":6,"medianLift":1.43,"score":1.27}]}],"notAnalysed":[],"allAccounts":null,"summary":{"rowsIn":12,"postsFound":12,"accounts":1,"accountsAnalysed":1,"unreadableRows":0,"timeZone":"America/New_York"}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Post rows straight from an Instagram, TikTok, YouTube, X or Facebook post scraper, or your own rows with account, date (with clock time) and likes, comments, shares or views. Send 30 to 150 posts per account. 3000 rows and 20 accounts at most."},"timeZone":{"type":"string","description":"Time zone name for the answer, e.g. America/New_York, Europe/London. Default UTC."},"blockHours":{"type":"integer","minimum":1,"maximum":6,"description":"Hours per slot: 1, 2, 3, 4 or 6. Default 3."},"metric":{"type":"string","enum":["engagement","views","likes","comments","engagement_rate"],"description":"What a good post is judged on. Default engagement (likes + comments + shares + saves)."},"minPostsPerSlot":{"type":"integer","minimum":1,"maximum":50,"description":"Posts needed before a slot is ranked. Default 3."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"account":"example_bakery","date":"2026-10-01T23:30:00Z","likes":300},{"account":"example_bakery","date":"2026-10-03T15:30:00Z","likes":123},{"account":"example_bakery","date":"2026-10-05T23:30:00Z","likes":310},{"account":"example_bakery","date":"2026-10-07T15:30:00Z","likes":129},{"account":"example_bakery","date":"2026-10-09T23:30:00Z","likes":320},{"account":"example_bakery","date":"2026-10-11T15:30:00Z","likes":135},{"account":"example_bakery","date":"2026-10-13T23:30:00Z","likes":330},{"account":"example_bakery","date":"2026-10-15T15:30:00Z","likes":141},{"account":"example_bakery","date":"2026-10-17T23:30:00Z","likes":340},{"account":"example_bakery","date":"2026-10-19T15:30:00Z","likes":147},{"account":"example_bakery","date":"2026-10-21T23:30:00Z","likes":350},{"account":"example_bakery","date":"2026-10-23T15:30:00Z","likes":153}],"timeZone":"America/New_York"}}}}}},"/winning-ads":{"post":{"operationId":"winning_ads","summary":"Find winning Facebook and Instagram ads: score Ad Library rows by days running, copies and live status","description":"Scores ads from rows a Facebook or Meta Ad Library scraper (or Google Ads Transparency scraper) already returned, or your own rows: days running, still live, copies of the creative, against the advertiser's own median, a winner score 0 to 100, a tier (proven winner, scaling, testing, stopped early) and a reason, plus a summary per advertiser. No scraping. $0.002 per unique ad, 500 at most. Not charged if none can be scored.","tags":["facebook ads"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ads":{"type":"array","items":{"type":"object","properties":{"adId":{"type":"string"},"adText":{},"adUrl":{},"advertiser":{"type":"string"},"copies":{"type":"number"},"cta":{},"daysRunning":{"type":"number"},"endDate":{},"format":{},"landingDomain":{},"rank":{"type":"number"},"reason":{"type":"string"},"startDate":{"type":"string"},"stillLive":{"type":"boolean"},"tier":{"type":"string"},"vsAdvertiserMedian":{},"winnerScore":{"type":"number"}}}},"advertisers":{"type":"array","items":{"type":"object","properties":{"adsScored":{"type":"number"},"advertiser":{"type":"string"},"advertiserId":{},"formats":{"type":"object","properties":{"carousel":{},"dco":{},"dpa":{},"image":{},"unknown":{},"video":{}}},"liveAds":{"type":"number"},"longestRunningDays":{"type":"number"},"medianDaysRunning":{"type":"number"},"newAdsLast30Days":{"type":"number"},"newAdsLast7Days":{"type":"number"},"provenWinners":{"type":"number"},"stoppedEarlyShare":{"type":"number"},"topAdId":{"type":"string"},"topAdScore":{"type":"number"},"topAdUrl":{},"topLandingDomains":{"type":"array","items":{"type":"object","properties":{"ads":{"type":"number"},"domain":{"type":"string"},"winners":{"type":"number"}}}}}}},"summary":{"type":"object","properties":{"adsScored":{"type":"number"},"asOfDate":{"type":"string"},"duplicateRowsMerged":{"type":"number"},"rowsIn":{"type":"number"},"tierCounts":{"type":"object","properties":{"promising":{},"proven_winner":{"type":"number"},"ran_a_while":{"type":"number"},"stopped_early":{"type":"number"},"testing":{"type":"number"}}},"uniqueAds":{"type":"number"}}}}},"example":{"ads":[{"rank":1,"advertiser":"Example Snack Co","adId":"1001","winnerScore":88,"tier":"proven_winner","daysRunning":152,"stillLive":true,"copies":4,"startDate":"2026-06-02","endDate":null,"vsAdvertiserMedian":3.62,"reason":"Still live after 152 days, 4 copies of this creative, 3.62x this advertiser's median of 42","format":null,"adText":null,"cta":null,"landingDomain":"example.com","adUrl":null},{"rank":2,"advertiser":"Example Snack Co","adId":"1005","winnerScore":68,"tier":"proven_winner","daysRunning":42,"stillLive":true,"copies":3,"startDate":"2026-09-20","endDate":null,"vsAdvertiserMedian":1,"reason":"Still live after 42 days, 3 copies of this creative, 1x this advertiser's median of 42 day","format":null,"adText":null,"cta":null,"landingDomain":"example.com","adUrl":null},{"rank":3,"advertiser":"Example Snack Co","adId":"1003","winnerScore":49,"tier":"ran_a_while","daysRunning":70,"stillLive":false,"copies":1,"startDate":"2026-08-01","endDate":"2026-10-10","vsAdvertiserMedian":1.67,"reason":"Ran for 70 days, 1.67x this advertiser's median of 42 days. Ran for a while, then stopped.","format":null,"adText":null,"cta":null,"landingDomain":"example.com","adUrl":null}],"advertisers":[{"advertiser":"Example Snack Co","advertiserId":null,"adsScored":5,"liveAds":3,"provenWinners":2,"medianDaysRunning":42,"longestRunningDays":152,"newAdsLast7Days":1,"newAdsLast30Days":1,"stoppedEarlyShare":0.2,"topAdId":"1001","topAdScore":88,"topAdUrl":null,"topLandingDomains":[{"domain":"example.com","ads":5,"winners":2}],"formats":{"unknown":5}}],"summary":{"rowsIn":5,"uniqueAds":5,"duplicateRowsMerged":0,"adsScored":5,"tierCounts":{"proven_winner":2,"ran_a_while":1,"testing":1,"stopped_early":1},"asOfDate":"2026-11-01"}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Rows straight from a Facebook or Meta Ad Library scraper (curious_coder/facebook-ads-library-scraper, apify/facebook-ads-scraper and look-alikes) or a Google Ads Transparency scraper, or your own rows with advertiser, adId, startDate and optionally endDate, isActive, copies and landingUrl. 500 unique ads at most."},"asOfDate":{"type":"string","description":"The date the rows were scraped (e.g. 2026-11-01), used to count days for live ads. Default: worked out from the rows, else today."},"minDaysRunning":{"type":"number","minimum":0,"maximum":3650,"description":"Return only ads that ran at least this many days (all ads are still scored and billed). Default 0."},"onlyLive":{"type":"boolean","description":"Return only ads still live (all ads are still scored and billed). Default false."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"advertiser":"Example Snack Co","adId":"1001","startDate":"2026-06-02","isActive":true,"copies":4,"landingUrl":"https://example.com/bundle"},{"advertiser":"Example Snack Co","adId":"1002","startDate":"2026-09-10","endDate":"2026-09-15","isActive":false,"landingUrl":"https://example.com/trial"},{"advertiser":"Example Snack Co","adId":"1003","startDate":"2026-08-01","endDate":"2026-10-10","isActive":false,"landingUrl":"https://example.com/bundle"},{"advertiser":"Example Snack Co","adId":"1004","startDate":"2026-10-25","isActive":true,"landingUrl":"https://example.com/new"},{"advertiser":"Example Snack Co","adId":"1005","startDate":"2026-09-20","isActive":true,"copies":3,"landingUrl":"https://example.com/bundle"}],"asOfDate":"2026-11-01"}}}}}},"/review-velocity":{"post":{"operationId":"review_velocity","summary":"Score Google Maps businesses from review rows: review velocity, owner reply rate, unanswered bad reviews, lead score","description":"Scores each business in rows a Google Maps reviews scraper already returned (or your own rows): reviews in the last 90 days vs the 90 before, momentum (growing, slowing, stalled), owner reply rate, unanswered 1 and 2 star reviews, rating trend, tags such as neglected, a lead score 0 to 100 and a one-line pitch. No scraping. $0.004 per business, 100 at most. Not charged if none can be scored.","tags":["google maps"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.004000","max":"0.400000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"businesses":{"type":"array","items":{"type":"object","properties":{"business":{"type":"string"},"category":{},"city":{},"daysSinceLastReview":{"type":"number"},"googleRating":{"type":"number"},"googleReviewsCount":{"type":"number"},"leadScore":{"type":"number"},"mapsUrl":{},"momentum":{"type":"string"},"ownerReplyRate":{"type":"number"},"pitch":{"type":"string"},"placeId":{"type":"string"},"rank":{"type":"number"},"ratingTrend":{"type":"string"},"reviewsLastWindow":{"type":"number"},"reviewsPerMonth":{"type":"number"},"reviewsPrevWindow":{},"tags":{"type":"array","items":{"type":"string"}},"unansweredNegative":{"type":"number"},"velocityChangePct":{}}}},"summary":{"type":"object","properties":{"asOfDate":{"type":"string"},"businessesScored":{"type":"number"},"reviewsRead":{"type":"number"},"rowsIn":{"type":"number"},"windowDays":{"type":"number"}}}}},"example":{"businesses":[{"rank":1,"business":"Example Plumbing","placeId":"P1","leadScore":64,"momentum":"steady","tags":["never_replies","unanswered_negative","neglected"],"pitch":"Replies to 0 of 6 recent reviews; 2 unanswered 1 or 2 star reviews; 2 reviews in the last 90 days.","reviewsLastWindow":2,"reviewsPrevWindow":3,"velocityChangePct":-33,"reviewsPerMonth":0.7,"daysSinceLastReview":12,"ownerReplyRate":0,"unansweredNegative":2,"ratingTrend":"unknown","googleRating":4.1,"googleReviewsCount":40,"category":null,"city":null,"mapsUrl":null},{"rank":2,"business":"Example Dental","placeId":"P2","leadScore":12,"momentum":"unknown","tags":["few_reviews"],"pitch":"3 reviews in the last 90 days.","reviewsLastWindow":3,"reviewsPrevWindow":null,"velocityChangePct":null,"reviewsPerMonth":2.4,"daysSinceLastReview":4,"ownerReplyRate":1,"unansweredNegative":0,"ratingTrend":"unknown","googleRating":4.8,"googleReviewsCount":12,"category":null,"city":null,"mapsUrl":null}],"summary":{"rowsIn":9,"reviewsRead":9,"businessesScored":2,"windowDays":90,"asOfDate":"2026-11-01"}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Rows straight from a Google Maps reviews scraper (compass/google-maps-reviews-scraper and look-alikes), place rows from compass/crawler-google-places with a reviews array, or your own rows with title (or placeId), publishedAtDate, stars and responseFromOwnerText. 3000 rows and 100 businesses at most."},"windowDays":{"type":"number","minimum":7,"maximum":365,"description":"Reviews in the last N days are compared with the N days before. Default 90."},"asOfDate":{"type":"string","description":"The date the windows count back from (e.g. 2026-11-01). Default: the newest scrapedAt in the rows, else today."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"title":"Example Plumbing","placeId":"P1","totalScore":4.1,"reviewsCount":40,"publishedAtDate":"2026-10-20","stars":1,"responseFromOwnerText":null},{"title":"Example Plumbing","placeId":"P1","publishedAtDate":"2026-09-02","stars":5,"responseFromOwnerText":null},{"title":"Example Plumbing","placeId":"P1","publishedAtDate":"2026-07-15","stars":4,"responseFromOwnerText":null},{"title":"Example Plumbing","placeId":"P1","publishedAtDate":"2026-06-10","stars":5,"responseFromOwnerText":null},{"title":"Example Plumbing","placeId":"P1","publishedAtDate":"2026-05-20","stars":2,"responseFromOwnerText":null},{"title":"Example Plumbing","placeId":"P1","publishedAtDate":"2026-04-28","stars":5,"responseFromOwnerText":null},{"title":"Example Dental","placeId":"P2","totalScore":4.8,"reviewsCount":12,"publishedAtDate":"2026-10-28","stars":5,"responseFromOwnerText":"Thank you!"},{"title":"Example Dental","placeId":"P2","publishedAtDate":"2026-10-11","stars":5,"responseFromOwnerText":"Thank you!"},{"title":"Example Dental","placeId":"P2","publishedAtDate":"2026-09-25","stars":4,"responseFromOwnerText":"Thanks!"}],"asOfDate":"2026-11-01"}}}}}},"/reddit-recommends":{"post":{"operationId":"reddit_recommends","summary":"What does Reddit recommend? Rank the products and brands named in Reddit comment rows","description":"Ranks the brands and products people recommend in comment rows a Reddit scraper already returned for a \"best X\" search or thread (or your own rows): comments mentioning each name, upvote-weighted score, positive and negative mentions, models and versions seen, and the top quote with its link. Reads Reddit's own product links, capitalised names and model numbers; text rules, no AI, no scraping. $0.0005 per comment row ($0.001 a call at least), 2000 at most. Not charged if no row has text.","tags":["reddit"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"recommendations":{"type":"array","items":{"type":"object","properties":{"alsoWrittenAs":{"type":"array","items":{}},"brand":{},"kind":{"type":"string"},"mentions":{"type":"number"},"name":{"type":"string"},"negative":{"type":"number"},"positive":{"type":"number"},"rank":{"type":"number"},"recommendScore":{"type":"number"},"sentiment":{"type":"number"},"topQuote":{"type":"string"},"topQuoteUpvotes":{"type":"number"},"topQuoteUrl":{},"upvotesOnMentions":{"type":"number"},"versions":{"type":"array","items":{"type":"string"}}}}},"summary":{"type":"object","properties":{"brandsDetected":{"type":"number"},"commentsUsed":{"type":"number"},"minMentions":{"type":"number"},"namesFound":{"type":"number"},"note":{"type":"string"},"rowsRead":{"type":"number"},"topBrand":{},"topProduct":{"type":"string"}}}}},"example":{"recommendations":[{"rank":1,"name":"Ridgeway Summit","brand":null,"kind":"product","mentions":2,"upvotesOnMentions":60,"positive":2,"negative":0,"sentiment":1,"recommendScore":100,"versions":["4"],"alsoWrittenAs":[],"topQuote":"Highly recommend the Ridgeway Summit 4.","topQuoteUpvotes":42,"topQuoteUrl":null},{"rank":2,"name":"Fernlo Glide","brand":null,"kind":"product","mentions":2,"upvotesOnMentions":17,"positive":1,"negative":1,"sentiment":0,"recommendScore":50,"versions":["2"],"alsoWrittenAs":[],"topQuote":"I run in the Fernlo Glide 2 and it is great on mud.","topQuoteUpvotes":12,"topQuoteUrl":null}],"summary":{"rowsRead":6,"commentsUsed":6,"namesFound":2,"topProduct":"Ridgeway Summit","topBrand":null,"brandsDetected":0,"minMentions":2,"note":"Ranked by upvote-weighted mentions, with positive or negative words in the same sentence. Text rules only, no AI: check the top quotes before you rely on a name."}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Comment rows straight from a Reddit scraper (trudax/reddit-scraper-lite, harshmaur/reddit-scraper and look-alikes) for a \"best X\" search or thread, or your own rows with a body (or text) column and upVotes (or score). 2000 rows at most."},"brands":{"type":"array","items":{"type":"string"},"description":"Optional brand names you expect (e.g. [\"Brooks\", \"Asics\"]). Helps split brand from model; never required."},"ignore":{"type":"array","items":{"type":"string"},"description":"Optional names to leave out (shops, places, subreddit slang)."},"minMentions":{"type":"number","minimum":1,"maximum":50,"description":"Leave out names seen in fewer comments than this. Default 2."},"includePosts":{"type":"boolean","description":"Also count the opening posts, not just comments. Default false."},"maxResults":{"type":"number","minimum":1,"maximum":100,"description":"Longest ranked list to return. Default 50."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"dataType":"comment","body":"Highly recommend the Ridgeway Summit 4. Third pair, love them.","upVotes":42},{"dataType":"comment","body":"Ridgeway Summit for sure, so comfortable and durable.","upVotes":18},{"dataType":"comment","body":"I run in the Fernlo Glide 2 and it is great on mud.","upVotes":12},{"dataType":"comment","body":"My Fernlo Glide fell apart after 200 miles, avoid.","upVotes":5},{"dataType":"comment","body":"Another vote for the summit 4s, best shoe I have owned.","upVotes":9},{"dataType":"comment","body":"Try a few on in a shop first.","upVotes":3}]}}}}}},"/salary-benchmark":{"post":{"operationId":"salary_benchmark","summary":"Salary benchmark from job rows: yearly pay, p25/median/p75 per title and city, low/fair/high flag per job","description":"Turns the messy pay in job rows a jobs scraper already returned (Indeed, LinkedIn, Glassdoor, JobSpy, or your sheet) into yearly min, max and mid in one currency (hourly, daily, weekly, monthly; ECB rates), then pay percentiles per job title and city, falling back to the title anywhere and the role family, and flags each job low, fair or high against its peers. Text rules, no AI, no scraping. $0.001 per job row, 2000 at most. Not charged if no row is a job.","tags":["salary"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"2.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"benchmarks":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string"},"title":{},"location":{},"company":{},"jobs":{"type":"number"},"jobsWithPay":{"type":"number"},"currency":{"type":"string"},"p10":{"type":"number"},"p25":{"type":"number"},"median":{"type":"number"},"p75":{"type":"number"},"p90":{"type":"number"},"lowest":{"type":"number"},"highest":{"type":"number"},"medianHourly":{"type":"number"},"topPayer":{}}}},"jobs":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"title":{"type":"string"},"company":{},"location":{},"url":{},"payText":{},"payFoundIn":{},"statedPeriod":{},"statedCurrency":{},"salaryMinYearly":{},"salaryMaxYearly":{},"salaryMidYearly":{},"currency":{},"confidence":{},"peerGroup":{},"peerJobs":{},"peerMedian":{},"vsPeerMedianPct":{},"percentileInGroup":{},"flag":{"type":"string"},"note":{}}}},"summary":{"type":"object","properties":{"jobsIn":{"type":"number"},"jobsWithPay":{"type":"number"},"payCoverage":{"type":"number"},"currency":{"type":"string"},"ratesDate":{},"hoursPerWeek":{"type":"number"},"groupBy":{"type":"string"},"minGroupSize":{"type":"number"},"benchmarkGroups":{"type":"number"},"flags":{"type":"object","properties":{"low":{"type":"number"},"fair":{"type":"number"},"high":{"type":"number"},"no_peers":{"type":"number"},"no_pay":{"type":"number"}}},"leftOut":{"type":"object","properties":{"no pay given":{"type":"number"}}}}},"warnings":{"type":"array","items":{}}}},"example":{"benchmarks":[{"group":"Electrician in Leeds","title":"Electrician","location":"Leeds","company":null,"jobs":4,"jobsWithPay":4,"currency":"GBP","p10":33000,"p25":37500,"median":43750,"p75":48630,"p90":50650,"lowest":30000,"highest":52000,"medianHourly":21.03,"topPayer":"Example Sparks"}],"jobs":[{"index":0,"title":"Electrician","company":"Example Electrical Ltd","location":"Leeds","url":null,"payText":"£38,000.00/yr - £42,000.00/yr","payFoundIn":"salary_text","statedPeriod":"year","statedCurrency":"GBP","salaryMinYearly":38000,"salaryMaxYearly":42000,"salaryMidYearly":40000,"currency":"GBP","confidence":"high","peerGroup":"Electrician in Leeds","peerJobs":4,"peerMedian":43750,"vsPeerMedianPct":-8.6,"percentileInGroup":38,"flag":"fair","note":null}],"summary":{"jobsIn":7,"jobsWithPay":6,"payCoverage":85.7,"currency":"GBP","ratesDate":null,"hoursPerWeek":40,"groupBy":"title_location","minGroupSize":3,"benchmarkGroups":3,"flags":{"low":2,"fair":3,"high":1,"no_peers":0,"no_pay":1},"leftOut":{"no pay given":1}},"warnings":[]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Job rows from a jobs scraper (Indeed, LinkedIn, Glassdoor, JobSpy, nerolabs/job-post-enricher) or your own rows with title, location, company and salary text or min/max/period. Descriptions are searched when no salary column has pay. 2000 at most."},"currency":{"type":"string","description":"Currency for yearly figures (USD, GBP, EUR...; ECB rates). Default: the most common one in the rows. \"original\" keeps each job's own."},"groupBy":{"type":"string","enum":["title_location","title","location","company"],"description":"Peer groups. Default title_location: same title and city, then same title anywhere, then role family (all nurses)."},"minGroupSize":{"type":"number","minimum":2,"maximum":50,"description":"Paid jobs a group needs for percentiles. Default 3."},"hoursPerWeek":{"type":"number","minimum":1,"maximum":80,"description":"Hours a week for hourly pay. Default 40."},"daysPerWeek":{"type":"number","minimum":1,"maximum":7,"description":"Days a week for day rates. Default 5."},"includeJobs":{"type":"boolean","description":"Return per-job rows with yearly pay and low/fair/high flag. Default true."},"maxGroups":{"type":"number","minimum":1,"maximum":500,"description":"Longest benchmark list. Default 100."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"title":"Electrician","companyName":"Example Electrical Ltd","location":"Leeds, England, United Kingdom","salary":"£38,000.00/yr - £42,000.00/yr"},{"title":"Maintenance Electrician","companyName":"Example Foods","location":"Leeds, England, United Kingdom","salary":"£18 - £20 per hour"},{"title":"Electrician","employer":{"name":"Example Homes"},"location":{"city":"Leeds","countryCode":"GB"},"baseSalary":{"min":45000,"max":50000,"unitOfWork":"YEAR","currencyCode":"GBP"}},{"title":"Electrician","companyName":"Example Build Co","location":"Leeds, England, United Kingdom","salary":"£30k pa"},{"title":"Electrician - Domestic","companyName":"Example Sparks","location":"Leeds, England, United Kingdom","salary":"£200 per day"},{"title":"Electrician","companyName":"Example Services","location":"York, England, United Kingdom","salary":"Competitive, DOE"},{"title":"Approved Electrician","companyName":"Example Facilities","location":"York, England, United Kingdom","description":"Salary: up to £44,000 per annum plus van."}]}}}}}},"/skills-demand":{"post":{"operationId":"skills_demand","summary":"Job skills demand from job rows: top skills per title, rising or falling, pay premium, learn this next","description":"Ranks the skills, tools, licences and certificates named in job rows a jobs scraper already returned (LinkedIn, Indeed, Glassdoor, JobSpy, or your sheet): share of jobs asking for each per job title or role family, rising or falling against an older batch or posting dates, median pay with and without it (pay premium), and a learn this next line. 175+ skills, company boilerplate skipped, no AI. $0.001 per job row, 1000 at most.","tags":["skills"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string"},"level":{"type":"string"},"jobs":{"type":"number"},"jobsWithSkills":{"type":"number"},"jobsWithPay":{"type":"number"},"currency":{"type":"string"},"topSkills":{"type":"array","items":{"type":"object","properties":{"skill":{"type":"string"},"category":{"type":"string"},"jobs":{"type":"number"},"sharePct":{"type":"number"},"previousSharePct":{},"changePts":{},"trend":{},"medianPayWith":{},"medianPayWithout":{},"payPremiumPct":{},"paidJobsWith":{"type":"number"}}}},"learnNext":{"type":"string"}}}},"summary":{"type":"object","properties":{"jobsIn":{"type":"number"},"jobsWithDescription":{"type":"number"},"jobsWithSkills":{"type":"number"},"distinctSkills":{"type":"number"},"jobsWithPay":{"type":"number"},"payCurrency":{"type":"string"},"groups":{"type":"number"},"groupBy":{"type":"string"},"minJobs":{"type":"number"},"trendBasis":{},"baselineJobs":{"type":"number"},"recentDays":{},"skillsInDictionary":{"type":"number"}}},"warnings":{"type":"array","items":{"type":"string"}}}},"example":{"groups":[{"group":"All jobs","level":"all","jobs":7,"jobsWithSkills":7,"jobsWithPay":6,"currency":"GBP","topSkills":[{"skill":"SQL","category":"data_ai","jobs":7,"sharePct":100,"previousSharePct":null,"changePts":null,"trend":null,"medianPayWith":null,"medianPayWithout":null,"payPremiumPct":null,"paidJobsWith":6},{"skill":"Python","category":"programming","jobs":4,"sharePct":57.1,"previousSharePct":null,"changePts":null,"trend":null,"medianPayWith":50000,"medianPayWithout":32800,"payPremiumPct":52.7,"paidJobsWith":4},{"skill":"Excel","category":"software","jobs":3,"sharePct":42.9,"previousSharePct":null,"changePts":null,"trend":null,"medianPayWith":32800,"medianPayWithout":50000,"payPremiumPct":-34.5,"paidJobsWith":2}],"learnNext":"Learn Python next: asked in 57.1% of these jobs, and those jobs pay a median 50000 GBP a year, 52.7% more than the ones that do not ask for it."}],"summary":{"jobsIn":7,"jobsWithDescription":7,"jobsWithSkills":7,"distinctSkills":14,"jobsWithPay":6,"payCurrency":"GBP","groups":1,"groupBy":"title","minJobs":5,"trendBasis":null,"baselineJobs":0,"recentDays":null,"skillsInDictionary":177},"warnings":["No older batch and too few posting dates, so rising or falling is not worked out. Send last month's rows as baselineRows to see which skills are rising."]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Job rows from a jobs scraper (LinkedIn, Indeed, Glassdoor, JobSpy) or your sheet: title, description, pay; skills columns read too."},"baselineRows":{"type":"array","items":{"type":"object"},"description":"Optional older batch for rising and falling skills; else posting dates are used. 1000 rows in all."},"groupBy":{"type":"string","enum":["title","family","title_location","all"],"description":"Default title (5+ jobs), else role family. All jobs comes first."},"categories":{"type":"array","items":{"type":"string","enum":["programming","data_ai","cloud_devops","software","design","marketing_sales","finance","business","healthcare","trade","licence","spoken_language","soft","custom"]},"description":"Only these skill types."},"customSkills":{"type":"array","items":{"type":"string"},"maxItems":100,"description":"Extra skills to count."},"includeSoftSkills":{"type":"boolean","description":"Count soft skills. Default false."},"topN":{"type":"number","minimum":1,"maximum":100,"description":"Default 25."},"minJobs":{"type":"number","minimum":2,"maximum":100,"description":"Default 5."},"minPaidJobs":{"type":"number","minimum":2,"maximum":50,"description":"Paid jobs each side for a pay premium. Default 3."},"recentDays":{"type":"number","minimum":1,"maximum":365,"description":"Recent window for date trends. Default 14."},"currency":{"type":"string","description":"Pay currency. Default the most common."},"includeJobs":{"type":"boolean","description":"Return each job's skills. Default false."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"title":"Data Analyst","companyName":"Example Retail Ltd","location":"London, England, United Kingdom","salary":"£45,000/yr - £50,000/yr","descriptionText":"Strong SQL and Power BI. Python a plus. Stakeholder management."},{"title":"Data Analyst","companyName":"Example Bank","location":"London, England, United Kingdom","salary":"£55,000/yr - £60,000/yr","descriptionText":"SQL, Python and dbt on Snowflake. Some AWS."},{"title":"Data Analyst","companyName":"Example Health","location":"Leeds, England, United Kingdom","salary":"£32,000/yr - £36,000/yr","descriptionText":"Advanced Excel and SQL. Tableau dashboards."},{"title":"Data Analyst","companyName":"Example Travel","location":"Manchester, England, United Kingdom","salary":"£48,000 - £52,000 a year","descriptionText":"Python, SQL and Looker. Experience with A/B testing."},{"title":"Data Analyst","companyName":"Example Foods","location":"Leeds, England, United Kingdom","salary":"£30,000 - £33,000 a year","descriptionText":"Excel and Power BI reporting. SQL desirable."},{"title":"Data Analyst","companyName":"Example Energy","location":"Bristol, England, United Kingdom","salary":"£50,000/yr","descriptionText":"Python and SQL, Databricks, Spark. Machine learning a plus."},{"title":"Data Analyst","companyName":"Example Charity","location":"Bristol, England, United Kingdom","descriptionText":"Excel, SQL and Power BI for supporter data."}],"minPaidJobs":2}}}}}},"/property-deals":{"post":{"operationId":"property_deals","summary":"Zillow deal finder: score for-sale listing rows by price per sqft vs the zip, price cuts, days on market, rent yield","description":"Scores each for-sale home in Zillow, Redfin or Realtor.com scraper rows (or your sheet): price per sqft vs the median for its zip and home type, price cuts, days on market, price vs Zestimate and tax value, gross rent yield, auction and foreclosure flags. Deal score 0 to 100, verdict and a why line. No scraping, no AI. $0.002 per listing, 1000 at most.","tags":["real estate"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"2.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"listings":{"type":"array","items":{"type":"object","properties":{"rowIndex":{"type":"number"},"source":{"type":"string"},"id":{"type":"string"},"url":{},"address":{},"city":{},"state":{},"zip":{"type":"string"},"homeType":{"type":"string"},"price":{"type":"number"},"sqft":{"type":"number"},"beds":{},"baths":{},"yearBuilt":{},"daysOnMarket":{"type":"number"},"lastCut":{},"lastCutDate":{},"cutCount":{"type":"number"},"totalCutPct":{"type":"number"},"zestimate":{},"rentEstimate":{"type":"number"},"taxAssessedValue":{"type":"number"},"hoaMonthly":{},"flags":{"type":"array","items":{}},"dealScore":{"type":"number"},"verdict":{"type":"string"},"pricePerSqft":{"type":"number"},"comparedWith":{"type":"string"},"areaMedianPricePerSqft":{"type":"number"},"vsAreaPct":{"type":"number"},"vsZestimatePct":{},"grossRentYieldPct":{"type":"number"},"scoreParts":{"type":"object","properties":{"pricePerSqft":{"type":"number"},"belowTaxValue":{"type":"number"},"priceCuts":{"type":"number"},"daysOnMarket":{"type":"number"},"rentYield":{"type":"number"}}},"why":{"type":"string"}}}},"areas":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string"},"name":{"type":"string"},"listings":{"type":"number"},"medianPricePerSqft":{"type":"number"},"medianDaysOnMarket":{"type":"number"},"withPriceCutPct":{"type":"number"}}}},"summary":{"type":"object","properties":{"rowsIn":{"type":"number"},"listingsScored":{"type":"number"},"returned":{"type":"number"},"strongDeals":{"type":"number"},"worthALook":{"type":"number"},"sources":{"type":"array","items":{"type":"string"}},"skipped":{"type":"object","properties":{}},"asOfDate":{"type":"string"}}},"warnings":{"type":"array","items":{"type":"string"}}}},"example":{"listings":[{"rowIndex":0,"source":"zillow","id":"9000001","zip":"78745","homeType":"unknown","price":199999,"sqft":1083,"daysOnMarket":83,"cutCount":0,"totalCutPct":0,"rentEstimate":1820,"taxAssessedValue":256000,"dealScore":64,"verdict":"strong deal","pricePerSqft":185,"comparedWith":"78745 (5 listings)","areaMedianPricePerSqft":313,"vsAreaPct":-41,"grossRentYieldPct":10.9,"scoreParts":{"pricePerSqft":40,"belowTaxValue":8,"priceCuts":0,"daysOnMarket":6,"rentYield":10},"why":"41% below area price per sqft; asks 78% of tax value; gross rent yield 10.9%"}],"areas":[{"level":"zip","name":"78745","listings":5,"medianPricePerSqft":313,"medianDaysOnMarket":54,"withPriceCutPct":40}],"summary":{"listingsScored":5,"strongDeals":1,"worthALook":1}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"For-sale rows from a Zillow, Redfin or Realtor.com scraper, or a sheet with price, sqft, zip."},"groupBy":{"type":"string","enum":["zip_type","zip","city","all"],"description":"Peer group. Default zip_type, then zip, city, all."},"minGroupSize":{"type":"number","minimum":3,"maximum":50,"description":"Default 5."},"minScore":{"type":"number","minimum":0,"maximum":100,"description":"Minimum deal score."},"topN":{"type":"number","minimum":1,"maximum":1000,"description":"Default 50."},"asOfDate":{"type":"string","description":"For days on market. Default today."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"zpid":"9000001","price":199999,"livingArea":1083,"zipcode":"78745","daysOnZillow":83,"taxAssessedValue":256000,"rentZestimate":1820},{"zpid":"9000002","price":325000,"livingArea":1312,"zipcode":"78745","daysOnZillow":54,"priceChange":-44900},{"zpid":"9000003","price":450000,"livingArea":1438,"zipcode":"78745","daysOnZillow":30},{"zpid":"9000004","price":425000,"livingArea":1199,"zipcode":"78745","daysOnZillow":116,"priceChange":-7500},{"zpid":"9000005","price":529000,"livingArea":1158,"zipcode":"78745","daysOnZillow":0}],"asOfDate":"2026-11-02","topN":1}}}}}},"/unit-price":{"post":{"operationId":"unit_price","summary":"Amazon price per unit: rank product rows by price per item, load, oz or 100 g within each search","description":"Reads the pack size in each product title from Amazon, Walmart or grocery scraper rows (or your sheet): count, loads, weight, volume, Pack of 6, 6 x 330 ml. Puts every product in a search on one unit, ranks cheapest per unit, flags overpriced ones and bigger packs that cost more per unit, and reads the store unit price junglee rows hide in getPriceBeforeDiscount. No scraping, no AI. $0.001 per product, 1000 at most.","tags":["amazon"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"rows":{},"products":{"type":"number"},"withSize":{},"compared":{"type":"number"},"groups":{},"bestValue":{},"overpriced":{"type":"number"},"biggerPackTraps":{"type":"number"},"skipped":{}}},"groups":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string"},"currency":{},"products":{},"compared":{},"comparedOn":{"type":"string"},"unitLabel":{"type":"string"},"coverage":{},"medianUnitPrice":{"type":"number"},"cheapest":{},"dearest":{},"spreadX":{"type":"number"},"overpriced":{},"biggerPackTraps":{},"note":{}}}},"products":{"type":"array","items":{"type":"object","properties":{"rowIndex":{"type":"number"},"id":{"type":"string"},"title":{"type":"string"},"brand":{},"url":{},"group":{"type":"string"},"price":{"type":"number"},"currency":{"type":"string"},"sponsored":{},"quantity":{"type":"object","properties":{"count":{},"loads":{},"grams":{},"ml":{},"packOf":{},"imperial":{},"matched":{}}},"comparedOn":{},"unitPrice":{},"unitLabel":{},"groupMedianUnitPrice":{},"gapPct":{},"rankInGroup":{},"groupCompared":{"type":"number"},"verdict":{"type":"string"},"flags":{},"sourceUnitPrice":{},"beforeDiscountPrice":{},"why":{"type":"string"},"otherUnitPrice":{}}}},"warnings":{}}},"example":{"summary":{"products":5,"compared":5,"overpriced":1,"biggerPackTraps":2},"groups":[{"group":"dishwasher pods","comparedOn":"count","unitLabel":"per item","medianUnitPrice":0.2712,"spreadX":3.77}],"products":[{"rowIndex":3,"id":"B0EX000004","title":"Sample Co Dishwasher Pacs, 78 Count","group":"dishwasher pods","price":10.82,"currency":"USD","comparedOn":"count","unitPrice":0.1387,"unitLabel":"per item","groupMedianUnitPrice":0.2712,"gapPct":-48.9,"rankInGroup":1,"groupCompared":5,"verdict":"best_value","why":"per item 0.1387 vs group median 0.2712 (-48.9%), #1 of 5.","quantity":{"count":78,"packOf":null}},{"rowIndex":1,"id":"B0EX000002","title":"Example Brand Dishwasher Pods, Fresh Scent, 94 Count","group":"dishwasher pods","price":25.49,"currency":"USD","comparedOn":"count","unitPrice":0.2712,"unitLabel":"per item","groupMedianUnitPrice":0.2712,"gapPct":0,"rankInGroup":3,"groupCompared":5,"verdict":"fair","flags":["bigger_pack_costs_more_per_unit"],"why":"Bigger pack but 52% dearer per item than the smaller \"Example Brand Dishwasher Pods, Fresh Scent, 84ct\" (row 0). per item 0.2712 vs group median 0.2712 (0%), #3 of 5.","quantity":{"count":94,"packOf":null}}]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Product rows from an Amazon, Walmart or grocery scraper, or a sheet with title and price."},"groupBy":{"type":"string","description":"Column to compare within. Default: the search or category column, else all rows."},"compareBy":{"type":"string","enum":["auto","count","loads","weight","volume"],"description":"Unit to compare on. Default auto."},"overpricedPct":{"type":"number","minimum":5,"maximum":200,"description":"Overpriced above the group median by this %. Default 25."},"minGroupSize":{"type":"number","minimum":2,"maximum":50,"description":"Default 3."},"topN":{"type":"number","minimum":1,"maximum":1000,"description":"Products listed. Default 200."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"asin":"B0EX000001","title":"Example Brand Dishwasher Pods, Fresh Scent, 84ct","price":{"value":14.99,"currency":"$"},"input":"dishwasher pods"},{"asin":"B0EX000002","title":"Example Brand Dishwasher Pods, Fresh Scent, 94 Count","price":{"value":25.49,"currency":"$"},"input":"dishwasher pods"},{"asin":"B0EX000003","title":"Sample Co Dishwasher Tablets, 45 Ct, 2 Pack","price":{"value":29.74,"currency":"$"},"input":"dishwasher pods"},{"asin":"B0EX000004","title":"Sample Co Dishwasher Pacs, 78 Count","price":{"value":10.82,"currency":"$"},"input":"dishwasher pods"},{"asin":"B0EX000005","title":"Demo Clean Dishwasher Pods, 19 Count","price":{"value":9.94,"currency":"$"},"input":"dishwasher pods"}],"topN":5}}}}}},"/market-saturation":{"post":{"operationId":"market_saturation","summary":"Local market saturation: score each area in Google Maps rows by how easy it is to compete","description":"Groups Google Maps scraper rows (or Yelp rows, or your sheet) by search, city or postcode and scores each area 0 to 100: reviews the top 3 have, share of weak rivals (no website, unclaimed, few reviews, low rating), other trades filling the results, thin areas, and the easiest rivals to beat. Spots the per-search scrape cap. No scraping, no AI. $0.01 per area, 200 at most.","tags":["google maps"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"2.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"rowsRead":{"type":"number"},"businesses":{"type":"number"},"skippedRows":{"type":"number"},"areas":{"type":"number"},"areaColumn":{"type":"string"},"scrapeCapDetected":{},"underserved":{"type":"number"},"open":{"type":"number"},"competitiveOrSaturated":{"type":"number"},"bestAreas":{"type":"array","items":{"type":"string"}}}},"areas":{"type":"array","items":{"type":"object","properties":{"area":{"type":"string"},"rowsRead":{"type":"number"},"compared":{"type":"number"},"mainCategory":{"type":"string"},"competitors":{"type":"number"},"belowScrapeCap":{"type":"boolean"},"offTopicShare":{"type":"number"},"avgRating":{"type":"number"},"medianReviews":{"type":"number"},"mapPackMedianReviews":{"type":"number"},"top10MedianReviews":{"type":"number"},"totalReviews":{"type":"number"},"shareNoWebsite":{"type":"number"},"shareUnclaimed":{},"shareFewReviews":{"type":"number"},"shareLowRating":{"type":"number"},"shareClosed":{"type":"number"},"shareWeak":{"type":"number"},"businessesPer10k":{},"opportunityScore":{"type":"number"},"verdict":{"type":"string"},"lowData":{"type":"boolean"},"rankInBatch":{"type":"number"},"why":{"type":"string"},"easiestToBeat":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"rank":{"type":"number"},"rating":{},"reviews":{},"weaknesses":{"type":"array","items":{"type":"string"}}}}}}}},"notes":{"type":"array","items":{"type":"string"}}}},"example":{"summary":{"rowsRead":6,"businesses":6,"skippedRows":0,"areas":2,"areaColumn":"searchString","scrapeCapDetected":null,"underserved":1,"open":0,"competitiveOrSaturated":1,"bestAreas":["electrician in Southvale (85)","electrician in Northtown (5)"]},"areas":[{"area":"electrician in Southvale","rowsRead":3,"compared":3,"mainCategory":"Electrician","competitors":2,"belowScrapeCap":false,"offTopicShare":0.33,"avgRating":4.6,"medianReviews":4.5,"mapPackMedianReviews":4.5,"top10MedianReviews":4.5,"totalReviews":9,"shareNoWebsite":1,"shareUnclaimed":1,"shareFewReviews":1,"shareLowRating":0,"shareClosed":0,"shareWeak":1,"businessesPer10k":null,"opportunityScore":85,"verdict":"underserved","lowData":true,"rankInBatch":1,"why":"top 3 have a median 5 reviews; 100% of 2 competitors are weak; 33% of results are other trades (Google is short of real ones)","easiestToBeat":[{"name":"Test Wiring","rank":1,"rating":5,"reviews":6,"weaknesses":["no website","profile not claimed","6 reviews"]},{"name":"Placeholder Electric","rank":2,"rating":4.2,"reviews":3,"weaknesses":["no website","3 reviews"]}]},{"area":"electrician in Northtown","rowsRead":3,"compared":3,"mainCategory":"Electrician","competitors":3,"belowScrapeCap":false,"offTopicShare":0,"avgRating":4.8,"medianReviews":140,"mapPackMedianReviews":140,"top10MedianReviews":140,"totalReviews":448,"shareNoWebsite":0,"shareUnclaimed":null,"shareFewReviews":0,"shareLowRating":0,"shareClosed":0,"shareWeak":0,"businessesPer10k":null,"opportunityScore":5,"verdict":"saturated","lowData":true,"rankInBatch":2,"why":"top 3 have a median 140 reviews; 0% of 3 competitors are weak","easiestToBeat":[]}],"notes":[]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Business rows from a Google Maps scraper (compass/crawler-google-places and others), Yelp rows, or a sheet with name, area, rating and review count."},"groupBy":{"type":"string","description":"Column naming the area. Default: searchString, else city, else postcode."},"category":{"type":"string","description":"Category that counts as a competitor. Default: the commonest in each area."},"population":{"type":"object","additionalProperties":{"type":"number"},"description":"Optional people per area name, for businesses per 10,000."},"weakRating":{"type":"number","minimum":1,"maximum":5,"description":"Under this rating counts as weak. Default 4.0."},"fewReviews":{"type":"number","minimum":1,"maximum":1000,"description":"Under this many reviews counts as weak. Default 20."},"topN":{"type":"number","minimum":1,"maximum":200,"description":"Areas listed. Default 200."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"title":"Example Electrical Ltd","searchString":"electrician in Northtown","categoryName":"Electrician","totalScore":4.9,"reviewsCount":212,"website":"https://example.com","rank":1},{"title":"Sample Sparks","searchString":"electrician in Northtown","categoryName":"Electrician","totalScore":4.8,"reviewsCount":140,"website":"https://example.org","rank":2},{"title":"Demo Power Co","searchString":"electrician in Northtown","categoryName":"Electrician","totalScore":4.7,"reviewsCount":96,"website":"https://example.net","rank":3},{"title":"Test Wiring","searchString":"electrician in Southvale","categoryName":"Electrician","totalScore":5,"reviewsCount":6,"rank":1,"claimThisBusiness":true},{"title":"Placeholder Electric","searchString":"electrician in Southvale","categoryName":"Electrician","totalScore":4.2,"reviewsCount":3,"rank":2},{"title":"Example Plumbing","searchString":"electrician in Southvale","categoryName":"Plumber","totalScore":4.6,"reviewsCount":31,"website":"https://example.co","rank":3}]}}}}}},"/review-trend":{"post":{"operationId":"review_trend","summary":"Amazon review trend: star rating by month per product, falling flag, drift vs lifetime, complaint words","description":"Reads review rows an Amazon reviews scraper already returned (junglee, axesso and others) or your sheet: stars in the last 90 days vs the 90 before, recent stars vs the lifetime rating, stars by month, and the words repeated in 1 and 2 star reviews, rising ones flagged. Sample size and confidence on every number. No scraping, no AI. $0.005 per product, 200 at most.","tags":["amazon"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"products":{"type":"number"},"reviewsRead":{"type":"number"},"rowsSkipped":{},"duplicateReviews":{},"windowDays":{},"asOf":{},"falling":{"type":"number"},"slipping":{},"steady":{},"rising":{},"notEnoughReviews":{},"starFiltered":{},"worstProduct":{"type":"string"},"note":{}}},"products":{"type":"array","items":{"type":"object","properties":{"product":{"type":"string"},"title":{},"reviewsRead":{"type":"number"},"newestReview":{"type":"string"},"oldestReview":{"type":"string"},"lifetimeRating":{},"lifetimeRatings":{},"trend":{"type":"string"},"confidence":{"type":"string"},"comparedBy":{"type":"string"},"recentAvgStars":{},"recentReviews":{"type":"number"},"previousAvgStars":{},"previousReviews":{"type":"number"},"change":{},"driftVsLifetime":{},"recentLowShare":{},"previousLowShare":{},"lowStarReviews":{"type":"number"},"complaintWords":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string"},"reviews":{"type":"number"},"share":{"type":"number"},"recentReviews":{"type":"number"},"previousReviews":{"type":"number"},"rising":{"type":"boolean"},"example":{"type":"string"}}}},"risingComplaints":{"type":"array","items":{"type":"string"}},"byMonth":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string"},"reviews":{"type":"number"},"avgStars":{"type":"number"},"lowShare":{"type":"number"}}}},"verifiedShare":{},"vineShare":{},"flags":{"type":"array","items":{"type":"string"}},"why":{"type":"string"}}}}}},"example":{"summary":{"products":2,"reviewsRead":8,"falling":1,"worstProduct":"B0EX000010"},"products":[{"product":"B0EX000010","title":null,"reviewsRead":6,"newestReview":"2026-10-20","oldestReview":"2026-06-02","lifetimeRating":null,"lifetimeRatings":5200,"trend":"falling","confidence":"low","comparedBy":"windows","recentAvgStars":1.33,"recentReviews":3,"previousAvgStars":4.67,"previousReviews":3,"change":-3.34,"driftVsLifetime":null,"recentLowShare":1,"previousLowShare":0,"lowStarReviews":3,"complaintWords":[{"term":"lid leaks","reviews":3,"share":1,"recentReviews":3,"previousReviews":0,"rising":true,"example":"Lid leaks: The lid leaks after a week."},{"term":"handle","reviews":2,"share":0.67,"recentReviews":2,"previousReviews":0,"rising":true,"example":"Leaks: Lid leaks and the handle gets hot."}],"risingComplaints":["lid leaks","handle","hot"],"byMonth":[{"month":"2026-10","reviews":2,"avgStars":1.5,"lowShare":1},{"month":"2026-09","reviews":1,"avgStars":1,"lowShare":1}],"verifiedShare":null,"vineShare":null,"flags":["small_sample_of_big_product: Amazon shows scrapers few reviews when logged out; read the counts before acting"],"why":"Falling: 1.33 stars in the last 90 days (3 reviews) vs 4.67 before (3). 1 and 2 star reviews repeat: 'lid leaks' (3), 'handle' (2), 'hot' (2). Rising: 'lid leaks', 'handle', 'hot'."}]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Review rows from an Amazon reviews scraper (junglee, axesso and others) or a sheet with product, date, stars and text."},"windowDays":{"type":"number","minimum":14,"maximum":365,"description":"Recent window in days, compared with the same length before. Default 90."},"asOf":{"type":"string","description":"End of the recent window, YYYY-MM-DD. Default today."},"lowStars":{"type":"number","minimum":1,"maximum":3,"description":"Reviews at or below this count as complaints. Default 2."},"topWords":{"type":"number","minimum":1,"maximum":20,"description":"Complaint words per product. Default 8."},"topN":{"type":"number","minimum":1,"maximum":200,"description":"Products listed, worst trend first. Default 200."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"productAsin":"B0EX000010","date":"2026-10-20","ratingScore":1,"reviewTitle":"Lid leaks","reviewDescription":"The lid leaks after a week.","totalCategoryRatings":5200},{"productAsin":"B0EX000010","date":"2026-10-02","ratingScore":2,"reviewTitle":"Leaks","reviewDescription":"Lid leaks and the handle gets hot."},{"productAsin":"B0EX000010","date":"2026-09-15","ratingScore":1,"reviewTitle":"Handle hot","reviewDescription":"Handle gets hot, lid leaks."},{"productAsin":"B0EX000010","date":"2026-07-01","ratingScore":5,"reviewTitle":"Love it","reviewDescription":"Boils fast."},{"productAsin":"B0EX000010","date":"2026-06-20","ratingScore":4,"reviewTitle":"Good","reviewDescription":"Quiet and quick."},{"productAsin":"B0EX000010","date":"2026-06-02","ratingScore":5,"reviewTitle":"Great","reviewDescription":"Works well."},{"asin":"B0EX000020","date":"Reviewed in the United States on October 9, 2026","rating":"5.0 out of 5 stars","text":"Sturdy.","productRating":"4.6 out of 5"},{"asin":"B0EX000020","date":"Reviewed in the United States on July 3, 2026","rating":"4.0 out of 5 stars","text":"Fine."}],"asOf":"2026-11-02"}}}}}},"/comment-intent":{"post":{"operationId":"comment_intent","summary":"Instagram and TikTok comment leads: tag buyer intent (price, link, size, stock), complaints and spam","description":"Tags each comment in Instagram, TikTok or YouTube comment scraper rows (or your sheet) by keyword rules in 6 languages: price ask, where to buy, wants it, size, stock or shipping, product request, complaint, question, collab ask, spam. Ranks the warm commenters to reply to, unanswered first, with a reply tip. No AI. $0.0005 per comment, $0.001 minimum.","tags":["instagram"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"2.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"commentsRead":{"type":"number"},"ownerCommentsSkipped":{"type":"number"},"posts":{"type":"number"},"platforms":{"type":"array","items":{"type":"string"}},"buyerComments":{"type":"number"},"buyerShare":{"type":"number"},"unansweredBuyers":{"type":"number"},"answeredKnown":{"type":"boolean"},"tagCounts":{"type":"object","properties":{"price":{"type":"number"},"where_to_buy":{"type":"number"},"wants_it":{"type":"number"},"size_fit":{"type":"number"},"stock_shipping":{"type":"number"},"product_request":{"type":"number"},"complaint":{"type":"number"},"question":{"type":"number"},"collab_ask":{"type":"number"},"spam":{"type":"number"},"praise":{"type":"number"}}},"tagShare":{"type":"object","properties":{"price":{"type":"number"},"where_to_buy":{"type":"number"},"wants_it":{"type":"number"},"size_fit":{"type":"number"},"stock_shipping":{"type":"number"},"product_request":{"type":"number"},"complaint":{"type":"number"},"question":{"type":"number"},"collab_ask":{"type":"number"},"spam":{"type":"number"},"praise":{"type":"number"}}},"emojiOnly":{"type":"number"},"languages":{"type":"object","properties":{"en":{"type":"number"},"es":{},"pt":{}}},"note":{"type":"string"}}},"leads":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"number"},"username":{"type":"string"},"platform":{"type":"string"},"text":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"intentScore":{"type":"number"},"language":{},"likes":{"type":"number"},"answered":{},"postUrl":{"type":"string"},"commentUrl":{},"time":{},"replyTip":{"type":"string"}}}},"complaints":{"type":"array","items":{"type":"object","properties":{"username":{"type":"string"},"platform":{"type":"string"},"text":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"intentScore":{"type":"number"},"language":{"type":"string"},"likes":{"type":"number"},"answered":{},"postUrl":{"type":"string"},"commentUrl":{},"time":{},"replyTip":{"type":"string"}}}},"requests":{"type":"array","items":{"type":"object","properties":{"request":{"type":"string"},"comments":{"type":"number"},"likes":{"type":"number"},"example":{"type":"string"}}}},"perPost":{"type":"array","items":{"type":"object","properties":{"postUrl":{"type":"string"},"platform":{"type":"string"},"comments":{"type":"number"},"buyerComments":{"type":"number"},"buyerShare":{"type":"number"},"unansweredBuyers":{"type":"number"},"questions":{"type":"number"},"complaints":{"type":"number"},"topQuestions":{"type":"array","items":{"type":"string"}}}}},"rows":{"type":"array","items":{"type":"object"}}}},"example":{"summary":{"commentsRead":4,"buyerComments":3,"buyerShare":75,"unansweredBuyers":2,"tagCounts":{"price":1,"where_to_buy":2,"wants_it":0,"size_fit":1,"stock_shipping":0,"product_request":0,"complaint":1,"question":3,"collab_ask":0,"spam":0,"praise":0}},"leads":[{"rank":1,"username":"shopper_one","platform":"instagram","text":"How much is the green one? Link please","tags":["price","where_to_buy","question"],"intentScore":7.1,"language":"en","likes":4,"answered":false,"postUrl":"https://www.instagram.com/p/EXAMPLE1/","commentUrl":null,"time":null,"replyTip":"Reply with the price and the product link."}],"complaints":[{"username":"fan_five","platform":"tiktok","text":"My order never arrived","tags":["complaint"],"intentScore":0,"language":"en","likes":3,"answered":false,"postUrl":"https://www.tiktok.com/@examplebrand/video/1","commentUrl":null,"time":null,"replyTip":"Reply fast and move it to DMs or support."}],"requests":[],"perPost":[{"postUrl":"https://www.instagram.com/p/EXAMPLE1/","platform":"instagram","comments":2,"buyerComments":2,"buyerShare":100,"unansweredBuyers":1,"questions":2,"complaints":0,"topQuestions":["How much is the green one? Link please"]}]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Comment rows from an Instagram, TikTok or YouTube comment scraper (apify, clockworks, streamers and look-alikes) or a sheet with a text column. Nested replies are read. 5000 at most."},"ownerUsernames":{"type":"array","items":{"type":"string"},"description":"Brand or creator handles. Their comments are skipped; their replies mark a comment answered."},"extraKeywords":{"type":"object","description":"Extra words per tag, e.g. {\"wants_it\": [\"preorder\"]}."},"minIntent":{"type":"number","minimum":1,"maximum":10,"description":"Score needed to count as a buyer lead. Default 2."},"maxLeads":{"type":"number","minimum":1,"maximum":500,"description":"Leads returned, unanswered first. Default 100."},"hideUsernames":{"type":"boolean","description":"Leave usernames out. Default false."},"includeRows":{"type":"boolean","description":"Return every input row with intent_tags and intent_score columns added. Default false."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"postUrl":"https://www.instagram.com/p/EXAMPLE1/","id":"c1","ownerUsername":"shopper_one","text":"How much is the green one? Link please","likesCount":4},{"postUrl":"https://www.instagram.com/p/EXAMPLE1/","id":"c2","ownerUsername":"shopper_two","text":"what size should I get? I am 5 ft 6","likesCount":1,"replies":[{"id":"c2r","ownerUsername":"examplebrand","text":"Go for a medium!"}]},{"videoWebUrl":"https://www.tiktok.com/@examplebrand/video/1","cid":"t1","uniqueId":"fan_four","text":"dónde lo puedo comprar?","diggCount":2},{"videoWebUrl":"https://www.tiktok.com/@examplebrand/video/1","cid":"t2","uniqueId":"fan_five","text":"My order never arrived","diggCount":3}],"ownerUsernames":["examplebrand"],"maxLeads":3}}}}}},"/reddit-questions":{"post":{"operationId":"reddit_questions","summary":"Reddit top questions: the questions people ask most, grouped, ranked, unanswered ones flagged","description":"Reads post and comment rows a Reddit scraper already returned (harshmaur, trudax and others) or your sheet, pulls out the questions people ask, groups the same question asked in different words, ranks by repeats, upvotes and replies, and flags unanswered ones. For FAQ, content and product ideas. No scraping, no AI. $0.001 per row.","tags":["reddit"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"3.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"questions":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"number"},"question":{"type":"string"},"type":{"type":"string"},"asks":{"type":"number"},"upvotes":{"type":"number"},"replies":{"type":"number"},"unansweredAsks":{"type":"number"},"answered":{"type":"boolean"},"subreddits":{"type":"array","items":{"type":"string"}},"firstAsked":{},"lastAsked":{},"keywords":{"type":"array","items":{"type":"string"}},"score":{"type":"number"},"examples":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"kind":{"type":"string"},"upvotes":{"type":"number"},"replies":{"type":"number"},"url":{},"subreddit":{"type":"string"},"createdAt":{}}}}}}},"unanswered":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"asks":{"type":"number"},"upvotes":{"type":"number"},"type":{"type":"string"},"url":{}}}},"summary":{"type":"object","properties":{"rowsRead":{"type":"number"},"posts":{"type":"number"},"comments":{"type":"number"},"questionsFound":{"type":"number"},"questionGroups":{"type":"number"},"askedMoreThanOnce":{"type":"number"},"unansweredGroups":{"type":"number"},"asksByType":{"type":"object","properties":{"which_best":{"type":"number"},"should_i":{},"how_to":{"type":"number"},"problem":{},"other":{},"cost":{}}},"topTopicWords":{"type":"array","items":{"type":"object","properties":{"word":{"type":"string"},"count":{"type":"number"}}}},"subreddits":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"questions":{"type":"number"}}}},"notes":{"type":"array","items":{"type":"string"}}}}}},"example":{"questions":[{"rank":1,"question":"Best budget espresso machine for home?","type":"which_best","asks":2,"upvotes":165,"replies":94,"unansweredAsks":0,"answered":true,"subreddits":["examplecoffee"],"firstAsked":null,"lastAsked":null,"keywords":["espresso","machine","home","budget","$300"],"score":30.7,"examples":[{"text":"Best budget espresso machine for home?","kind":"post title","upvotes":120,"replies":64,"url":"https://www.reddit.com/r/examplecoffee/comments/p1/","subreddit":"examplecoffee","createdAt":null}]},{"rank":2,"question":"Is the cheap one worth it for a beginner?","type":"should_i","asks":1,"upvotes":12,"replies":0,"unansweredAsks":1,"answered":false,"subreddits":["examplecoffee"],"firstAsked":null,"lastAsked":null,"keywords":["cheap","beginner"],"score":14.5,"examples":[{"text":"Is the cheap one worth it for a beginner?","kind":"comment","upvotes":12,"replies":0,"url":null,"subreddit":"examplecoffee","createdAt":null}]}],"unanswered":[{"question":"Is the cheap one worth it for a beginner?","asks":1,"upvotes":12,"type":"should_i","url":null}],"summary":{"rowsRead":4,"questionsFound":4,"questionGroups":3,"askedMoreThanOnce":1,"unansweredGroups":2,"asksByType":{"which_best":2,"should_i":1,"how_to":1}}}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"},"description":"Post and comment rows from a Reddit scraper (harshmaur, trudax and look-alikes) or a sheet with a title or text column. 3000 at most."},"keywords":{"type":"array","items":{"type":"string"},"description":"Keep only questions containing one of these words."},"includeComments":{"type":"boolean","description":"Also read questions inside comments. Default true."},"minAsks":{"type":"number","minimum":1,"maximum":50,"description":"Only questions asked at least this often. Default 1."},"onlyUnanswered":{"type":"boolean","description":"Only questions with no replies. Default false."},"maxResults":{"type":"number","minimum":1,"maximum":500,"description":"Questions returned. Default 50."}},"required":["rows"],"additionalProperties":false},"example":{"rows":[{"dataType":"post","id":"p1","title":"Best budget espresso machine for home?","upVotes":120,"commentsCount":64,"communityName":"examplecoffee","postUrl":"https://www.reddit.com/r/examplecoffee/comments/p1/"},{"dataType":"post","id":"p2","title":"Which espresso machine should I buy for home under $300?","upVotes":45,"commentsCount":30,"communityName":"examplecoffee","postUrl":"https://www.reddit.com/r/examplecoffee/comments/p2/"},{"dataType":"post","id":"p3","title":"How do I stop my grinder clumping?","upVotes":8,"commentsCount":0,"communityName":"examplecoffee","postUrl":"https://www.reddit.com/r/examplecoffee/comments/p3/"},{"dataType":"comment","id":"c1","parentId":"t3_p1","body":"Is the cheap one worth it for a beginner?","commentUpVotes":12,"communityName":"examplecoffee"}]}}}}}},"/whois":{"post":{"operationId":"whois","summary":"Domain age, registrar, expiry date and status for up to 15 domains (RDAP)","description":"Looks up up to 15 domains in the official RDAP registries (the modern WHOIS): when each was registered and how old it is, when it expires, the registrar, status codes and name servers. Flags new domains and ones about to expire. Useful for fraud checks, lead qualification and spotting expiring domains. $0.005 per domain. Same engine as nerolabs/domain-whois-checker.","tags":["domain"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.075000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"domain":{"type":"string"},"domainStatus":{"type":"string"},"domainStatusDetail":{},"isRegistered":{"type":"boolean"},"registeredOn":{"type":"string"},"expiresOn":{"type":"string"},"lastChangedOn":{"type":"string"},"domainAgeDays":{"type":"number"},"domainAgeYears":{"type":"number"},"daysUntilExpiry":{"type":"number"},"isExpired":{"type":"boolean"},"expiringSoon":{"type":"boolean"},"isNewDomain":{"type":"boolean"},"registrar":{"type":"string"},"registrarIanaId":{"type":"string"},"nameservers":{"type":"string"},"nameserverCount":{"type":"number"},"dnssec":{"type":"boolean"},"domainLocked":{"type":"boolean"},"pendingDelete":{"type":"boolean"},"domainStatuses":{"type":"string"},"registrantOrganization":{},"registrantCountry":{},"contactDataRedacted":{"type":"boolean"},"rdapServer":{"type":"string"},"checkedAt":{"type":"string"}}}},"summary":{"type":"object","properties":{"domainField":{"type":"string"},"inputRowCount":{"type":"number"},"uniqueDomains":{"type":"number"},"domainsAnswered":{"type":"number"},"registeredCount":{"type":"number"},"unregisteredCount":{"type":"number"},"outputRowCount":{"type":"number"},"keep":{"type":"string"},"statusCounts":{"type":"object","properties":{"ok":{"type":"number"}}},"topRegistrars":{"type":"array","items":{"type":"object"}},"expiringSoonCount":{"type":"number"},"newDomainCount":{"type":"number"},"oldestDomain":{"type":"object","properties":{"domain":{"type":"string"},"registeredOn":{"type":"string"}}},"newestDomain":{"type":"object","properties":{"domain":{"type":"string"},"registeredOn":{"type":"string"}}},"unsupportedTlds":{"type":"array"},"registryTermsBlockedTlds":{"type":"array"},"retriedDomains":{"type":"number"},"registryRequests":{"type":"number"},"serverListPublished":{"type":"string"},"durationMs":{"type":"number"},"dataNote":{"type":"string"},"warnings":{"type":"array"}}},"_example_note":{"type":"string"}}},"example":{"rows":[{"input":"coinbase.com","domain":"coinbase.com","domainStatus":"ok","domainStatusDetail":null,"isRegistered":true,"registeredOn":"2011-07-02","expiresOn":"2028-07-02","lastChangedOn":"2026-05-31","domainAgeDays":5590,"domainAgeYears":15.3,"daysUntilExpiry":620,"isExpired":false,"expiringSoon":false,"isNewDomain":false,"registrar":"MarkMonitor Inc.","registrarIanaId":"292","nameservers":"sam.ns.cloudflare.com, sue.ns.cloudflare.com","nameserverCount":2,"dnssec":false,"domainLocked":true,"pendingDelete":false,"domainStatuses":"client delete prohibited, client transfer prohibited, client update prohibited, server delete prohibited, server transfer prohibited, server...","registrantOrganization":null,"registrantCountry":null,"contactDataRedacted":true,"rdapServer":"https://rdap.verisign.com/com/v1","checkedAt":"2026-10-21T14:10:32.580Z"},{"input":"example.org","domain":"example.org","domainStatus":"ok","domainStatusDetail":null,"isRegistered":true,"registeredOn":"1995-08-31","expiresOn":"2027-08-30","lastChangedOn":"2026-10-14","domainAgeDays":11374,"domainAgeYears":31.1,"daysUntilExpiry":313,"isExpired":false,"expiringSoon":false,"isNewDomain":false,"registrar":"ICANN","registrarIanaId":"376","nameservers":"katelyn.ns.cloudflare.com, mitch.ns.cloudflare.com","nameserverCount":2,"dnssec":true,"domainLocked":true,"pendingDelete":false,"domainStatuses":"server delete prohibited, server transfer prohibited, server update prohibited","registrantOrganization":null,"registrantCountry":null,"contactDataRedacted":true,"rdapServer":"https://rdap.publicinterestregistry.org/rdap","checkedAt":"2026-10-21T14:10:32.580Z"}],"summary":{"domainField":"input","inputRowCount":2,"uniqueDomains":2,"domainsAnswered":2,"registeredCount":2,"unregisteredCount":0,"outputRowCount":2,"keep":"all","statusCounts":{"ok":2},"topRegistrars":[{"name":"ICANN","domains":1},{"name":"MarkMonitor Inc.","domains":1}],"expiringSoonCount":0,"newDomainCount":0,"oldestDomain":{"domain":"example.org","registeredOn":"1995-08-31"},"newestDomain":{"domain":"coinbase.com","registeredOn":"2011-07-02"},"unsupportedTlds":[],"registryTermsBlockedTlds":[],"retriedDomains":0,"registryRequests":3,"serverListPublished":"2026-09-30T23:00:03Z","durationMs":808,"dataNote":"Every field comes from the registry that actually holds the record, read over RDAP, the registries' own replacement for WHOIS. Nothing is in...","warnings":[]},"_example_note":"Real output, trimmed: long lists cut to their first items and long text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","description":"A plain list of domains or URLs, for example [\"github.com\", \"https://www.bbc.co.uk/news\"]. Up to 15. Use this or rows, not both.","items":{"type":"string"}},"rows":{"type":"array","description":"Rows as JSON objects, each holding a domain, website or URL in one field. Every original field comes back. Up to 15. Use this or domains, not both.","items":{"type":"object"}},"domainField":{"type":"string","description":"Only with rows: the field holding the domain. Leave out to detect it automatically (domain, website, url, homepage and similar)."},"keep":{"type":"string","enum":["all","registered","unregistered","expiring","new","problems"],"description":"Which rows to return: all (default), registered, unregistered, expiring, new, or problems (rows with no authoritative answer). Filtering happens after the lookup; the summary always counts every row."},"expiringWithinDays":{"type":"integer","description":"Sets expiringSoon and the keep \"expiring\" filter. Default 30."},"newerThanDays":{"type":"integer","description":"Sets isNewDomain and the keep \"new\" filter. Default 365."},"includeRegistrantOrganization":{"type":"boolean","description":"Off by default. When on, adds the registrant organisation name and country code where the registry publishes them. Never a person's name, email, phone or address."}},"additionalProperties":false},"example":{"domains":["coinbase.com","example.org"]}}}}}},"/ocr":{"post":{"operationId":"ocr","summary":"Read the text in images and scanned PDFs (OCR)","description":"Reads the text in images (PNG, JPEG, WebP, TIFF and more) and scanned or born-digital PDFs with OCR, in 100+ languages, and returns the text per file and per page with confidence scores. Up to 10 files a call. Priced per page allowance: files x maxPagesPerFile (default 5, at most 20) x $0.005. Runs nerolabs/bulk-ocr-image-pdf-to-text; can take a minute or two.","tags":["ocr"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"sourceUrl":{"type":"string"},"resolvedUrl":{"type":"string"},"ocrStatus":{"type":"string"},"statusDetail":{},"fileType":{"type":"string"},"pageCount":{"type":"number"},"pagesRead":{"type":"number"},"pagesTruncated":{"type":"boolean"},"ocrPages":{"type":"number"},"textLayerPages":{"type":"number"},"blankPages":{"type":"number"},"charCount":{"type":"number"},"wordCount":{"type":"number"},"confidence":{"type":"number"},"lowConfidence":{"type":"boolean"},"languages":{"type":"string"},"fileSizeKb":{"type":"number"},"ocrMs":{"type":"number"},"extractedAt":{"type":"string"},"text":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"sourceUrl":"https://nerolabs-samples.nerolabs.workers.dev/sample-receipt.png","resolvedUrl":"https://nerolabs-samples.nerolabs.workers.dev/sample-receipt.png","ocrStatus":"ok","statusDetail":null,"fileType":"png","pageCount":1,"pagesRead":1,"pagesTruncated":false,"ocrPages":1,"textLayerPages":0,"blankPages":0,"charCount":346,"wordCount":65,"confidence":91.8}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileUrls":{"type":"array","description":"A plain list of image (PNG, JPEG, WebP, GIF, BMP, TIFF) or PDF links, for a quick one-off run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns alongside the results."},"languages":{"type":"array","description":"Tesseract language codes, one per line, for example eng, deu, fra, spa, por, ita, nld, pol, rus, jpn, chi_sim, chi_tra, ara, hin, kor. Several codes read mixed documents. English is built in; any other language is downloaded once at the start of the run (5 to 15 MB each). Picking the right language "},"usePdfTextLayer":{"type":"boolean","default":true,"description":"A born-digital PDF page already contains its text. When this is on, such pages are copied exactly and charged at the low text-layer rate instead of being rendered and recognised. Turn it off to force OCR on every page, for example when a PDF's text layer is known to be garbage."},"dpi":{"type":"integer","default":200,"minimum":100,"maximum":400,"description":"Resolution used to render PDF pages before recognition. 200 suits most scans; 300 helps small print and takes about twice as long; 150 is faster for large clean type. Images are used at their own resolution, enlarged when small and capped at 4000 pixels on the longest side."},"pageSegmentation":{"type":"string","enum":["auto","sparse","single_block","single_column","single_line"],"default":"auto","description":"How the engine should look for text. 'Automatic' handles documents, receipts and letters. 'Sparse' finds scattered text on screenshots, slides and product photos. 'Single block' suits a cropped paragraph, 'single column' a narrow receipt, 'single line' a cropped field."},"maxPagesPerFile":{"type":"integer","default":20,"minimum":1,"maximum":500,"description":"Pages read from each PDF before stopping. This is also your cost ceiling per file: a 300-page scan cannot run up a bill you did not expect. Images always count as one page."},"minWordConfidence":{"type":"integer","default":0,"minimum":0,"maximum":100,"description":"Drop words the engine is less sure about than this, from 0 to 100. Leave at 0 to keep everything and judge by the reported confidence instead. Raising it cuts noise out of poor scans at the cost of real words."},"includePageText":{"type":"boolean","default":false,"description":"Add a 'pages' array with each page's text, method (OCR or copied text layer), confidence and word count, on top of the combined text. Useful for citing a page number, and it makes rows larger."}},"required":["fileUrls"],"additionalProperties":false},"example":{"fileUrls":["https://nerolabs-samples.nerolabs.workers.dev/sample-receipt.png"],"maxPagesPerFile":1}}}}}},"/pagespeed":{"post":{"operationId":"pagespeed","summary":"Google PageSpeed and Lighthouse scores for web pages","description":"Runs Google PageSpeed Insights (Lighthouse) on up to 10 pages and returns performance, accessibility, best-practices and SEO scores, Core Web Vitals (LCP, CLS, INP, TBT) and the top fixes to make each page faster. Mobile, desktop or both. $0.005 per page per strategy. Runs nerolabs/bulk-pagespeed-checker; takes 20 to 60 seconds.","tags":["pagespeed"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"testedUrl":{"type":"string"},"pageSpeedStatus":{"type":"string"},"finalUrl":{"type":"string"},"redirected":{"type":"boolean"},"isDuplicate":{"type":"boolean"},"pageSpeedReportUrl":{"type":"string"},"lighthouseVersion":{"type":"string"},"analysedAt":{"type":"string"},"checkedAt":{"type":"string"},"mobileStatus":{"type":"string"},"mobileStatusDetail":{},"mobilePerformanceScore":{"type":"number"},"mobilePerformanceRating":{"type":"string"},"mobileAccessibilityScore":{"type":"number"},"mobileBestPracticesScore":{"type":"number"},"mobileSeoScore":{"type":"number"},"mobileLcpSeconds":{"type":"number"},"mobileFcpSeconds":{"type":"number"},"mobileSpeedIndexSeconds":{"type":"number"},"mobileTbtMs":{"type":"number"},"mobileCls":{"type":"number"},"mobileServerResponseMs":{"type":"number"},"mobilePageWeightKb":{"type":"number"},"mobileCoreWebVitals":{"type":"string"},"mobileFailingVitals":{},"mobileFieldDataScope":{"type":"string"},"mobileFieldLcpMs":{"type":"number"},"mobileFieldInpMs":{"type":"number"},"mobileFieldCls":{"type":"number"},"mobileTopFixes":{"type":"string"},"mobileOpportunities":{"type":"array"},"mobileFailedSeoChecks":{"type":"string"},"mobileFailedAccessibilityChecks":{"type":"string"},"mobileWarnings":{}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"url":"https://example.com","testedUrl":"https://example.com/","pageSpeedStatus":"ok","finalUrl":"https://example.com/","redirected":false,"isDuplicate":false,"pageSpeedReportUrl":"https://pagespeed.web.dev/analysis?url=https%3A%2F%2Fexample.com%2F","lighthouseVersion":"13.5.0","analysedAt":"2026-10-21T14:29:59.447Z","checkedAt":"2026-10-21T14:30:07.992Z","mobileStatus":"ok","mobileStatusDetail":null,"mobilePerformanceScore":100,"mobilePerformanceRating":"good"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"urls":{"type":"array","description":"Optional. A plain list of pages to test, one per line (for example example.com or https://www.python.org/). Use this when you have no dataset, file or sheet. Combined with 'Data (inline)' if both are set."},"strategy":{"type":"string","enum":["mobile","desktop","both"],"default":"mobile","description":"Google tests the page as a mid-range phone on a slow connection, or as a computer. Google ranks on the mobile version, so most people want mobile. 'Both' runs two tests per page and adds mobile* and desktop* columns side by side."},"categories":{"type":"array","default":["performance","accessibility","best-practices","seo"],"items":{"type":"string","enum":["performance","accessibility","best-practices","seo"],"enumTitles":["Performance (speed)","Accessibility","Best practices","SEO"]},"description":"Which Lighthouse scores to return. The price is the same whichever you pick; leaving some out makes each test a little faster."},"maxOpportunities":{"type":"integer","default":5,"minimum":0,"maximum":20,"description":"How many of Google's 'what would make this faster' suggestions to return per page, biggest estimated time saving first (for example 'Reduce unused JavaScript (Est savings of 588 KiB)'). 0 turns them off."},"slowBelowScore":{"type":"integer","default":50,"minimum":1,"maximum":100,"description":"Sets the 'Slow sites only' and 'Fast sites only' filters and the slow count in the summary. Google's own bands: 90 and up is good, 50 to 89 needs improvement, under 50 is poor."}},"required":["urls"],"additionalProperties":false},"example":{"urls":["https://example.com"],"strategy":"mobile"}}}}}},"/company/uk-trust-check":{"post":{"operationId":"uk_trust_check","summary":"Is this UK business real and trustworthy? One verdict per business","description":"Checks up to 10 UK businesses or traders and returns a trust verdict for each: Companies House status, age, accounts and filings, directors, Gazette insolvency notices, whether the website matches the company, and food hygiene rating where relevant, with the reasons. Give a name, website, company number or postcode. $0.05 per business. Runs nerolabs/uk-business-trust-check.","tags":["company lookup"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.050000","max":"0.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"businessName":{"type":"string"},"website":{"type":"string"},"attribution":{"type":"array"},"checkedAt":{"type":"string"},"checkStatus":{"type":"string"},"trustVerdict":{"type":"string"},"trustScore":{"type":"number"},"plainEnglishSummary":{"type":"string"},"reasons":{"type":"array"},"redCount":{"type":"number"},"amberCount":{"type":"number"},"matchMethod":{"type":"string"},"matchConfidence":{"type":"string"},"matchedCompanyNumber":{"type":"string"},"matchedCompanyName":{"type":"string"},"companyStatus":{"type":"string"},"companyType":{"type":"string"},"incorporatedOn":{"type":"string"},"companyAgeMonths":{"type":"number"},"registeredOffice":{"type":"string"},"sicCodes":{"type":"array"},"activeDirectorCount":{"type":"number"},"companiesHouseUrl":{"type":"string"},"websiteChecked":{"type":"boolean"},"websiteReadable":{"type":"boolean"},"websiteStatus":{"type":"string"},"websitePagesRead":{"type":"array"},"siteCompanyNumbers":{"type":"array"},"siteLegalNames":{"type":"array"},"siteVatNumbers":{"type":"array"},"badgesClaimed":{"type":"array"},"badgesVerified":{"type":"boolean"},"gazetteChecked":{"type":"boolean"},"gazetteNotices":{"type":"array"},"sanctionsChecked":{"type":"boolean"},"sanctionsListDate":{"type":"string"},"sanctionsHits":{"type":"array"},"foodHygiene":{"type":"object"},"candidatesRejected":{"type":"array"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"businessName":"Greggs","website":"greggs.co.uk","checkedAt":"2026-10-21T14:29:12.650Z","checkStatus":"checked","trustVerdict":"looks_legitimate","trustScore":100,"plainEnglishSummary":"GREGGS PLC (company 00502851) looks legitimate: an active UK company registered 74 years ago, filing...","reasons":[{"severity":"green","code":"registered-company","message":"Registered on Companies House as GREGGS PLC (00502851), status active, incorporated 1951-12-29 (74 y...","source":"Companies House","url":"https://find-and-update.company-information.service.gov.uk/company/00502851"},{"severity":"green","code":"filings-up-to-date","message":"Accounts and confirmation statement are not overdue (last accounts made up to 2025-12-27).","source":"Companies House","url":"https://find-and-update.company-information.service.gov.uk/company/00502851/filing-history"}],"redCount":0,"amberCount":0,"matchMethod":"number_on_site","matchConfidence":"high","matchedCompanyNumber":"00502851"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"businesses":{"type":"array","description":"A JSON list of businesses, each with any of businessName, website, companyNumber, postcode, town, phone. Any other keys are kept and returned untouched. Example: [{\"businessName\": \"Acme Electrical Ltd\", \"website\": \"acme-electrical.co.uk\", \"postcode\": \"LE11 2HP\"}]."},"businessName":{"type":"string","description":"Trading or registered name, for a single check."},"website":{"type":"string","description":"The business's website, for a single check. The site is read for its company number, legal name, VAT number and trade badges."},"companyNumber":{"type":"string","description":"Companies House number, if you have it (e.g. 00445790 or SC759398)."},"postcode":{"type":"string","description":"Where the business trades. Helps pick the right company when names are similar."},"includeOfficers":{"type":"boolean","default":true,"description":"Cross-check up to four active directors: other appointments at insolvent companies, name matches on the disqualified directors register, and the UK Sanctions List. Company register data only. Turn off for a faster, lighter check."},"includeGazette":{"type":"boolean","default":true,"description":"Search The Gazette for corporate insolvency notices (winding-up petitions, liquidations). The Gazette rate-limits heavy use; if it refuses, rows say so rather than claiming there are none."},"checkFoodHygiene":{"type":"boolean","default":false,"description":"Food businesses (by name, website title or SIC code) are checked against the Food Standards Agency ratings automatically. Turn this on to check every business."},"maxPagesPerSite":{"type":"integer","default":4,"minimum":1,"maximum":8,"description":"The homepage plus the privacy, terms, contact and about pages, where UK firms publish their company number and legal name."}},"additionalProperties":false},"example":{"businesses":[{"businessName":"Greggs","website":"greggs.co.uk"}]}}}}}},"/company/uk-risk-report":{"post":{"operationId":"uk_company_risk","summary":"Full UK company risk report: finances, directors, insolvency, red flags","description":"Builds a risk report on up to 5 UK companies by number or name: Companies House profile, overdue accounts, charges, director history and disqualifications, Gazette insolvency notices and a scored list of red flags with the evidence, optionally as Markdown. Use it before a deal, a supplier contract or credit. $0.50 per company. Runs nerolabs/uk-company-risk-report.","tags":["company lookup"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.500000","max":"2.500000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"outcome":{"type":"string"},"resolvedVia":{},"companyNumber":{"type":"string"},"companyName":{"type":"string"},"companyStatus":{"type":"string"},"verdict":{"type":"string"},"redFlags":{"type":"number"},"amberFlags":{"type":"number"},"summary":{"type":"string"},"flags":{"type":"array"},"facts":{"type":"object"},"companiesHouseUrl":{"type":"string"},"checkedAt":{"type":"string"},"reportMarkdown":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"input":"00445790","outcome":"report","resolvedVia":null,"companyNumber":"00445790","companyName":"TESCO PLC","companyStatus":"active","verdict":"green","redFlags":0,"amberFlags":0,"summary":"TESCO PLC (00445790) is active, incorporated 1947-11-27 (78 years). GREEN: no red or amber flag in t...","flags":[{"severity":"info","code":"director-dissolved-trail","message":"KENNEDY, Christopher John has 20 other appointments at dissolved companies (often routine subsidiary...","source":"Companies House"},{"severity":"info","code":"director-checks-capped","message":"Not every active director was cross-checked (maxOfficerChecks reached).","source":"Companies House"}],"facts":{"companyNumber":"00445790","companyName":"TESCO PLC","companyStatus":"active","companyStatusDetail":null,"companyType":"plc","jurisdiction":"england-wales","incorporatedOn":"1947-11-27","dissolvedOn":null,"sicCodes":["47110"],"registeredOffice":"Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA, United Kingdom","registeredOfficeInDispute":false,"undeliverableRegisteredOffice":false,"previousNames":[{"name":"TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY","ceasedOn":"1983-08-25"},{"name":"TESCO STORES (HOLDINGS) LIMITED","ceasedOn":"1981-12-14"}],"accounts":{"overdue":false,"nextDue":"2027-08-26","lastMadeUpTo":"2026-02-28","lastType":"group"}},"companiesHouseUrl":"https://find-and-update.company-information.service.gov.uk/company/00445790","checkedAt":"2026-10-21T14:29:20.752Z"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"companies":{"type":"array","description":"One entry per company to report on. An 8-character Companies House number (e.g. 00445790) is matched exactly. A name (e.g. \"Carillion plc\") is searched on the register: a unique exact match proceeds to a full report; anything ambiguous returns the candidate list instead, so nothing is reported on th"},"includeGazette":{"type":"boolean","default":true,"description":"Searches The Gazette's corporate insolvency notices (winding-up petitions, administrations, liquidations) by the company's exact current and previous names. A winding-up petition appears here before anything changes on Companies House. The Gazette rate-limits callers; if a search is refused the repo"},"checkDirectorHistory":{"type":"boolean","default":true,"description":"For each active director (up to the limit below), counts their other current appointments and how many of their past companies are dissolved or insolvent, from the Companies House officer appointments endpoint. A director with a long trail of dissolved companies is flagged amber."},"checkDisqualifications":{"type":"boolean","default":true,"description":"Searches the Companies House disqualified officers register by each active director's name. A name match is reported as a possible match needing a manual check (amber), never asserted as a confirmed disqualification, because the register is searched by name only."},"maxOfficerChecks":{"type":"integer","default":8,"minimum":0,"maximum":25,"description":"Caps the per-director appointment and disqualification lookups to keep large companies fast and within the Companies House rate limit (600 calls per 5 minutes). Directors beyond the cap are listed but not cross-checked, and the report says so."},"includeMarkdown":{"type":"boolean","default":true,"description":"Adds a reportMarkdown field with the whole report as readable Markdown, handy for pasting into a CRM note, an email, or an AI agent's context."}},"required":["companies"],"additionalProperties":false},"example":{"companies":["00445790"]}}}}}},"/company/ireland":{"post":{"operationId":"ie_company","summary":"Irish company lookup from the CRO register","description":"Looks up Irish companies in the official CRO register by company number or by name: status, type, registered address, incorporation date and recent filings. Up to 20 results a call. $0.01 per company (a name search costs maxSearchResults x $0.01, default 5). Runs nerolabs/ireland-cro-monitor.","tags":["company lookup"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.200000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"companyNumber":{"type":"string"},"registrationStatus":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"statusDate":{},"companyType":{"type":"string"},"registrationDate":{"type":"string"},"lastAnnualReturnDate":{"type":"string"},"nextAnnualReturnDue":{"type":"string"},"lastAccountsDate":{"type":"string"},"dissolvedDate":{},"address":{"type":"string"},"eircode":{},"naceCode":{},"principalObjectCode":{"type":"string"},"sourceUrl":{"type":"string"},"dataRetrievedAt":{"type":"string"},"notFound":{"type":"boolean"},"notFoundReason":{},"changeDetected":{},"changeSummary":{}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"companyNumber":"104547","registrationStatus":"active","name":"RYANAIR DESIGNATED ACTIVITY COMPANY","status":"Normal","statusDate":null,"companyType":"DAC - Designated Activity Company (limited by shares)","registrationDate":"1984-11-28T00:00:00","lastAnnualReturnDate":"2025-10-09T00:00:00","nextAnnualReturnDue":"2026-10-09T00:00:00","lastAccountsDate":"2025-03-31T00:00:00","dissolvedDate":null,"address":"RYANAIR DUBLIN OFFICE, AIRSIDE BUSINESS PARK, SWORDS CO. DUBLIN, SWORDS,DUBLIN","eircode":null,"naceCode":null}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"companyNumber":{"type":"string","description":"Digits-only Irish CRO company number, e.g. 249885. Use this for a single-record lookup."},"companyNumbers":{"type":"array","default":[],"description":"A list of digits-only CRO company numbers. Required for Monitor mode (that's what gives each record a stable identity to track over time). Also the fastest way to check many known companies in one run, they're fetched in a single batched request."},"searchName":{"type":"string","description":"Find companies by name instead of number, useful when you don't have the CRO number yet. Not available in Monitor mode (name search results don't have a stable identity to track over time; look up the company number it returns and switch to that for ongoing monitoring)."},"maxSearchResults":{"type":"integer","default":20,"minimum":1,"maximum":100,"description":"Caps how many matches a name search returns. Only applies when searchName is set."}},"additionalProperties":false},"example":{"companyNumber":"104547"}}}}}},"/company/poland":{"post":{"operationId":"pl_company","summary":"Polish company lookup from the KRS register","description":"Looks up Polish companies in the official KRS court register by KRS number: name, legal form, status, NIP and REGON, address, share capital, board members and registration dates. Up to 20 a call. $0.01 per company. Runs nerolabs/poland-krs-monitor.","tags":["company lookup"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.200000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"krsNumber":{"type":"string"},"registry":{"type":"string"},"registrationStatus":{"type":"string"},"name":{"type":"string"},"legalForm":{"type":"string"},"nip":{"type":"string"},"regon":{"type":"string"},"registrationDate":{"type":"string"},"lastEntryNumber":{"type":"number"},"lastEntryDate":{"type":"string"},"address":{"type":"string"},"capitalAmount":{"type":"string"},"capitalCurrency":{"type":"string"},"managementBoard":{"type":"array"},"businessActivityCodeCount":{"type":"number"},"suspended":{"type":"boolean"},"suspensionNote":{},"otherStatusEntriesPresent":{"type":"array"},"sourceUrl":{"type":"string"},"dataRetrievedAt":{"type":"string"},"notFound":{"type":"boolean"},"notFoundReason":{},"changeDetected":{},"changeSummary":{}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"krsNumber":"0000019193","registry":"P","registrationStatus":"active","name":"POLSKIE KOLEJE PAŃSTWOWE SPÓŁKA AKCYJNA","legalForm":"SPÓŁKA AKCYJNA","nip":"5250000251","regon":"00012680100000","registrationDate":"11.06.2001","lastEntryNumber":216,"lastEntryDate":"08.10.2026","address":"ALEJE JEROZOLIMSKIE 142A, 02-305, WARSZAWA, POLSKA","capitalAmount":"10150715600,00","capitalCurrency":"PLN","managementBoard":[{"name":"A*** M***** B*****","role":"PREZES ZARZĄDU"},{"name":"P**** J** L********","role":"CZŁONEK ZARZĄDU"}]}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"krsNumber":{"type":"string","description":"Exact 10-digit National Court Register number, e.g. 0000033014. Use this for a single-record lookup."},"krsNumbers":{"type":"array","default":[],"description":"A list of exact 10-digit KRS numbers. Required for Monitor mode (that's what gives each record a stable identity to track over time). Also the fastest way to check many known companies in one run."},"registry":{"type":"string","enum":["P","S"],"default":"P","description":"'P' covers entrepreneurs (companies), 'S' covers associations, foundations, and other organizations. Applies to every number in this run."}},"additionalProperties":false},"example":{"krsNumber":"0000019193"}}}}}},"/company/uk":{"post":{"operationId":"uk_company","summary":"UK company lookup from Companies House","description":"Looks up UK companies in Companies House by company number: name, status, type, registered address, incorporation date, SIC codes, accounts and confirmation statement due dates, and officers. Up to 20 a call. $0.01 per company. Runs nerolabs/uk-companies-house-monitor.","tags":["company lookup"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.200000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"companyNumber":{"type":"string"},"companyName":{"type":"string"},"companyStatus":{"type":"string"},"companiesHouseUrl":{"type":"string"},"notFound":{"type":"boolean"},"monitorMode":{"type":"boolean"},"isFirstCheck":{"type":"boolean"},"changeDetected":{"type":"boolean"},"changeSummary":{"type":"string"},"changes":{"type":"array"},"checkedAt":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"companyNumber":"00445790","companyName":"TESCO PLC","companyStatus":"active","companiesHouseUrl":"https://find-and-update.company-information.service.gov.uk/company/00445790","notFound":false,"monitorMode":false,"isFirstCheck":true,"changeDetected":false,"changeSummary":"Monitor mode is off, this is a one-time lookup.","changes":[],"checkedAt":"2026-10-21T14:29:40.118Z"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"companyNumber":{"type":"string","description":"Exact 8-character Companies House number, e.g. 03977902. Use this for a single-record lookup."},"companyNumbers":{"type":"array","default":[],"description":"A list of exact Companies House numbers. Required for Monitor mode (that's what gives each company a stable identity to track over time). Also the fastest way to check many known companies in one run."}},"additionalProperties":false},"example":{"companyNumber":"00445790"}}}}}},"/contact-finder":{"post":{"operationId":"contact_finder","summary":"Find the public contact email, phone and socials of a business website","description":"Visits up to 10 business websites (home and contact pages) and returns the published contact emails (role inboxes such as info@ by default), phone numbers and social profiles for each. Honours robots.txt; nothing is guessed. $0.01 per website. Runs nerolabs/website-contact-finder; takes up to a minute.","tags":["contact"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"website":{"type":"string"},"websiteResolved":{"type":"string"},"websiteDomain":{"type":"string"},"contactStatus":{"type":"string"},"contactStatusDetail":{},"contactEmails":{"type":"array"},"primaryEmail":{"type":"string"},"emailClasses":{"type":"array"},"excludedEmailCounts":{"type":"object"},"contactPhones":{"type":"array"},"primaryPhone":{"type":"string"},"phoneDetails":{"type":"array"},"socialProfiles":{"type":"array"},"contactPageUrl":{"type":"string"},"pagesChecked":{"type":"number"},"fetchedVia":{"type":"string"},"personalEmailsIncluded":{"type":"boolean"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"website":"eff.org","websiteResolved":"https://eff.org/","websiteDomain":"eff.org","contactStatus":"ok","contactStatusDetail":null,"contactEmails":["info@eff.org","press@eff.org"],"primaryEmail":"info@eff.org","emailClasses":[{"address":"info@eff.org","class":"role","ownDomain":true,"source":"mailto"},{"address":"press@eff.org","class":"role","ownDomain":true,"source":"mailto"}],"excludedEmailCounts":{"unknown":3,"personal":1,"other_domain":1},"contactPhones":["+15102438020","+14154369333"],"primaryPhone":"+15102438020","phoneDetails":[{"raw":"+1-510-243-8020","e164":"+15102438020","country":"US","source":"text","page":"https://www.eff.org/about/contact"},{"raw":"+1 (415) 436-9333","e164":"+14154369333","country":"US","source":"text","page":"https://www.eff.org/about/contact"}],"socialProfiles":["https://www.facebook.com/eff","https://www.instagram.com/efforg"],"contactPageUrl":"https://www.eff.org/about/contact"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"includePersonalEmails":{"type":"boolean","default":false,"description":"OFF by default, deliberately. When off you get role inboxes only (info@, sales@, enquiries@ and similar), which identify a function rather than a person. Turning this on also returns addresses like firstname.lastname@, which are personal data under UK and EU rules and bring obligations with them: yo"},"includeNoReply":{"type":"boolean","default":false,"description":"OFF by default. noreply@ and do-not-reply@ are real addresses that nobody reads, so they are withheld unless you actually want them."},"onlyOwnDomain":{"type":"boolean","default":true,"description":"ON by default, and it is the single biggest quality filter. A business website is full of other people's addresses: the website builder's support inbox, an analytics vendor, a partner. Keeping only addresses at the site's own registrable domain removes almost all of that. Turn it off to also see off"},"extractPhones":{"type":"boolean","default":true,"description":"Reads published tel: links and normalises them to E.164 using Google's libphonenumber, so they are ready for a dialler. A number that cannot be parsed is returned exactly as published rather than guessed at."},"extractSocials":{"type":"boolean","default":true,"description":"Collects the company's own LinkedIn, X, Facebook, Instagram, YouTube and TikTok profile links. Share buttons are ignored."},"phoneRegion":{"type":"string","description":"The country to assume for phone numbers published without a country code, such as GB or US. Numbers that already start with + are unaffected."},"followContactPages":{"type":"boolean","default":true,"description":"After the homepage, follow same-site links that look like a contact, about or imprint page, most contact-like first."},"maxPagesPerSite":{"type":"integer","default":4,"minimum":1,"maximum":10,"description":"Including the homepage. Four is enough for almost every business site and keeps the run polite and quick."},"keep":{"type":"string","enum":["all","with_contacts","with_email","problems"],"default":"all","description":"Filters the output. Charging is unaffected: it follows what was actually found, not what you keep."},"websites":{"type":"array","items":{"type":"string"},"description":"Websites or bare domains to check, for example [\"acme.com\", \"https://www.example.org\"]."}},"required":["websites"],"additionalProperties":false},"example":{"websites":["eff.org"]}}}}}},"/tech-stack":{"post":{"operationId":"tech_stack","summary":"What technology a website is built with (CMS, analytics, shop, hosting)","description":"Detects the technology behind up to 20 websites: CMS, ecommerce platform, analytics, tag managers, frameworks, hosting and CDN, payment and chat tools, with confidence per finding. Filter for sites using a given technology to qualify leads. $0.005 per website. Runs nerolabs/tech-stack-detector.","tags":["tech stack"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"website":{"type":"string"},"techWebsite":{"type":"string"},"techDomain":{"type":"string"},"techStatus":{"type":"string"},"techStatusDetail":{},"pageTitle":{"type":"string"},"pageSizeKb":{"type":"number"},"technologyNames":{"type":"string"},"technologyCount":{"type":"number"},"ecommercePlatform":{},"cms":{"type":"string"},"analytics":{},"marketingAutomation":{},"crm":{},"paymentProcessors":{},"hosting":{},"emailHosting":{},"emailSending":{},"dnsProvider":{},"dnsVerifiedServices":{},"matchesFilter":{},"technologies":{"type":"array"},"fetchedVia":{"type":"string"},"dnsChecked":{"type":"boolean"},"pageRenderedWithJavascript":{"type":"boolean"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"website":"wordpress.org","techWebsite":"https://wordpress.org/","techDomain":"wordpress.org","techStatus":"ok","techStatusDetail":null,"pageTitle":"Blog Tool, Publishing Platform, and CMS – WordPress.org","pageSizeKb":173,"technologyNames":"WordPress, WordPress Block Editor, WordPress Site Editor, Gutenberg, MySQL, PHP, Nginx, Google Font ...","technologyCount":9,"ecommercePlatform":null,"cms":"WordPress, WordPress Block Editor, WordPress Site Editor","analytics":null,"marketingAutomation":null,"crm":null}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"technologies":{"type":"array","description":"Exact technology names, for example 'Shopify', 'WordPress', 'WooCommerce', 'HubSpot', 'Klaviyo', 'Google Workspace' or 'Microsoft 365'. Matching ignores case. A name that is not in the fingerprint set is reported with suggestions and ignored."},"categories":{"type":"array","items":{"type":"string","enum":["A/B Testing","Accessibility","Accounting","Advertising","Affiliate programs","Analytics","Appointment scheduling","Artificial Intelligence","Augmented reality","Authentication","Blogs","Browser fingerprinting","Buy now pay later","Caching","Cart abandonment","CDN","CI","CMS","Comment systems","Containers","Content curation","Control systems","Cookie compliance","CRM","Cross border ecommerce","Cryptominers","Customer data platform","Database managers","Databases","Development","Digital asset management","DMS","Documentation","Domain parking","Drupal themes","Ecommerce","Ecommerce frontends","Editors","Email","Feature management","Feed readers","Font scripts","Form builders","Fulfilment","Fundraising & donations","Geolocation","Hosting","Hosting panels","IaaS","Issue trackers","JavaScript frameworks","JavaScript graphics","JavaScript libraries","Live chat","Livestreaming","LMS","Load balancers","Loyalty & rewards","Maps","Marketing automation","Media servers","Message boards","Miscellaneous","Mobile frameworks","Network devices","Network storage","Operating systems","PaaS","Page builders","Payment processors","Performance","Personalisation","Photo galleries","Programming languages","Recruitment & staffing","Referral marketing","Remote access","Reservations & delivery","Retargeting","Returns","Reverse proxies","Reviews","Rich text editors","RUM","Search engines","Security","Segmentation","SEO","Shipping carriers","Shopify apps","Shopify themes","SSL/TLS certificate authorities","Static site generator","Surveys","Tag managers","Ticket booking","Translation","UI frameworks","User onboarding","Video players","Web frameworks","Web server extensions","Web servers","Webcams","Webmail","Widgets","Wikis","WordPress plugins","WordPress themes"]},"description":"Match any technology in these categories, for example 'Ecommerce' or 'Marketing automation'."},"matchMode":{"type":"string","enum":["any","all"],"default":"any","description":"Whether a site must use any one of the listed technologies and categories, or all of them."},"keep":{"type":"string","enum":["all","matching","detected","problems"],"default":"all","description":"Which rows to write out. Every row is still checked and every analysed site is still charged; this only controls what is returned."},"minConfidence":{"type":"integer","default":0,"minimum":0,"maximum":100,"description":"Drop detections below this confidence. Each technology comes with a confidence score; one seen only inside an inline loader script scores 75, and implied technologies inherit a lower score."},"checkDns":{"type":"boolean","default":true,"description":"ON by default. Reads the domain's MX, TXT, NS and SOA records, which is how email hosting (Google Workspace, Microsoft 365), email sending services and DNS providers are detected, and which services the company has verified its domain with. No extra charge."},"websites":{"type":"array","items":{"type":"string"},"description":"Websites or bare domains to check, for example [\"acme.com\", \"https://www.example.org\"]."}},"required":["websites"],"additionalProperties":false},"example":{"websites":["wordpress.org"]}}}}}},"/seo-audit":{"post":{"operationId":"seo_audit","summary":"SEO audit: 0-100 score and what to fix for up to 20 websites","description":"On-page SEO audit of up to 20 websites or pages: a 0-100 SEO score, A to F grade and the issues to fix, worst first (missing title or meta description, H1, noindex, HTTPS, mobile viewport, thin content, image alt text, Open Graph, structured data, sitemap, robots.txt), plus optional broken-link check. $0.005 per website, plus $0.0005 per link allowed when checkLinks is on. A call where no website could be audited is not charged. Runs nerolabs/bulk-seo-audit.","tags":["seo"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.300000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"website":{"type":"string"},"rowNumber":{"type":"number"},"auditedUrl":{"type":"string"},"finalUrl":{"type":"string"},"auditStatus":{"type":"string"},"statusDetail":{},"seoScore":{"type":["number","null"]},"grade":{"type":"string"},"issueCount":{"type":["number","null"]},"issues":{"type":"array","items":{"type":"string"}},"issueSummary":{"type":"string"},"httpStatus":{"type":["number","null"]},"isHttps":{"type":"boolean"},"responseTimeMs":{"type":["number","null"]},"pageSizeKb":{"type":["number","null"]},"pageTitle":{"type":"string"},"titleLength":{"type":["number","null"]},"metaDescription":{},"metaDescriptionLength":{"type":["number","null"]},"h1":{},"h1Count":{"type":["number","null"]},"h2Count":{"type":["number","null"]},"canonicalUrl":{},"canonicalIsSelf":{},"robotsMeta":{},"noindex":{"type":"boolean"},"lang":{"type":"string"},"hasViewport":{"type":"boolean"},"wordCount":{"type":["number","null"]},"imageCount":{"type":["number","null"]},"imagesMissingAlt":{"type":["number","null"]},"internalLinks":{"type":["number","null"]},"externalLinks":{"type":["number","null"]},"nofollowLinks":{"type":["number","null"]},"hasOpenGraph":{"type":"boolean"},"ogTitle":{},"ogImage":{},"hasTwitterCard":{"type":"boolean"},"structuredDataTypes":{"type":"array","items":{"type":"string"}},"hreflangCount":{"type":["number","null"]},"hasFavicon":{"type":"boolean"},"robotsTxtFound":{"type":"boolean"},"sitemapUrl":{},"linksChecked":{"type":["number","null"]},"brokenLinkCount":{"type":["number","null"]},"brokenLinks":{"type":"array","items":{"type":"string"}},"viaProxy":{"type":"boolean"},"duplicateOf":{},"auditedAt":{"type":"string"}}}},"count":{"type":"number"}}},"example":{"rows":[{"website":"example.com","rowNumber":1,"auditedUrl":"https://example.com","finalUrl":"https://example.com/","auditStatus":"ok","statusDetail":null,"seoScore":60,"grade":"C","issueCount":9,"issues":["missing_meta_description","missing_h1","thin_content","title_too_short","missing_canonical","missing_open_graph","missing_structured_data","missing_sitemap","missing_robots_txt"],"issueSummary":"No meta description: Google will pick a snippet itself, usually a worse one. (-10) | No H1 heading on the page. (-8) | Only 25 words of visible text; thin pages rank poorly. (-5) | Title is only 14 characters; it is unlikely to describe the page well. (-3) | No canonical tag. (-3) | No Open Graph tags, so links shared on Facebook, LinkedIn or WhatsApp show no proper preview. (-3) | No structured data (schema.org), so no rich results in Google. (-3) | No XML sitemap found at /sitemap.xml or in robots.txt. (-3) | No robots.txt file. (-2)","httpStatus":200,"isHttps":true,"responseTimeMs":12,"pageSizeKb":1,"pageTitle":"Example Domain","titleLength":14,"metaDescription":null,"metaDescriptionLength":0,"h1":null,"h1Count":0,"h2Count":0,"canonicalUrl":null,"canonicalIsSelf":null,"robotsMeta":null,"noindex":false,"lang":"en","hasViewport":true,"wordCount":25,"imageCount":0,"imagesMissingAlt":0,"internalLinks":0,"externalLinks":0,"nofollowLinks":0,"hasOpenGraph":false,"ogTitle":null,"ogImage":null,"hasTwitterCard":false,"structuredDataTypes":[],"hreflangCount":0,"hasFavicon":true,"robotsTxtFound":false,"sitemapUrl":null,"linksChecked":null,"brokenLinkCount":null,"brokenLinks":[],"viaProxy":false,"duplicateOf":null,"auditedAt":"2026-10-22T11:41:56.810Z"}],"count":1}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"checkSite":{"type":"boolean","description":"Also check each site once for a robots.txt file and an XML sitemap (from robots.txt, /sitemap.xml or /sitemap_index.xml). Free, a couple of extra requests per site.","default":true},"checkLinks":{"type":"boolean","description":"Also test the links on each audited page and list the broken ones (404, 410, 5xx or no answer). Off by default because it takes longer; charged per link checked.","default":false},"maxLinksPerPage":{"type":"integer","description":"With checkLinks on, the first this-many links on each page are tested (at most 20 through this shop).","default":20,"minimum":1,"maximum":20},"keep":{"type":"string","description":"Filtering happens after each page is audited. 'Only scores below the threshold' is the quick way to pull prospects with weak SEO out of a lead list.","default":"all","enum":["all","audited","below_score","problems"]},"scoreThreshold":{"type":"integer","description":"Used by 'Only scores below the threshold'. Rows scoring below this are kept.","default":70,"minimum":1,"maximum":100},"websites":{"type":"array","items":{"type":"string"},"description":"Websites or bare domains to check, for example [\"acme.com\", \"https://www.example.org\"]."}},"required":["websites"],"additionalProperties":false},"example":{"websites":["example.com"]}}}}}},"/rss":{"post":{"operationId":"rss","summary":"Newest posts from up to 20 RSS feeds or websites","description":"Reads up to 20 RSS, Atom or JSON feeds, or plain website addresses (the site's own feed is found automatically), and returns the newest items: title, link, date, author, summary, tags, image and podcast audio link. Filter by date (publishedAfter: \"24 hours\") and keywords. $0.005 per feed sent, up to 25 items each. A call where no feed could be read is not charged. Runs nerolabs/rss-feed-reader.","tags":["rss"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"author":{},"categories":{"type":"array","items":{"type":"string"}},"commentsUrl":{},"durationSeconds":{},"enclosureSizeBytes":{},"enclosureType":{},"enclosureUrl":{},"feedDiscovered":{"type":"boolean"},"feedLanguage":{},"feedSiteUrl":{},"feedStatus":{"type":"string"},"feedTitle":{},"feedType":{},"feedUrl":{"type":"string"},"fetchedAt":{"type":"string"},"imageUrl":{},"itemId":{},"link":{},"position":{},"publishedAt":{},"resolvedFeedUrl":{},"rowNumber":{"type":"integer"},"statusDetail":{},"summary":{},"title":{},"updatedAt":{}}}},"count":{"type":"integer"}}},"example":{"rows":[{"rowNumber":1,"feedUrl":"https://www.nasa.gov/news-release/feed/","resolvedFeedUrl":"https://www.nasa.gov/news-release/feed/","feedDiscovered":false,"feedStatus":"ok","statusDetail":null,"feedTitle":"NASA","feedSiteUrl":"https://www.nasa.gov/","feedType":"rss","feedLanguage":"en-US","position":1,"itemId":"https://science.nasa.gov/image-article/apod-2026-october-22-the-first-green-star-wd-j13306435/","title":"APOD: 2026 October 22 – The First Green Star, WD J1330+6435","link":"https://science.nasa.gov/image-article/apod-2026-october-22-the-first-green-star-wd-j13306435/","author":null,"publishedAt":"2026-10-22T04:05:00.000Z","updatedAt":null,"summary":"APOD Science APOD APOD: 2026 October 22 – The… Today’s APOD Archive Submissions Index Search Calendar RSS Education About Discuss APOD Astronomy Picture of the Day Discover the cosmos! Each day a diff...","categories":["APOD"],"imageUrl":"https://assets.science.nasa.gov/dynamicimage/assets/science/cds/apod/apod/2026/october/green_wd_mark-garlick_annotated2.jpg?w=1280&h=1280&fit=clip&crop=faces%2Cfocalpoint","enclosureUrl":null,"enclosureType":null,"enclosureSizeBytes":null,"durationSeconds":null,"commentsUrl":null,"fetchedAt":"2026-10-22T13:06:18.250Z"},{"rowNumber":1,"feedUrl":"https://www.nasa.gov/news-release/feed/","resolvedFeedUrl":"https://www.nasa.gov/news-release/feed/","feedDiscovered":false,"feedStatus":"ok","statusDetail":null,"feedTitle":"NASA","feedSiteUrl":"https://www.nasa.gov/","feedType":"rss","feedLanguage":"en-US","position":2,"itemId":"https://science.nasa.gov/earth/earth-observatory/fires-char-new-guinea/","title":"Fires Char New Guinea","link":"https://science.nasa.gov/earth/earth-observatory/fires-char-new-guinea/","author":null,"publishedAt":"2026-10-22T04:01:00.000Z","updatedAt":null,"summary":"Emissions on both sides of the island are unusually high as human-set fires spread in a landscape parched by drought.","categories":["Earth Observatory","Visible Infrared Imaging Radiometer Suite (VIIRS)","Wildfires"],"imageUrl":"https://assets.science.nasa.gov/dynamicimage/assets/science/esd/eo/images/iotd/2026/new-guinea-on-fire/papuanewguinea_vir_20261011.jpg?w=2048&h=1460&fit=clip&crop=faces%2Cfocalpoint","enclosureUrl":null,"enclosureType":null,"enclosureSizeBytes":null,"durationSeconds":null,"commentsUrl":null,"fetchedAt":"2026-10-22T13:06:18.250Z"},{"rowNumber":2,"feedUrl":"https://blog.cloudflare.com","resolvedFeedUrl":"https://blog.cloudflare.com/rss/","feedDiscovered":true,"feedStatus":"ok","statusDetail":"Feed found automatically from the website: https://blog.cloudflare.com/rss/","feedTitle":"Cloudflare Blog","feedSiteUrl":"https://blog.cloudflare.com/","feedType":"rss","feedLanguage":"en-us","position":1,"itemId":"01M5FTVN0D8MSEXMF36ZM9WWD4","title":"Localizing compliance at scale: achieving South Korea’s ISMS certification","link":"https://blog.cloudflare.com/k-isms/","author":"Kabin Calan","publishedAt":"2026-10-22T13:00:00.000Z","updatedAt":null,"summary":"Cloudflare has achieved South Korea's ISMS certification following an audit across 80 controls. Learn how we localized user consent flows, adapted social sign-up paths at the edge, and validated our g...","categories":["Compliance","Dashboard","Korea","Privacy","Security"],"imageUrl":"https://blog.cloudflare.com/_emdash/api/media/file/01M5G8JRPS2ZR304ZH695BQBTD.01M5G8JS8D86H6MQHCQERAW2XC.png","enclosureUrl":"https://blog.cloudflare.com/_emdash/api/media/file/01M5G8JRPS2ZR304ZH695BQBTD.01M5G8JS8D86H6MQHCQERAW2XC.png","enclosureType":"image/png","enclosureSizeBytes":null,"durationSeconds":null,"commentsUrl":null,"fetchedAt":"2026-10-22T13:06:18.319Z"},{"rowNumber":2,"feedUrl":"https://blog.cloudflare.com","resolvedFeedUrl":"https://blog.cloudflare.com/rss/","feedDiscovered":true,"feedStatus":"ok","statusDetail":"Feed found automatically from the website: https://blog.cloudflare.com/rss/","feedTitle":"Cloudflare Blog","feedSiteUrl":"https://blog.cloudflare.com/","feedType":"rss","feedLanguage":"en-us","position":2,"itemId":"01M5E1HXVZGTKAKEYZ0KMZQ65Q","title":"Introducing full transaction detection for Cloudflare WAF","link":"https://blog.cloudflare.com/full-transaction-waf/","author":"Daniele Molteni","publishedAt":"2026-10-21T14:10:42.000Z","updatedAt":null,"summary":"Cloudflare's web application firewall can now correlate an HTTP request with its response. Full transaction detection helps every customer find successful exploits, data exposure, and risky misconfigu...","categories":["Managed Rules","Security","Security Analytics","Vulnerabilities","WAF"],"imageUrl":"https://blog.cloudflare.com/_emdash/api/media/file/01M5E1HKVR7WJX7KGB4B8MSK75.png","enclosureUrl":"https://blog.cloudflare.com/_emdash/api/media/file/01M5E1HKVR7WJX7KGB4B8MSK75.png","enclosureType":"image/png","enclosureSizeBytes":null,"durationSeconds":null,"commentsUrl":null,"fetchedAt":"2026-10-22T13:06:18.319Z"}],"count":4}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"feedUrls":{"type":"array","items":{"type":"string"},"description":"RSS, Atom or JSON Feed links, or plain website addresses (the site's own feed is found automatically). Up to 20 per call."},"maxItemsPerFeed":{"type":"integer","description":"Newest items to return from each feed (default 10, at most 25).","default":10,"minimum":1,"maximum":25},"publishedAfter":{"type":"string","description":"Only items published after this date (2026-10-01) or within this period (\"24 hours\", \"7 days\", \"2 weeks\"). Items with no date in the feed are kept."},"keywords":{"type":"array","description":"Keep only items whose title, summary, content or tags mention at least one of these words or phrases. Whole words, not case sensitive: 'AI' matches 'AI' but not 'said'.","items":{"type":"string"}},"excludeKeywords":{"type":"array","description":"Drop items that mention any of these words or phrases. Whole words, not case sensitive.","items":{"type":"string"}},"includeContent":{"type":"boolean","description":"Add a 'content' field with the full post text the feed carries. The summary is always included.","default":false},"contentFormat":{"type":"string","description":"Plain text with paragraph breaks, or the feed's own HTML.","default":"text","enum":["text","html"]},"maxCharsPerItem":{"type":"integer","description":"Summary and content longer than this are cut, so one huge post cannot bloat the dataset.","default":20000,"minimum":200,"maximum":1000000},"dedupeAcrossFeeds":{"type":"boolean","description":"When the same link appears in two feeds in one run (a story in both 'World' and 'Top stories'), return it once and charge it once.","default":true},"discoverFeeds":{"type":"boolean","description":"When a link is a normal web page, use the feed the page declares, or try the usual addresses (/feed, /rss, /feed.xml and others). Turn off to treat only real feed links as valid.","default":true}},"required":["feedUrls"],"additionalProperties":false},"example":{"feedUrls":["https://www.nasa.gov/news-release/feed/","https://blog.cloudflare.com"],"maxItemsPerFeed":2}}}}}},"/ai-crawlers":{"post":{"operationId":"ai_crawlers","summary":"Is GPTBot, ClaudeBot or PerplexityBot blocked? AI crawler access for up to 20 sites","description":"Checks if AI crawlers can read up to 20 websites: GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot and Meta-ExternalAgent by default (four more optional). Reads robots.txt, fetches each site as each bot vs a browser to catch firewall blocks, and checks llms.txt. Returns allowed or blocked per bot and why. $0.005 per website. Unreachable sites are not charged. Runs nerolabs/ai-crawler-access-checker.","tags":["ai crawlers"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"allowedBots":{"type":"array","items":{"type":"string"}},"blockedBots":{"type":"array","items":{"type":"string"}},"blockedCount":{"type":"integer"},"blocksAiSearch":{"type":"boolean"},"blocksTraining":{"type":"boolean"},"bots":{"type":"array","items":{"type":"object","properties":{"blocked":{"type":"boolean"},"blockedBy":{},"bot":{"type":"string"},"disallowRules":{"type":"integer"},"fetchHttpStatus":{"type":"integer"},"purpose":{"type":"string"},"realFetch":{"type":"string"},"robotsTxt":{"type":"string"},"ruleSource":{"type":"string"},"vendor":{"type":"string"}}}},"botsChecked":{"type":"integer"},"changes":{"type":"array","items":{}},"checkStatus":{"type":"string"},"checkedAt":{"type":"string"},"checkedUrl":{"type":"string"},"claudebotFetch":{"type":"string"},"claudebotRobots":{"type":"string"},"duplicateOf":{},"edge":{},"finalUrl":{"type":"string"},"fixes":{"type":"array","items":{"type":"string"}},"gptbotFetch":{"type":"string"},"gptbotRobots":{"type":"string"},"homepageHttpStatus":{"type":"integer"},"llmsFullTxtFound":{"type":"boolean"},"llmsTxtFound":{"type":"boolean"},"llmsTxtTitle":{},"llmsTxtUrl":{},"metaExternalagentFetch":{"type":"string"},"metaExternalagentRobots":{"type":"string"},"monitorStatus":{},"noaiDirective":{"type":"boolean"},"oaiSearchbotFetch":{"type":"string"},"oaiSearchbotRobots":{"type":"string"},"perplexitybotFetch":{"type":"string"},"perplexitybotRobots":{"type":"string"},"previousCheckedAt":{},"realFetchTested":{"type":"boolean"},"robotsTxtStatus":{"type":"string"},"robotsTxtUrl":{"type":"string"},"rowNumber":{"type":"integer"},"statusDetail":{},"summary":{"type":"string"},"verdict":{"type":"string"},"viaProxy":{"type":"boolean"}}}},"count":{"type":"integer"}}},"example":{"rows":[{"rowNumber":2,"checkedUrl":"https://wikipedia.org","finalUrl":"https://www.wikipedia.org/","checkStatus":"ok","statusDetail":null,"verdict":"partly_blocked","summary":"Blocks ClaudeBot, Meta-ExternalAgent; allows GPTBot, OAI-SearchBot, PerplexityBot. No llms.txt.","botsChecked":5,"blockedCount":2,"blockedBots":["ClaudeBot","Meta-ExternalAgent"],"allowedBots":["GPTBot","OAI-SearchBot","PerplexityBot"],"blocksAiSearch":false,"blocksTraining":true,"homepageHttpStatus":200,"robotsTxtStatus":"found","robotsTxtUrl":"https://www.wikipedia.org/robots.txt","llmsTxtFound":false,"llmsTxtUrl":null,"llmsTxtTitle":null,"llmsFullTxtFound":false,"noaiDirective":false,"edge":null,"fixes":["ClaudeBot gets HTTP 403 from your server or firewall although robots.txt allows it. Anthropic will not use this site to train Claude. Check your CDN or bot-protection rules."],"bots":[{"bot":"GPTBot","vendor":"OpenAI","purpose":"training","robotsTxt":"allowed","ruleSource":"wildcard","disallowRules":428,"realFetch":"served","fetchHttpStatus":200,"blocked":false,"blockedBy":null}],"realFetchTested":true,"monitorStatus":null,"changes":[],"previousCheckedAt":null,"viaProxy":false,"duplicateOf":null,"checkedAt":"2026-11-01T14:47:36.934Z","gptbotRobots":"allowed","gptbotFetch":"served","oaiSearchbotRobots":"allowed","oaiSearchbotFetch":"served","claudebotRobots":"allowed","claudebotFetch":"blocked","perplexitybotRobots":"allowed","perplexitybotFetch":"served","metaExternalagentRobots":"allowed","metaExternalagentFetch":"blocked"}],"count":1}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"string","enum":["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","PerplexityBot","Meta-ExternalAgent","Google-Extended","Applebot-Extended","CCBot"]},"description":"Which crawlers to test. Default: GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot and Meta-ExternalAgent. Google-Extended and Applebot-Extended are robots.txt control tokens with no crawler of their own, so only their robots.txt rule is checked.","default":["GPTBot","OAI-SearchBot","ClaudeBot","PerplexityBot","Meta-ExternalAgent"]},"testRealFetch":{"type":"boolean","description":"Besides reading robots.txt, request the URL once per crawler with its published user agent and once as a normal browser, to catch firewalls and CDNs that refuse AI crawlers even though robots.txt allows them. About six requests per site. Turn off for a robots.txt-only check.","default":true},"checkLlmsTxt":{"type":"boolean","description":"Also look for /llms.txt and /llms-full.txt on each site. Free, two extra requests per site.","default":true},"keep":{"type":"string","description":"'all' returns every site; 'blocked' returns only sites that block at least one of the chosen crawlers.","default":"all","enum":["all","blocked"]},"websites":{"type":"array","items":{"type":"string"},"description":"Websites or bare domains to check, for example [\"acme.com\", \"https://www.example.org\"]."}},"required":["websites"],"additionalProperties":false},"example":{"websites":["nytimes.com","wikipedia.org"]}}}}}},"/ai-shopping":{"post":{"operationId":"ai_shopping","summary":"Which products and shops do AI shopping answers recommend? Brand rank for up to 5 prompts","description":"Asks up to 5 shopping prompts to OpenAI with its web search tool (ChatGPT-style answers via the official API, not scraped from chatgpt.com) and returns the recommended products in order with prices, shops, links and cited sources, plus whether each brand, shop or website in trackBrands appears and at what position. Set country for local shops. $0.05 per answer. Failed answers are not charged. Runs nerolabs/ai-shopping-results-tracker.","tags":["ai shopping"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.050000","max":"0.250000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"rows":{"type":"array","items":{"type":"object","properties":{"answerNumber":{"type":"integer"},"answerText":{"type":"string"},"answeredAt":{"type":"string"},"bestPosition":{"type":"integer"},"brandFound":{"type":"boolean"},"brandResults":{"type":"array","items":{"type":"object","properties":{"asShop":{"type":"boolean"},"cited":{"type":"boolean"},"found":{"type":"boolean"},"mentionedInAnswer":{"type":"boolean"},"name":{"type":"string"},"position":{},"productPositions":{"type":"array","items":{"type":"integer"}}}}},"changes":{"type":"array","items":{}},"checkStatus":{"type":"string"},"citedDomains":{"type":"array","items":{"type":"string"}},"citedSources":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}}}},"country":{"type":"string"},"duplicateOf":{},"model":{"type":"string"},"monitorStatus":{},"previousCheckedAt":{},"productCount":{"type":"integer"},"productNames":{"type":"array","items":{"type":"string"}},"products":{"type":"array","items":{"type":"object","properties":{"brand":{"type":"string"},"currency":{},"name":{"type":"string"},"position":{"type":"integer"},"price":{},"priceText":{},"productUrl":{},"reviewSites":{"type":"array","items":{"type":"string"}},"shops":{"type":"array","items":{"type":"object","properties":{"domain":{},"name":{"type":"string"},"url":{}}}},"trackedMatches":{"type":"array","items":{"type":"string"}}}}},"prompt":{"type":"string"},"rowNumber":{"type":"integer"},"shopDomains":{"type":"array","items":{"type":"string"}},"shops":{"type":"array","items":{"type":"string"}},"sourcesSearched":{"type":"integer"},"statusDetail":{},"summary":{"type":"string"},"topProduct":{"type":"string"},"trackedBrands":{"type":"array","items":{"type":"string"}}}}}}},"example":{"rows":[{"rowNumber":1,"answerNumber":1,"prompt":"best cordless vacuum for pet hair","country":"GB","checkStatus":"ok","statusDetail":null,"summary":"3 product(s) recommended, first: Dyson V15 Detect Absolute. Found: Dyson #1, Shark #2.","trackedBrands":["Dyson","Shark","Breville"],"brandFound":true,"bestPosition":1,"brandResults":[{"name":"Dyson","found":true,"position":1,"productPositions":[1],"mentionedInAnswer":true,"asShop":true,"cited":true},{"name":"Shark","found":true,"position":2,"productPositions":[2,3],"mentionedInAnswer":true,"asShop":false,"cited":false},{"name":"Breville","found":false,"position":null,"productPositions":[],"mentionedInAnswer":false,"asShop":false,"cited":false}],"productCount":3,"productNames":["Dyson V15 Detect Absolute","Shark Stratos Cordless Vacuum","Shark PowerPro Pet"],"topProduct":"Dyson V15 Detect Absolute","products":[{"position":1,"name":"Dyson V15 Detect Absolute","brand":"Dyson","price":599,"currency":"GBP","priceText":"~£599","shops":[{"name":"Dyson UK","url":"https://www.dyson.co.uk/vacuum-cleaners/cordless/v15","domain":"dyson.co.uk"}],"productUrl":"https://www.dyson.co.uk/vacuum-cleaners/cordless/v15","reviewSites":[],"trackedMatches":["Dyson"]},{"position":2,"name":"Shark Stratos Cordless Vacuum","brand":"Shark","price":419.99,"currency":"GBP","priceText":"often around £419.99, with discounts showing ~£199","shops":[{"name":"Currys","url":null,"domain":null}],"productUrl":null,"reviewSites":["techradar.com"],"trackedMatches":["Shark"]}],"shops":["Dyson UK","Currys","John Lewis"],"shopDomains":["dyson.co.uk"],"citedSources":[{"url":"https://www.which.co.uk/reviews/cordless-vacuum-cleaners/article/how-to-choose-the-best-dyson-a4u7I8K0x1e5","domain":"which.co.uk","title":"How to choose the best Dyson vacuum - Which?"},{"url":"https://www.dyson.co.uk/vacuum-cleaners/cordless/v15","domain":"dyson.co.uk","title":"Dyson V15™ Detect cordless vacuum cleaner – Overview | Dyson V15™ vacuums"}],"citedDomains":["which.co.uk","dyson.co.uk","techradar.com"],"sourcesSearched":23,"answerText":"For pet hair (especially if you have carpets **and** hard floors), here are the best cordless picks in the UK right now:\n\n## 1) Dyson V15 Detect Absolute (cordless stick)\n- **Why it’s great for pet hair:** strong pickup on mixed floor types...","model":"gpt-5.4-nano","monitorStatus":null,"changes":[],"previousCheckedAt":null,"duplicateOf":null,"answeredAt":"2026-11-01T15:44:36.142Z"}],"count":2}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompts":{"type":"array","description":"Shopping questions a shopper would ask an AI assistant, for example ['best cordless vacuum for pet hair']. Up to 5 per call (prompts x answersPerPrompt).","items":{"type":"string"}},"trackBrands":{"type":"array","description":"Your brand, product, shop or website (and your competitors'), for example 'Dyson' or 'argos.co.uk'. Each row reports whether it appears, at what product position, as a shop, or as a cited source. Optional.","items":{"type":"string"}},"country":{"type":"string","description":"Two-letter country code the shopper is in (US, GB, DE, AU and so on), so search results, shops and currency fit that country. A row's own 'country' column overrides it. Default US.","default":"US"},"city":{"type":"string","description":"Optional city for local results, for example 'London'."},"region":{"type":"string","description":"Optional state or region, for example 'California'."},"shoppingInstructions":{"type":"boolean","description":"On: the model is told to recommend named products with prices and shops, like ChatGPT's shopping answers. Off: the prompt is answered with no extra instruction (one web search).","default":true},"answersPerPrompt":{"type":"integer","description":"Ask each prompt up to 5 times, since AI answers vary. Each answer is charged.","default":1,"minimum":1,"maximum":5},"includeAnswerText":{"type":"boolean","description":"Keep the full written answer on each row.","default":true},"keep":{"type":"string","description":"'found' keeps only answers where a tracked brand appears, 'missing' only answers where none does.","default":"all","enum":["all","found","missing"]}},"required":["prompts"],"additionalProperties":false},"example":{"prompts":["best cordless vacuum for pet hair"],"trackBrands":["Dyson","Shark"],"country":"GB"}}}}}},"/ai-answers":{"post":{"operationId":"ai_answers","summary":"Ask OpenAI, Perplexity, Claude, Gemini and Grok at once: answers, sources and brand mentions side by side","description":"Sends up to 5 prompts to several AI assistants, each with its own live web search via official APIs (openai, perplexity, claude, gemini, grok), and returns each answer, its cited sources and sites, and which assistants mention or cite each brand or website in trackBrands. Price per prompt: openai $0.02, perplexity $0.01, claude $0.03, gemini $0.05, grok $0.05 (default openai + perplexity = $0.03). Not charged if no assistant answers. Runs nerolabs/multi-ai-answer-snapshot.","tags":["ai visibility"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.800000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"rows":{"type":"array","items":{"type":"object","properties":{"allCitedDomains":{"type":"array","items":{"type":"string"}},"answeredAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"answerText":{"type":"string"},"brands":{"type":"array","items":{"type":"object","properties":{"cited":{"type":"boolean"},"mentioned":{"type":"boolean"},"mentions":{"type":"integer"},"name":{"type":"string"},"rank":{}}}},"citedDomains":{"type":"array","items":{"type":"string"}},"engine":{"type":"string"},"error":{},"label":{"type":"string"},"model":{"type":"string"},"modelCostPaidBy":{"type":"string"},"modelCostUsd":{"type":"number"},"seconds":{"type":"number"},"sources":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}}}},"status":{"type":"string"}}}},"brandVisibility":{"type":"array","items":{"type":"object","properties":{"citedBy":{"type":"array","items":{"type":"string"}},"mentionedBy":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"share":{"type":"integer"}}}},"changes":{"type":"array","items":{}},"checkStatus":{"type":"string"},"country":{},"duplicateOf":{},"enginesAnswered":{"type":"array","items":{"type":"string"}},"enginesAsked":{"type":"array","items":{"type":"string"}},"mentionedBy":{"type":"object","properties":{"Asana":{"type":"integer"},"Dyson":{"type":"integer"},"Trello":{"type":"integer"}}},"monitorStatus":{},"openaiAnswer":{"type":"string"},"openaiBrandsMentioned":{"type":"array","items":{"type":"string"}},"openaiCitedDomains":{"type":"array","items":{"type":"string"}},"openaiStatus":{"type":"string"},"perplexityAnswer":{"type":"string"},"perplexityBrandsMentioned":{"type":"array","items":{"type":"string"}},"perplexityCitedDomains":{"type":"array","items":{"type":"string"}},"perplexityStatus":{"type":"string"},"previousCheckedAt":{},"prompt":{"type":"string"},"rowNumber":{"type":"integer"},"statusDetail":{},"summary":{"type":"string"},"trackedBrands":{"type":"array","items":{"type":"string"}}}}}}},"example":{"rows":[{"rowNumber":1,"prompt":"best project management software for a small team","country":null,"checkStatus":"ok","statusDetail":null,"summary":"2 of 2 assistant(s) answered. Mentioned: Asana by OpenAI, Perplexity; Trello by OpenAI, Perplexity.","enginesAsked":["openai","perplexity"],"enginesAnswered":["openai","perplexity"],"trackedBrands":["Asana","Trello","Dyson"],"brandVisibility":[{"name":"Asana","mentionedBy":["openai","perplexity"],"citedBy":["perplexity"],"share":1},{"name":"Trello","mentionedBy":["openai","perplexity"],"citedBy":[],"share":1},{"name":"Dyson","mentionedBy":[],"citedBy":[],"share":0}],"mentionedBy":{"Asana":2,"Trello":2,"Dyson":0},"openaiStatus":"ok","openaiAnswer":"For a small team, the “best” project management software usually comes down to whether you want **simple Kanban**, **lightweight task/project tracking**, or **more powerful customization**. Here are s...","openaiCitedDomains":["cloudwards.net","zapier.com","techrepublic.com"],"openaiBrandsMentioned":["Asana","Trello"],"perplexityStatus":"ok","perplexityAnswer":"For a **small team**, the best project management software depends on how simple or structured you need it to be. The safest short list is **Trello** for the simplest setup, **Asana** for balanced tas...","perplexityCitedDomains":["pcmag.com","asana.com","zapier.com"],"perplexityBrandsMentioned":["Asana","Trello"],"answers":[{"engine":"openai","label":"OpenAI (ChatGPT models)","model":"gpt-5.4-nano","modelCostPaidBy":"included","sources":[{"url":"https://www.cloudwards.net/best-project-management-software-for-small-business/","domain":"cloudwards.net","title":"10 Best Project Management Software for Small Teams in 2026"},{"url":"https://zapier.com/blog/best-project-management-software-small-business/","domain":"zapier.com","title":"The best small business project management software in 2026"}],"citedDomains":["cloudwards.net","zapier.com","techrepublic.com"],"brands":[{"name":"Asana","mentioned":true,"rank":1,"mentions":2,"cited":false},{"name":"Trello","mentioned":true,"rank":2,"mentions":2,"cited":false},{"name":"Dyson","mentioned":false,"rank":null,"mentions":0,"cited":false}],"status":"ok","error":null,"answerText":"For a small team, the “best” project management software usually comes down to whether you want **simple Kanban**, **lightweight task/project tracking**, or **more powerful customization**. Here are s...","modelCostUsd":0.012397,"seconds":6.1},{"engine":"perplexity","label":"Perplexity","model":"perplexity/sonar","modelCostPaidBy":"caller","sources":[{"url":"https://www.pcmag.com/picks/the-best-project-management-software","domain":"pcmag.com","title":"The Best Project Management Software for 2026 - PCMag"},{"url":"https://asana.com/resources/best-project-management-software","domain":"asana.com","title":"Best project management software: 11 tools compared [2026] - Asana"}],"citedDomains":["pcmag.com","asana.com","zapier.com"],"brands":[{"name":"Asana","mentioned":true,"rank":2,"mentions":3,"cited":true},{"name":"Trello","mentioned":true,"rank":1,"mentions":3,"cited":false},{"name":"Dyson","mentioned":false,"rank":null,"mentions":0,"cited":false}],"status":"ok","error":null,"answerText":"For a **small team**, the best project management software depends on how simple or structured you need it to be. The safest short list is **Trello** for the simplest setup, **Asana** for balanced tas...","modelCostUsd":0.00547,"seconds":7.1}],"allCitedDomains":["cloudwards.net","zapier.com","techrepublic.com"],"monitorStatus":null,"changes":[],"previousCheckedAt":null,"duplicateOf":null,"answeredAt":"2026-11-01T15:59:31.022Z"}],"count":2}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompts":{"type":"array","description":"Questions people ask AI assistants, for example ['best project management software for a small team']. Up to 5 per call.","items":{"type":"string"}},"engines":{"type":"array","description":"Assistants to ask, each with live web search: openai ($0.02 a prompt), perplexity ($0.01), claude ($0.03), gemini ($0.05), grok ($0.05). Default openai and perplexity ($0.03 a prompt).","default":["openai","perplexity"],"items":{"type":"string","enum":["openai","perplexity","gemini","claude","grok"]}},"trackBrands":{"type":"array","description":"Your brand, product or website and your competitors', for example 'Asana' or 'monday.com'. Each answer reports whether each name is mentioned, in what order, and whether its site is cited. Optional.","items":{"type":"string"}},"country":{"type":"string","description":"Optional two-letter country code (US, GB, DE...) so answers and sources fit that country. A row's own 'country' column overrides it."},"city":{"type":"string","description":"Optional city for local results, for example 'London'."},"region":{"type":"string","description":"Optional state or region, for example 'California'."},"includeAnswerText":{"type":"boolean","description":"Keep the full written answer on each row.","default":true},"keep":{"type":"string","description":"'mentioned' keeps only prompts where a tracked name is mentioned, 'missing' only prompts where none is.","default":"all","enum":["all","mentioned","missing"]}},"required":["prompts"],"additionalProperties":false},"example":{"prompts":["best project management software for a small team"],"engines":["openai","perplexity"],"trackBrands":["Asana","Trello"]}}}}}},"/logo":{"post":{"operationId":"logo","summary":"Company logo, best icon and favicon for up to 50 websites","description":"Finds the logo file (from schema.org data or the header), the best square icon (apple-touch-icon, web app manifest or favicon, largest first) and the favicon of up to 50 websites, each downloaded and checked to be a real image, with measured width, height and format, plus site name and brand theme colour. A Clearbit logo API alternative. $0.002 per website where something is found; a call where nothing is found is not charged. Runs nerolabs/logo-favicon-finder.","tags":["logo"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"faviconUrl":{"type":"string"},"iconFormat":{"type":"string"},"iconHeight":{"type":"integer"},"iconSource":{"type":"string"},"iconUrl":{"type":"string"},"iconWidth":{"type":"integer"},"logoFormat":{"type":"string"},"logoHeight":{"type":"integer"},"logoSource":{"type":"string"},"logoUrl":{"type":"string"},"logoWidth":{"type":"integer"},"rowNumber":{"type":"integer"},"siteName":{"type":"string"},"status":{"type":"string"},"statusDetail":{},"themeColor":{},"website":{"type":"string"}}}},"count":{"type":"integer"}}},"example":{"rows":[{"rowNumber":1,"website":"https://apify.com","domain":"apify.com","status":"ok","statusDetail":null,"siteName":"Apify","logoUrl":"https://apify.com/img/apify-logo/apify-symbol-200x200.svg","logoSource":"json-ld","logoFormat":"svg","logoWidth":200,"logoHeight":200,"iconUrl":"https://apify.com/apple-icon.png?apple-icon.1qabm0kj8blk6.png?dpl=4cea6c448f","iconSource":"apple-touch-icon","iconFormat":"png","iconWidth":180,"iconHeight":180,"faviconUrl":"https://apify.com/favicon.ico?favicon.2653ilt32bing.ico?dpl=4cea6c448f","themeColor":"#020202"},{"rowNumber":2,"website":"stripe.com","domain":"stripe.com","status":"ok","statusDetail":null,"siteName":"Stripe","logoUrl":"https://images.stripeassets.com/fzn2n1nzq965/1hgcBNd12BfT9VLgbId7By/01d91920114b124fb4cf6d448f9f06eb/favicon.svg","logoSource":"json-ld","logoFormat":"svg","logoWidth":512,"logoHeight":512,"iconUrl":"https://images.stripeassets.com/fzn2n1nzq965/4vVgZi0ZMoEzOhkcv7EVwK/8cce6fdcf2733b2ec8e99548908847ed/favicon.png?w=180&h=180","iconSource":"apple-touch-icon","iconFormat":"png","iconWidth":180,"iconHeight":180,"faviconUrl":"https://assets.stripeassets.com/fzn2n1nzq965/nu0iR4KqmkdJ52fgRts09/c3a10df318e7ffb1f516073daadea625/favicon.ico","themeColor":null}],"count":2}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"includeAllIcons":{"type":"boolean","description":"Also list every icon the site declares (allIcons), largest first.","default":false},"websites":{"type":"array","items":{"type":"string"},"description":"Websites or bare domains to check, for example [\"acme.com\", \"https://www.example.org\"]."}},"required":["websites"],"additionalProperties":false},"example":{"websites":["stripe.com","notion.so"]}}}}}},"/image-convert":{"post":{"operationId":"image_convert","summary":"Convert, compress and resize up to 20 images to WebP, JPEG, PNG or AVIF","description":"Downloads up to 20 images and converts them to WebP (default), JPEG, PNG or AVIF, optionally resized to a maximum width or height, EXIF stripped and photos turned the right way up. Returns a link to each converted file with its measured width, height and size before and after. $0.002 per image converted; a call where nothing converts is not charged. Runs nerolabs/bulk-image-converter.","tags":["image"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.002000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"convertedBytes":{"type":"integer"},"convertedUrl":{"type":"string"},"format":{"type":"string"},"height":{"type":"integer"},"originalBytes":{"type":"integer"},"originalFormat":{"type":"string"},"originalHeight":{"type":"integer"},"originalWidth":{"type":"integer"},"rowNumber":{"type":"integer"},"savedPercent":{},"sourceUrl":{"type":"string"},"status":{"type":"string"},"width":{"type":"integer"}}}},"count":{"type":"integer"}}},"example":{"rows":[{"rowNumber":3,"sourceUrl":"https://www.gstatic.com/webp/gallery/1.jpg","status":"ok","convertedUrl":"https://api.apify.com/v2/key-value-stores/1BngUfUBMduDF3PpJ/records/00003-SKU-102.webp?signature=f6CW4V8JWHwSDf1KBEnZ","format":"webp","width":550,"height":368,"originalFormat":"jpeg","originalWidth":550,"originalHeight":368,"originalBytes":44891,"convertedBytes":38614,"savedPercent":14},{"rowNumber":4,"sourceUrl":"https://www.gstatic.com/webp/gallery/2.jpg","status":"ok","convertedUrl":"https://api.apify.com/v2/key-value-stores/1BngUfUBMduDF3PpJ/records/00004-SKU-103.webp?signature=hnADOOA8eN4lepFpHs8T","format":"webp","width":550,"height":404,"originalFormat":"jpeg","originalWidth":550,"originalHeight":404,"originalBytes":88316,"convertedBytes":84954,"savedPercent":3.8}],"count":2}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"imageUrls":{"type":"array","items":{"type":"string"},"description":"Direct image links (jpg, png, webp, gif, avif, tiff, heic, svg). Up to 20 per call."},"format":{"type":"string","enum":["webp","jpeg","png","avif","keep"],"default":"webp","description":"Output format; 'keep' only resizes or compresses."},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"1 to 100; lower is smaller."},"maxWidth":{"type":"integer","minimum":1,"maximum":16384,"description":"Shrink anything wider, keeping proportions. Never enlarges."},"maxHeight":{"type":"integer","minimum":1,"maximum":16384,"description":"Shrink anything taller, keeping proportions."},"fit":{"type":"string","enum":["inside","cover","contain","fill"],"default":"inside","description":"How to fit when both maxWidth and maxHeight are set."}},"required":["imageUrls"],"additionalProperties":false},"example":{"imageUrls":["https://www.gstatic.com/webp/gallery/1.jpg"],"format":"webp","maxWidth":800}}}}}},"/lane-check":{"post":{"operationId":"lane_check","summary":"Check product ideas against live demand before building","description":"Scores up to 20 product ideas or keywords against live demand: how many tools on the Apify Store already do it, monthly users of the top tools, the leader and its failure rate, tools that gained most users this month, x402 agent tools for the same job with paying wallets, and a verdict (UNPROVEN, SMALL, OPEN, HEATING UP, CONTESTED, CROWDED) with the reason. $0.02 per idea. A call where no idea could be checked is not charged. Runs nerolabs/rush-radar.","tags":["market research"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.020000","max":"0.020000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"verdict":{"type":"string"},"verdictReason":{"type":"string"},"leader":{"type":"string"},"leaderUrl":{"type":"string"},"checkedAt":{"type":"string"},"matchingTools":{"type":"number"},"monthlyUsersTop25":{"type":"number"},"toolsWith100PlusUsers":{"type":"number"},"toolsThatGainedMostUsersThisMonth":{"type":"number"},"leaderMonthlyUsers":{"type":"number"},"leaderFailRate30dPct":{"type":"number"},"topTools":{"type":"array"},"x402AgentTools":{"type":"array"}}}}}},"example":{"rows":[{"keyword":"google hotels prices","verdict":"OPEN","verdictReason":"proven demand with few strong tools, or a leader that fails often or rates poorly. A better tool can win here.","matchingTools":322,"monthlyUsersTop25":699,"toolsWith100PlusUsers":2,"toolsThatGainedMostUsersThisMonth":2,"leader":"Google Travel Hotel Prices","leaderUrl":"https://apify.com/vittuhy/google-travel-hotel-prices","leaderMonthlyUsers":522,"leaderFailRate30dPct":0,"checkedAt":"2026-10-23T22:20:00.000Z"}]}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string"},"description":"Product ideas or keywords to check, a few words each, for example [\"invoice ocr\", \"google hotels prices\"]. Up to 20 per call."}},"required":["keywords"],"additionalProperties":false},"example":{"keywords":["google hotels prices","invoice ocr"]}}}}}},"/pdf-extract":{"post":{"operationId":"pdf_extract","summary":"Text and tables from PDF links","description":"Extracts the text (plain or Markdown) and tables from up to 10 PDF links, with page count, title, author and dates, and flags PDFs that are scans with no text layer (use /ocr for those). Choose a page range and a length limit. $0.01 per PDF. Runs nerolabs/dataset-pdf-extract.","tags":["pdf"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"pdfUrl":{"type":"string"},"resolvedUrl":{"type":"string"},"extractStatus":{"type":"string"},"statusDetail":{},"hasTextLayer":{"type":"boolean"},"ocrRequired":{"type":"boolean"},"pageCount":{"type":"number"},"charCount":{"type":"number"},"wordCount":{"type":"number"},"tableCount":{"type":"number"},"fileSizeKb":{"type":"number"},"textTruncated":{"type":"boolean"},"pdfTitle":{"type":"string"},"pdfAuthor":{"type":"string"},"pdfSubject":{"type":"string"},"pdfCreator":{"type":"string"},"pdfProducer":{"type":"string"},"pdfCreatedOn":{"type":"string"},"pdfModifiedOn":{"type":"string"},"extractedAt":{"type":"string"},"text":{"type":"string"},"tables":{"type":"array"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"pdfUrl":"https://www.irs.gov/pub/irs-pdf/fw9.pdf","resolvedUrl":"https://www.irs.gov/pub/irs-pdf/fw9.pdf","extractStatus":"ok","statusDetail":null,"hasTextLayer":true,"ocrRequired":false,"pageCount":6,"charCount":5659,"wordCount":933,"tableCount":3,"fileSizeKb":138,"textTruncated":true,"pdfTitle":"Form W-9 (Rev. March 2024)","pdfAuthor":"SE:W:CAR:MP"}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pdfUrls":{"type":"array","description":"A plain list of PDF links, for a quick one-off run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns alongside the results."},"textFormat":{"type":"string","enum":["plain","markdown","none"],"default":"plain","description":"'Plain text' returns the reading-order text. 'Markdown' appends any detected tables as Markdown tables after the text, which is the friendliest shape for feeding an LLM. 'None' skips the text entirely, for runs that only want page counts, metadata or tables."},"extractTables":{"type":"boolean","default":true,"description":"Reconstruct tables from the position of the text on the page and return them as rows of cells. Plain text extraction loses table structure completely, so this is where most of the value is for invoices, statements and reports."},"minTableRows":{"type":"integer","default":3,"minimum":2,"maximum":50,"description":"Minimum rows before a grid counts as a table. The default of 3 is a deliberate noise floor, because printed forms are built from aligned two-line boxes and report dozens of meaningless two-row 'tables'. Lower it to 2 for invoices whose line items are one header plus one row."},"includePageText":{"type":"boolean","default":false,"description":"Add a 'pages' array with each page's text separately, on top of the combined text. Useful for citing a page number, and it makes rows considerably larger."},"firstPage":{"type":"integer","minimum":1,"description":"Start reading at this page (1 is the first). Leave empty to read from the beginning."},"lastPage":{"type":"integer","minimum":1,"description":"Stop reading after this page. Leave empty to read to the end. Handy for taking only the first few pages of long reports."},"maxCharsPerPdf":{"type":"integer","default":200000,"minimum":500,"maximum":2000000,"description":"Cuts the returned text at this many characters so one very long document cannot produce an unusable dataset row. The row records whether it was cut."}},"required":["pdfUrls"],"additionalProperties":false},"example":{"pdfUrls":["https://www.irs.gov/pub/irs-pdf/fw9.pdf"],"lastPage":1,"maxCharsPerPdf":2000}}}}}},"/ai/job-post-enrich":{"post":{"operationId":"job_enrich","summary":"Structured facts from job posts: salary, seniority, remote, visa, skills","description":"Reads up to 50 job post texts with AI and returns structured fields for each: salary range normalised to yearly and hourly in a currency, seniority, remote or hybrid, visa sponsorship, employment type, years of experience, and required skills. $0.003 per job. Runs nerolabs/job-post-enricher.","tags":["jobs"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.003000","max":"0.150000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"jobText":{"type":"string"},"enrichStatus":{"type":"string"},"enrichDetail":{},"jobSummary":{"type":"string"},"seniority":{"type":"string"},"workMode":{"type":"string"},"remoteScope":{},"contractType":{"type":"string"},"jobCategory":{"type":"string"},"salaryMinYearly":{"type":"number"},"salaryMaxYearly":{"type":"number"},"salaryYearlyCurrency":{"type":"string"},"salaryStatedText":{"type":"string"},"salaryStatedMin":{"type":"number"},"salaryStatedMax":{"type":"number"},"salaryStatedCurrency":{"type":"string"},"salaryStatedPeriod":{"type":"string"},"salarySource":{"type":"string"},"salaryConfidence":{"type":"string"},"visaSponsorship":{"type":"string"},"visaEvidence":{"type":"string"},"yearsExperienceMin":{"type":"number"},"yearsExperienceMax":{},"requiredSkills":{"type":"array"},"preferredSkills":{"type":"array"},"enrichedAt":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"jobText":"Senior Python Developer, London (hybrid). £70,000 to £85,000 plus bonus. 5+ years Django and AWS. Vi...","enrichStatus":"ok","enrichDetail":null,"jobSummary":"Senior Python Developer in London (hybrid) with 5+ years Django and AWS experience.","seniority":"senior","workMode":"hybrid","remoteScope":null,"contractType":"unknown","jobCategory":"software_engineering","salaryMinYearly":70000,"salaryMaxYearly":85000,"salaryYearlyCurrency":"GBP","salaryStatedText":"£70,000 to £85,000 plus bonus.","salaryStatedMin":70000}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jobTexts":{"type":"array","description":"A plain list of whole job posts pasted as text, one per entry, for a quick run with no file. Use a dataset, file or Google Sheet to keep your own columns alongside the AI fields."},"salaryCurrency":{"type":"string","default":"USD","description":"The currency for the yearly salary columns (salaryMinYearly, salaryMaxYearly), as a three-letter code: USD, GBP, EUR, CAD, AUD, INR and any other European Central Bank currency. Converted at the day's ECB reference rate. Enter 'original' to keep each job's own currency. The stated pay is always kept"},"hoursPerWeek":{"type":"integer","default":40,"minimum":1,"maximum":80,"description":"Used only to turn hourly pay into a yearly figure (hourly x hours x 52) when the job does not state its own weekly hours; stated hours (\"20 hours a week\") win. Daily pay uses 260 days a year, weekly 52 weeks, monthly 12 months."},"includeExtras":{"type":"boolean","default":false,"description":"Also return statedBenefits (up to 10), educationLevel (minimum stated) and languagesRequired. Same price per job; adds a little run time."}},"required":["jobTexts"],"additionalProperties":false},"example":{"jobTexts":["Senior Python Developer, London (hybrid). £70,000 to £85,000 plus bonus. 5+ years Django and AWS. Visa sponsorship available."],"salaryCurrency":"GBP"}}}}}},"/ai/review-analyze":{"post":{"operationId":"review_analyze","summary":"Customer review analysis: sentiment, complaints, themes, reply drafts","description":"Analyses up to 50 customer reviews with AI: sentiment, star-rating match, complaint and praise themes, urgency, and optionally a ready-to-post owner reply each, plus a business report with top issues. $0.002 per review, $0.005 per reply drafted, $0.03 per business report (output reviews_only skips it). Runs nerolabs/review-analyzer.","tags":["reviews"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.380000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"reviewText":{"type":"string"},"rowType":{"type":"string"},"reviewBusiness":{"type":"string"},"reviewStars":{},"reviewDate":{},"analysisStatus":{"type":"string"},"analysisDetail":{},"sentiment":{"type":"string"},"complaintCategories":{"type":"array"},"complaintThemes":{"type":"array"},"praiseCategories":{"type":"array"},"praiseThemes":{"type":"array"},"keyQuote":{"type":"string"},"reviewSummary":{"type":"string"},"needsAttention":{"type":"boolean"},"attentionReason":{},"reviewLanguage":{"type":"string"},"ownerReplied":{},"replyDraft":{},"replyStatus":{},"analyzedAt":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"reviewText":"Great food but we waited 40 minutes for a table and nobody apologised.","rowType":"review","reviewBusiness":"Example Bistro","reviewStars":null,"reviewDate":null,"analysisStatus":"ok","analysisDetail":null,"sentiment":"mixed","complaintCategories":["speed_and_waiting","staff_attitude"],"complaintThemes":["long wait time","no apology for wait"],"praiseCategories":["food_and_drink"],"praiseThemes":["great food"],"keyQuote":"Great food but we waited 40 minutes for a table and nobody apologised","reviewSummary":"The food was great but there was a long wait for a table and no apology from staff."}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reviewTexts":{"type":"array","description":"A plain list of reviews pasted as text, one per entry, for a quick run with no file. Use a dataset, file or Google Sheet to keep star ratings, dates and your own columns."},"businessName":{"type":"string","description":"Name to use when your data has no business column (for example pasted review texts or one company's export). Reviews are grouped into one report per business; with no business column and no name they are reported together as 'All reviews'."},"output":{"type":"string","enum":["reviews_and_reports","reviews_only","reports_only"],"default":"reviews_and_reports","description":"What to return. 'Reviews and business reports' gives one analysed row per review plus one report row per business (rowType tells them apart). 'Reviews only' skips the reports. 'Business reports only' returns just the report rows; every review is still analysed and charged, because the report is buil"},"themes":{"type":"array","description":"Leave empty and the AI names each complaint and praise point in a few plain words. Or give your own list (for example 'waiting time', 'staff', 'cleanliness', 'price') and every point is tagged with one of yours, so runs stay comparable month to month."},"replyDrafts":{"type":"boolean","default":false,"description":"Adds a ready-to-post owner reply to each review (charged per reply, on top of the review). Replies thank the customer, respond to their actual points, and never promise refunds, discounts or compensation, never admit fault and never invent facts. A draft that breaks a rule is rewritten once, then wi"},"replyTone":{"type":"string","enum":["warm","professional","short"],"default":"warm","description":"How the replies should sound."},"replySignOff":{"type":"string","description":"Added at the end of every reply, for example 'The Riverside Cafe team' or 'Sam, Owner'. Leave empty for no sign-off."},"replyContact":{"type":"string","description":"Optional line added, exactly as written, to replies to negative reviews and to mixed reviews of 3 stars or less, for example 'Please call us on 01234 567890 so we can put this right.' Without it, replies to complaints just invite the customer to get in touch, and never invent a phone number or email"},"replyLanguage":{"type":"string","default":"same","description":"Leave as 'same' to reply in each review's own language, or name one language (for example 'English' or 'Spanish') for every reply."}},"required":["reviewTexts"],"additionalProperties":false},"example":{"reviewTexts":["Great food but we waited 40 minutes for a table and nobody apologised."],"businessName":"Example Bistro","output":"reviews_only"}}}}}},"/ai/enrich":{"post":{"operationId":"ai_enrich","summary":"Run one AI instruction over every row of a list (classify, extract, summarise)","description":"Applies one plain-English AI instruction to every row of a JSON list (up to 50 rows), such as classify, extract, summarise or score, with {{field}} placeholders, and returns the new columns you define in outputFields for each row. Uses Claude Haiku. $0.002 per row. Runs nerolabs/dataset-ai-enrich.","tags":["ai"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.002000","max":"0.100000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"review":{"type":"string"},"sentiment":{"type":"string"},"aiModel":{"type":"string"},"aiError":{}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"id":1,"review":"Battery life is fantastic but the case feels cheap.","sentiment":"neutral","aiModel":"anthropic/claude-haiku-4.5","aiError":null}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","description":"A JSON array of records to enrich, for ad-hoc data instead of a dataset ID or file URL."},"prompt":{"type":"string","description":"Plain-English instruction applied to each row on its own. Use {{field}} placeholders to insert that row's values (dotted paths like {{address.city}} work). Only the fields you reference are sent to the model; if you reference none, every field is sent. Examples: classify, extract a value, score 1 to"},"outputFields":{"type":"array","description":"The new columns the model must fill in for every row, as a JSON list of {\"name\", \"type\", \"description\"}. Types: string (default), number, boolean, array, object. The description tells the model exactly what goes in the column (allowed values, units, language). Leave empty to get one free-text column"},"systemPrompt":{"type":"string","description":"Optional background the model should know for every row: your industry, the categories you use, the language to answer in, edge-case rules."},"skipIfEmpty":{"type":"boolean","default":true,"description":"On (default): a row with nothing in any {{field}} the instruction uses is written out with 'aiSkipped: true' and never sent to the model or charged."},"includeOriginalFields":{"type":"boolean","default":true,"description":"On (default): each output row is the original row plus the new columns. Off: only the new columns (plus aiModel/aiError)."}},"required":["data","prompt"],"additionalProperties":false},"example":{"data":[{"id":1,"review":"Battery life is fantastic but the case feels cheap."}],"prompt":"Classify the sentiment of this review: {{review}}","outputFields":[{"name":"sentiment","type":"string","description":"positive, neutral or negative"}]}}}}}},"/transcribe":{"post":{"operationId":"transcribe","summary":"Transcribe audio and video links to text","description":"Transcribes up to 5 audio or video links (MP3, WAV, M4A, MP4 and more; Google Drive and Dropbox links work) to text, optionally with speakers, timestamps and SRT subtitles. Priced per minute allowance: files x maxMinutesPerFile (default 5, at most 10) x $0.01 ($0.02 in detailed mode). Runs nerolabs/bulk-transcription; can take a minute or two.","tags":["transcription"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.010000","max":"1.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"sourceUrl":{"type":"string"},"resolvedUrl":{"type":"string"},"transcriptStatus":{"type":"string"},"statusDetail":{},"mode":{"type":"string"},"mediaType":{"type":"string"},"durationSec":{"type":"number"},"durationMinutes":{"type":"number"},"minutesCharged":{"type":"number"},"truncated":{"type":"boolean"},"speakerCount":{},"wordCount":{"type":"number"},"fileSizeMb":{"type":"number"},"processingMs":{"type":"number"},"transcribedAt":{"type":"string"},"text":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"sourceUrl":"https://nerolabs-samples.nerolabs.workers.dev/sample-call-plumber.mp3","resolvedUrl":"https://nerolabs-samples.nerolabs.workers.dev/sample-call-plumber.mp3","transcriptStatus":"ok","statusDetail":null,"mode":"text","mediaType":"audio","durationSec":45,"durationMinutes":0.75,"minutesCharged":1,"truncated":false,"speakerCount":null,"wordCount":117,"fileSizeMb":0.26,"processingMs":3222}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaUrls":{"type":"array","description":"A plain list of direct links to audio or video files (MP3, WAV, M4A, MP4, MOV, WebM, OGG, FLAC and more; Google Drive and Dropbox share links work), for a quick run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns alongside each transcript."},"mode":{"type":"string","enum":["text","detailed"],"default":"text","description":"'Plain text' is the cheapest: one block of text per file. 'Speakers and timestamps' labels who spoke (Speaker A, Speaker B), gives start and end times, and writes SRT subtitles, for calls, interviews, meetings and podcasts. Each is charged per started minute of audio at its own rate."},"language":{"type":"string","description":"Two-letter code of the spoken language (en, es, fr, de, pt, it, nl, pl, ja, zh and about 50 more). Leave empty to detect it automatically; setting it helps accuracy on short or noisy clips."},"vocabulary":{"type":"string","description":"Plain text mode only. Names, brands or jargon the recording uses, for example 'NICEIC, consumer unit, Part P, Brightwell'. Helps the model spell them right."},"includeSrt":{"type":"boolean","default":true,"description":"Speakers mode only. Adds an 'srt' column with ready-to-use subtitles for the recording."},"includeSegments":{"type":"boolean","default":false,"description":"Speakers mode only. Adds a 'segments' array: one entry per speaker turn with speaker, start, end and text. Useful for feeding an AI agent or building your own player."},"maxMinutesPerFile":{"type":"integer","default":120,"minimum":1,"maximum":600,"description":"Only the first this-many minutes of each file are transcribed and charged. Your cost ceiling per file: a 6-hour livestream cannot run up a bill you did not expect."}},"required":["mediaUrls"],"additionalProperties":false},"example":{"mediaUrls":["https://nerolabs-samples.nerolabs.workers.dev/sample-call-plumber.mp3"],"maxMinutesPerFile":2}}}}}},"/ai/call-score":{"post":{"operationId":"call_score","summary":"Score a sales or reception call recording with AI","description":"Transcribes up to 5 call recordings and scores each with AI: greeting, needs found, booking or sale made, objections handled, missed opportunities, sentiment and a coaching summary, plus your own questions. Priced per minute allowance: files x maxMinutesPerFile (default 5, at most 10) x $0.04. Runs nerolabs/call-score; can take a minute or two.","tags":["call scoring"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.040000","max":"2.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"sourceUrl":{"type":"string"},"callStatus":{"type":"string"},"statusDetail":{},"handlingScore":{"type":"number"},"outcome":{"type":"string"},"booked":{"type":"boolean"},"callType":{"type":"string"},"leadQuality":{"type":"string"},"urgency":{"type":"string"},"serviceRequested":{"type":"string"},"callerName":{"type":"string"},"callerContact":{},"location":{"type":"string"},"summary":{"type":"string"},"unansweredQuestions":{"type":"array"},"objections":{"type":"array"},"missedOpportunities":{"type":"array"},"callerSentiment":{"type":"string"},"scoreReasons":{"type":"array"},"followUpAction":{"type":"string"},"agentSpeaker":{"type":"string"},"resolvedUrl":{"type":"string"},"mediaType":{"type":"string"},"durationSec":{"type":"number"},"durationMinutes":{"type":"number"},"minutesCharged":{"type":"number"},"truncated":{"type":"boolean"},"speakerCount":{"type":"number"},"wordCount":{"type":"number"},"fileSizeMb":{"type":"number"},"processingMs":{"type":"number"},"transcribedAt":{"type":"string"},"transcript":{"type":"string"}}}},"count":{"type":"number"},"_example_note":{"type":"string"}}},"example":{"rows":[{"sourceUrl":"https://nerolabs-samples.nerolabs.workers.dev/sample-call-electrician.mp3","callStatus":"ok","statusDetail":null,"handlingScore":7,"outcome":"callback_arranged","booked":false,"callType":"emergency","leadQuality":"hot","urgency":"emergency","serviceRequested":"Partial loss of power; trip switch keeps tripping (kitchen and downstairs sockets)","callerName":"Mark","callerContact":null,"location":"LS6 2AB","summary":"Mark called reporting no power to half the house (kitchen and downstairs sockets) with a trip switch..."}],"count":1,"_example_note":"Real output, trimmed: long lists cut to their first items, fields and text shortened."}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recordingUrls":{"type":"array","description":"A plain list of direct links to call recordings (MP3, WAV, M4A, MP4 and more; Google Drive and Dropbox share links work), for a quick run with no spreadsheet. Use the dataset, file or Google Sheet inputs above to keep your own columns alongside each score."},"businessContext":{"type":"string","description":"A few lines on who answers these calls and what a good call looks like: the trade or business, area covered, services, whether prices are given on the phone, and what the receptionist should do (book a visit, take name, number and postcode, flag emergencies). The review judges every call against thi"},"customQuestions":{"type":"array","description":"Up to 10 extra questions to answer for every call, for example 'Did the receptionist mention the free quote?' or 'Which competitor did the caller mention?'. Answers appear in 'customAnswers' and do not change the price."},"language":{"type":"string","description":"Two-letter code of the spoken language (en, es, fr, de, pt, it, nl, pl, ja, zh and about 50 more). Leave empty to detect it automatically; setting it helps accuracy on short or noisy clips."},"includeTranscript":{"type":"boolean","default":true,"description":"Add the full call transcript, one line per speaker turn, so any score can be checked against what was actually said. Turn off for scores only."},"includeSegments":{"type":"boolean","default":false,"description":"Speakers mode only. Adds a 'segments' array: one entry per speaker turn with speaker, start, end and text. Useful for feeding an AI agent or building your own player."},"maxMinutesPerFile":{"type":"integer","default":120,"minimum":1,"maximum":600,"description":"Only the first this-many minutes of each file are transcribed and charged. Your cost ceiling per file: a 6-hour livestream cannot run up a bill you did not expect."}},"required":["recordingUrls"],"additionalProperties":false},"example":{"recordingUrls":["https://nerolabs-samples.nerolabs.workers.dev/sample-call-electrician.mp3"],"maxMinutesPerFile":2,"businessContext":"An electrician taking calls from homeowners"}}}}}},"/google-sheets":{"post":{"operationId":"google_sheets","summary":"Write rows to a Google Sheet (append, replace, update by key) or read a tab","description":"Writes up to 1,000 JSON rows to a Google Sheet (append, replace, or update rows matched on keyColumn, adding new keys) or reads a tab back as JSON (mode import). No OAuth: share the sheet with nerolabs-sheets@nero-labs-sheets.iam.gserviceaccount.com as Editor. Keeps column order, adds new fields on the right, waits out Google rate limits. $0.005 per call plus $0.0002 per row sent, or $0.0001 per row allowed on import. Runs nerolabs/google-sheets-export.","tags":["google sheets"],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.005000","max":"0.205000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string"},"mode":{"type":"string"},"message":{"type":"string"},"tabs":{"type":"array","items":{"type":"string"}},"rowsRead":{"type":"integer"},"rowsWritten":{"type":"integer"},"rowsAppended":{"type":"integer"},"rowsUpdated":{"type":"integer"},"rowsImported":{"type":"integer"},"rowsNotWritten":{"type":"integer"},"rowsSkippedNoKey":{"type":"integer"},"columnsAdded":{"type":"array","items":{"type":"string"}},"totalColumns":{"type":"integer"},"googleRequests":{"type":"integer"},"retries":{"type":"integer"},"rateLimitHits":{"type":"integer"},"secondsWaitedForGoogle":{"type":"integer"},"rolledOverTo":{"type":"array","items":{"type":"string"}},"truncatedCells":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}},"spreadsheetUrl":{"type":"string"},"spreadsheetTitle":{"type":"string"},"finishedAt":{"type":"string"},"unwrittenRowsFile":{"type":"string"}}}},"count":{"type":"integer"}}},"example":{"rows":[{"status":"ok","mode":"replace","message":"Wrote 4 row(s) (4 added, 0 updated) to Nero Labs Google Sheets Export Demo / Sheet1.","tabs":["Nero Labs Google Sheets Export Demo / Sheet1"],"rowsRead":4,"rowsWritten":4,"rowsAppended":4,"rowsUpdated":0,"rowsImported":0,"rowsNotWritten":0,"rowsSkippedNoKey":0,"columnsAdded":[],"totalColumns":7,"googleRequests":3,"retries":0,"rateLimitHits":0,"secondsWaitedForGoogle":0,"rolledOverTo":[],"truncatedCells":0,"warnings":["The demo sheet is always replaced (never appended to). Paste your own sheet link to append or update."],"spreadsheetUrl":"https://docs.google.com/spreadsheets/d/1gV5ZFKQsKgake9aKTTQRaPRwmA7yS4BZySrmzGqNVAg/edit","spreadsheetTitle":"Nero Labs Google Sheets Export Demo","finishedAt":"2026-10-29T16:00:29.900Z"}],"count":1}}}},"400":{"description":"Bad input. Body: {error, message}. Not charged."},"402":{"description":"Payment Required. PAYMENT-REQUIRED header holds the x402 v2 payment requirements."},"413":{"description":"Too many rows or items for one call. Split the list. Refused before payment."},"502":{"description":"The source or job failed (site blocked, run failed, no results). Body: {error, message}. Not charged."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spreadsheet":{"type":"string","description":"Google Sheet link or ID. The sheet must be shared with nerolabs-sheets@nero-labs-sheets.iam.gserviceaccount.com as an Editor (no OAuth)."},"mode":{"type":"string","enum":["append","replace","update","import"],"default":"append","description":"append: add rows after the last row with data. replace: overwrite the tab, then remove old rows left below. update: match rows on keyColumn and change only the fields sent, adding rows for new keys. import: read the tab back as JSON rows (first row = column names)."},"rows":{"type":"array","items":{"type":"object"},"description":"Rows to write (append, replace, update), as JSON objects; keys become columns. Up to 1,000 per call. Nested objects become parent/child columns."},"sheetName":{"type":"string","description":"Tab name. Created if missing. Default: the tab in the link, or the first tab."},"keyColumn":{"type":"string","description":"Update mode: the field that identifies a row, such as id, url, sku or email."},"addNewRows":{"type":"boolean","default":true,"description":"Update mode: add rows for keys not yet in the sheet (default true)."},"columns":{"type":"array","items":{"type":"string"},"description":"Optional: only these fields, in this order."},"parseValues":{"type":"boolean","default":false,"description":"true: values are entered as if typed (dates, numbers, =formulas). false (default): written exactly as sent."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":200,"description":"Import mode: rows to read (default 200, at most 1,000)."},"offset":{"type":"integer","minimum":0,"description":"Import mode: rows to skip first."}},"required":["spreadsheet"],"additionalProperties":false},"example":{"spreadsheet":"https://docs.google.com/spreadsheets/d/1gV5ZFKQsKgake9aKTTQRaPRwmA7yS4BZySrmzGqNVAg/edit","mode":"append","sheetName":"Leads","rows":[{"company":"Northwind Traders","city":"London","rating":4.6}]}}}}}}}}