{"openapi":"3.1.0","info":{"title":"shokuweb preview request","version":"1.0.0","description":"Submit a business owner's request for a free website preview through the same protected intake as the /build form. A successful response acknowledges intake; it does not return a preview link. No outbound contact is triggered by this endpoint."},"servers":[{"url":"https://www.shokuweb.com"}],"paths":{"/build/api/intake":{"post":{"operationId":"requestWebsitePreview","summary":"Request a free website preview for a business owner","description":"The owner must complete a fresh Cloudflare Turnstile challenge on /build and provide its single-use token as challenge. Tokens expire after five minutes. The endpoint validates the token server-side before its rate limits and store access. Limits: 10 requests per email per minute and 120 requests total per minute; both may return 429. Do not use this endpoint to automate submissions without the owner's request. The same thank-you answer is returned for a suppressed or already-known identity.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessName","vertical","locality","country","phone","email","challenge"],"properties":{"businessName":{"type":"string","maxLength":120},"vertical":{"type":"string","enum":["hvac","plumbing","electrical","landscaping","auto_repair","tire_shop","cleaning","pool_services","stone_masonry","kitchen_bath","roofing","general_contractor","clinics","home_care","other"]},"locality":{"type":"string","maxLength":120},"country":{"type":"string","enum":["US","CA","GB","AU","DE","IE","NZ"]},"region":{"type":"string","maxLength":120,"description":"Required for countries with states or provinces. Use the code shown on /build."},"phone":{"type":"string","maxLength":40,"description":"A callable number with area code."},"email":{"type":"string","maxLength":254,"format":"email"},"ownerName":{"type":"string","maxLength":120},"website":{"type":"string","maxLength":500},"socials":{"type":"string","maxLength":1000,"description":"One URL per line."},"street":{"type":"string","maxLength":200},"postcode":{"type":"string","maxLength":20},"tagline":{"type":"string","maxLength":300},"emergency":{"type":"string","maxLength":300},"services":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"blurb":{"type":"string","maxLength":500}}}},"hours":{"type":"array","maxItems":14,"items":{"type":"object","properties":{"days":{"type":"string","maxLength":40},"opens":{"type":"string","maxLength":40},"closes":{"type":"string","maxLength":40}}}},"challenge":{"type":"string","maxLength":2048,"description":"Fresh Turnstile token obtained by the owner on /build; single use."}}}}}},"responses":{"200":{"description":"Request accepted or safely ignored for an existing or suppressed identity; the answer never reveals which.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true}}}}}},"400":{"description":"Malformed request body."},"403":{"description":"Turnstile token missing, invalid, expired or already used."},"413":{"description":"Request body exceeds 32 KiB."},"422":{"description":"A named intake field is missing or invalid."},"429":{"description":"A rate limit was reached."},"503":{"description":"Required security binding or store unavailable."}}}}}}