{"openapi":"3.0.3","info":{"title":"Vitki Data Real Estate API","description":"Enriched US real estate property data — search, filter, and access property listings with 48 government enrichment fields.","version":"1.2.0","contact":{"name":"Vitki Data","url":"https://vitkidata.com","email":"contact@vitkidata.com"},"license":{"name":"Proprietary"}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"API key for authenticated access. Obtain via /api/v1/signup (free) or /api/v1/checkout/create (paid). Format: vtk_live_..."},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT session token obtained from /api/v1/auth/login. Used for dashboard access."}},"schemas":{}},"paths":{"/api/v1/auth/register":{"post":{"tags":["Auth"],"description":"Start account registration. Sends a verification code to the email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"password":{"type":"string","minLength":8,"maxLength":128},"captchaToken":{"type":"string"}},"required":["email","password"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/register/verify":{"post":{"tags":["Auth"],"description":"Complete registration by verifying email code. Returns session tokens.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"code":{"type":"string","minLength":6,"maxLength":6}},"required":["email","code"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"email":{"type":"string"},"tier":{"type":"string"}},"required":["accessToken","refreshToken","expiresIn","email","tier"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Auth"],"description":"Login with email and password. Returns access/refresh tokens, or a 2FA challenge if 2FA is enabled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"password":{"type":"string","minLength":1},"captchaToken":{"type":"string"}},"required":["email","password"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"email":{"type":"string"},"tier":{"type":"string"},"requires2fa":{"type":"boolean"},"challengeToken":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["Auth"],"description":"Exchange a refresh token for a new access + refresh token pair (token rotation).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1}},"required":["refreshToken"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"email":{"type":"string"},"tier":{"type":"string"}},"required":["accessToken","refreshToken","expiresIn","email","tier"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["Auth"],"description":"Revoke the refresh token (logout).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1}},"required":["refreshToken"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["Auth"],"description":"Send a password reset code to the email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["Auth"],"description":"Reset password using the emailed code.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"code":{"type":"string","minLength":6,"maxLength":6},"password":{"type":"string","minLength":8,"maxLength":128}},"required":["email","code","password"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/set-password":{"post":{"tags":["Auth"],"description":"Set a password for an existing account that was created via API key signup. Requires API key auth.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":8,"maxLength":128}},"required":["password"]}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/2fa/setup":{"post":{"tags":["Auth"],"description":"Generate a TOTP secret and QR code. Requires authentication. Does not enable 2FA yet.","security":[{"bearerAuth":[]},{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"secret":{"type":"string"},"qrCode":{"type":"string"},"otpauthUrl":{"type":"string"}},"required":["secret","qrCode","otpauthUrl"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/2fa/enable":{"post":{"tags":["Auth"],"description":"Verify TOTP code and enable 2FA. Returns recovery codes (shown once).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":6,"maxLength":6}},"required":["code"]}}}},"security":[{"bearerAuth":[]},{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"recoveryCodes":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}},"required":["enabled","recoveryCodes","message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/2fa/disable":{"post":{"tags":["Auth"],"description":"Disable 2FA. Requires password confirmation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":1}},"required":["password"]}}}},"security":[{"bearerAuth":[]},{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"message":{"type":"string"}},"required":["enabled","message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/2fa/verify":{"post":{"tags":["Auth"],"description":"Complete login by providing TOTP code or recovery code after 2FA challenge.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"challengeToken":{"type":"string","minLength":1},"code":{"type":"string","minLength":1}},"required":["challengeToken","code"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"email":{"type":"string"},"tier":{"type":"string"}},"required":["accessToken","refreshToken","expiresIn","email","tier"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/auth/2fa/status":{"get":{"tags":["Auth"],"description":"Check if 2FA is enabled for the authenticated user.","security":[{"bearerAuth":[]},{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"recoveryCodesRemaining":{"type":"number"}},"required":["enabled","recoveryCodesRemaining"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/signup":{"post":{"tags":["Billing"],"description":"Start free tier signup. Sends a 6-digit verification code to the email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"captchaToken":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/signup/verify":{"post":{"tags":["Billing"],"description":"Complete free tier signup by verifying email code. Returns API key (shown once).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"code":{"type":"string","minLength":6,"maxLength":6}},"required":["email","code"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"apiKey":{"type":"string"},"email":{"type":"string"},"tier":{"type":"string"},"message":{"type":"string"}},"required":["apiKey","email","tier","message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/checkout/create":{"post":{"tags":["Billing"],"description":"Create a Stripe Checkout Session for subscription signup","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"tier":{"type":"string","enum":["starter","pro","enterprise"]}},"required":["email","tier"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"sessionId":{"type":"string"}},"required":["url","sessionId"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/checkout/success":{"get":{"tags":["Billing"],"description":"Retrieve API key after successful checkout","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"session_id","required":true},{"schema":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"in":"query","name":"email","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"apiKey":{"nullable":true,"type":"string"},"email":{"nullable":true,"type":"string"},"tier":{"type":"string"},"message":{"type":"string"}},"required":["apiKey","email","tier","message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}}}}},"/api/v1/billing/portal":{"post":{"tags":["Billing"],"description":"Create a Stripe Customer Portal session","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/checkout/payg":{"post":{"tags":["Billing"],"description":"Create a Stripe Checkout Session for a one-off PAYG credit pack purchase. Requires authentication.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pack":{"type":"string","enum":["pack_500","pack_2000","pack_5000"]}},"required":["pack"]}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"sessionId":{"type":"string"}},"required":["url","sessionId"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/checkout/payg/success":{"get":{"tags":["Billing"],"description":"PAYG checkout success confirmation page.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"session_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"credits":{"type":"number"},"message":{"type":"string"}},"required":["credits","message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}}}}},"/api/v1/area/preview/{zip}":{"get":{"tags":["Consumer Reports"],"description":"Free area intelligence preview (grades + stats) for a ZIP code","parameters":[{"schema":{"type":"string","pattern":"^\\d{5}$"},"in":"path","name":"zip","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{},"meta":{"type":"object","properties":{"timestamp":{"type":"string"},"cached":{"type":"boolean"}},"required":["timestamp","cached"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/area/checkout":{"post":{"tags":["Consumer Reports"],"description":"Create a Stripe Checkout session for an area report purchase","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"zip":{"type":"string","pattern":"^\\d{5}$"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["zip","email"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string"},"sessionId":{"type":"string"}},"required":["url","sessionId"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/area/report/status":{"get":{"tags":["Consumer Reports"],"description":"Check the generation status of an area report by Stripe session ID","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"session_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string"},"downloadUrl":{"nullable":true,"type":"string"},"error":{"nullable":true,"type":"string"}},"required":["status","downloadUrl","error"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}}}}},"/api/v1/area/download/{token}":{"get":{"tags":["Consumer Reports"],"description":"Download a completed area report PDF","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/account":{"get":{"tags":["Account"],"description":"Get your account information including tier and rate limits","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"email":{"type":"string"},"tier":{"type":"string"},"tierName":{"type":"string"},"subscriptionStatus":{"type":"string"},"trialEndsAt":{"nullable":true,"type":"string"},"apiKeyPrefix":{"nullable":true,"type":"string"},"rateLimitPerMinute":{"type":"number"},"rateLimitPerMonth":{"type":"number"},"paygCredits":{"type":"number"}},"required":["email","tier","tierName","subscriptionStatus","trialEndsAt","apiKeyPrefix","rateLimitPerMinute","rateLimitPerMonth","paygCredits"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/usage":{"get":{"tags":["Account"],"description":"Get your current month API usage statistics","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tier":{"type":"string"},"rateLimitPerMinute":{"type":"number"},"rateLimitPerMonth":{"type":"number"},"currentMonthUsage":{"type":"number"},"currentMonthRemaining":{"type":"number"},"billingPeriod":{"type":"string"},"paygCredits":{"type":"number"}},"required":["tier","rateLimitPerMinute","rateLimitPerMonth","currentMonthUsage","currentMonthRemaining","billingPeriod","paygCredits"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/keys":{"get":{"tags":["Account"],"description":"List your API keys (prefix only — full key is never stored)","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keyPrefix":{"type":"string"},"name":{"type":"string"},"isActive":{"type":"boolean"},"lastUsedAt":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","keyPrefix","name","isActive","lastUsedAt","createdAt"],"additionalProperties":false}},"maxKeys":{"type":"number"}},"required":["keys","maxKeys"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"tags":["Account"],"description":"Generate a new API key (returns raw key once — store it securely)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"default":"Default","type":"string","minLength":1,"maxLength":64}}}}}},"security":[{"apiKey":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"apiKey":{"type":"string"},"keyPrefix":{"type":"string"},"name":{"type":"string"}},"required":["id","apiKey","keyPrefix","name"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/requests":{"get":{"tags":["Account"],"description":"View your recent API request history for debugging","parameters":[{"schema":{"default":50,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false},{"schema":{"default":"all","type":"string","enum":["success","error","all"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","enum":["GET","POST","PUT","DELETE","PATCH"]},"in":"query","name":"method","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"statusCode":{"type":"number"},"responseTimeMs":{"type":"number"},"propertiesReturned":{"type":"number"},"errorCode":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","method","path","statusCode","responseTimeMs","propertiesReturned","errorCode","createdAt"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["requests","total","limit","offset"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/keys/{keyId}":{"delete":{"tags":["Account"],"description":"Revoke an API key","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"keyId","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/properties":{"get":{"tags":["Properties"],"description":"Search properties with filters. Returns paginated results tier-gated by your subscription.","parameters":[{"schema":{"type":"string","minLength":2,"maxLength":2},"in":"query","name":"state","required":false},{"schema":{"type":"string","maxLength":100},"in":"query","name":"city","required":false},{"schema":{"type":"string","maxLength":10},"in":"query","name":"zip","required":false},{"schema":{"type":"string","enum":["single_family","condo","townhouse","multi_family","land","manufactured","apartment","other"]},"in":"query","name":"property_type","required":false},{"schema":{"type":"string","enum":["for_sale","pending","sold","for_rent","off_market","coming_soon"]},"in":"query","name":"listing_status","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_price","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_price","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_beds","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_beds","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_sqft","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_sqft","required":false},{"schema":{"type":"integer","minimum":1600,"maximum":9007199254740991},"in":"query","name":"min_year_built","required":false},{"schema":{"type":"string","enum":["high","medium","low","single_source"]},"in":"query","name":"confidence","required":false},{"schema":{"default":"json","type":"string","enum":["json","csv","ndjson","geojson","xlsx"]},"in":"query","name":"format","required":false},{"schema":{"default":25,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"address":{"type":"object","properties":{"street":{"type":"string"},"unit":{"nullable":true,"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"county":{"nullable":true,"type":"string"}},"required":["street","unit","city","state","zip","county"],"additionalProperties":false},"coordinates":{"nullable":true,"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":false},"price":{"type":"object","properties":{"listing":{"nullable":true,"type":"number"},"sold":{"nullable":true,"type":"number"},"per_sqft":{"nullable":true,"type":"number"}},"required":["listing","sold","per_sqft"],"additionalProperties":false},"details":{"type":"object","properties":{"beds":{"nullable":true,"type":"number"},"baths":{"nullable":true,"type":"number"},"sqft":{"nullable":true,"type":"number"},"lot_sqft":{"nullable":true,"type":"number"},"year_built":{"nullable":true,"type":"number"},"property_type":{"nullable":true,"type":"string"},"stories":{"nullable":true,"type":"number"},"garage":{"nullable":true,"type":"number"},"hoa_monthly":{"nullable":true,"type":"number"}},"required":["beds","baths","sqft","lot_sqft","year_built","property_type","stories","garage","hoa_monthly"],"additionalProperties":false},"listing":{"type":"object","properties":{"status":{"nullable":true,"type":"string"},"days_on_market":{"nullable":true,"type":"number"},"date_listed":{"nullable":true,"type":"string"},"date_sold":{"nullable":true,"type":"string"},"mls_id":{"nullable":true,"type":"string"}},"required":["status","days_on_market","date_listed","date_sold","mls_id"],"additionalProperties":false},"description":{"nullable":true,"type":"string"},"listing_url":{"nullable":true,"type":"string"},"freshness":{"type":"object","properties":{"last_verified":{"type":"string"},"age_hours":{"type":"number"},"is_stale":{"type":"boolean"}},"required":["last_verified","age_hours","is_stale"],"additionalProperties":false},"geographic_ids":{"type":"object","properties":{"census_tract":{"nullable":true,"type":"string"},"fips_code":{"nullable":true,"type":"string"},"cbsa_code":{"nullable":true,"type":"string"},"placekey":{"nullable":true,"type":"string"}},"required":["census_tract","fips_code","cbsa_code","placekey"],"additionalProperties":false},"data_summary":{"type":"object","properties":{"overall_confidence":{"nullable":true,"type":"string"},"source_count":{"type":"number"},"completeness_score":{"nullable":true,"type":"number"},"source_tier":{"nullable":true,"type":"string"}},"required":["overall_confidence","source_count","completeness_score","source_tier"],"additionalProperties":false},"price_history":{},"tax_history":{},"tax_year_coverage":{},"government_data":{},"data_quality":{},"sources":{},"validation_warnings":{},"enrichment_failures":{},"raw_record":{}},"required":["id","address","coordinates","price","details","listing","description","listing_url","freshness","geographic_ids","data_summary"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["properties","total","limit","offset"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/properties/{id}":{"get":{"tags":["Properties"],"description":"Get full property detail by ID. Government data requires Pro tier.","parameters":[{"schema":{"default":"json","type":"string","enum":["json","csv","ndjson","geojson","xlsx"]},"in":"query","name":"format","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"property":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"address":{"type":"object","properties":{"street":{"type":"string"},"unit":{"nullable":true,"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"county":{"nullable":true,"type":"string"}},"required":["street","unit","city","state","zip","county"],"additionalProperties":false},"coordinates":{"nullable":true,"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":false},"price":{"type":"object","properties":{"listing":{"nullable":true,"type":"number"},"sold":{"nullable":true,"type":"number"},"per_sqft":{"nullable":true,"type":"number"}},"required":["listing","sold","per_sqft"],"additionalProperties":false},"details":{"type":"object","properties":{"beds":{"nullable":true,"type":"number"},"baths":{"nullable":true,"type":"number"},"sqft":{"nullable":true,"type":"number"},"lot_sqft":{"nullable":true,"type":"number"},"year_built":{"nullable":true,"type":"number"},"property_type":{"nullable":true,"type":"string"},"stories":{"nullable":true,"type":"number"},"garage":{"nullable":true,"type":"number"},"hoa_monthly":{"nullable":true,"type":"number"}},"required":["beds","baths","sqft","lot_sqft","year_built","property_type","stories","garage","hoa_monthly"],"additionalProperties":false},"listing":{"type":"object","properties":{"status":{"nullable":true,"type":"string"},"days_on_market":{"nullable":true,"type":"number"},"date_listed":{"nullable":true,"type":"string"},"date_sold":{"nullable":true,"type":"string"},"mls_id":{"nullable":true,"type":"string"}},"required":["status","days_on_market","date_listed","date_sold","mls_id"],"additionalProperties":false},"description":{"nullable":true,"type":"string"},"listing_url":{"nullable":true,"type":"string"},"freshness":{"type":"object","properties":{"last_verified":{"type":"string"},"age_hours":{"type":"number"},"is_stale":{"type":"boolean"}},"required":["last_verified","age_hours","is_stale"],"additionalProperties":false},"geographic_ids":{"type":"object","properties":{"census_tract":{"nullable":true,"type":"string"},"fips_code":{"nullable":true,"type":"string"},"cbsa_code":{"nullable":true,"type":"string"},"placekey":{"nullable":true,"type":"string"}},"required":["census_tract","fips_code","cbsa_code","placekey"],"additionalProperties":false},"data_summary":{"type":"object","properties":{"overall_confidence":{"nullable":true,"type":"string"},"source_count":{"type":"number"},"completeness_score":{"nullable":true,"type":"number"},"source_tier":{"nullable":true,"type":"string"}},"required":["overall_confidence","source_count","completeness_score","source_tier"],"additionalProperties":false},"price_history":{},"tax_history":{},"tax_year_coverage":{},"government_data":{},"data_quality":{},"sources":{},"validation_warnings":{},"enrichment_failures":{},"raw_record":{}},"required":["id","address","coordinates","price","details","listing","description","listing_url","freshness","geographic_ids","data_summary"],"additionalProperties":false}},"required":["property"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/search":{"get":{"tags":["Properties"],"description":"Full-text search across property addresses and descriptions.","parameters":[{"schema":{"type":"string","minLength":2,"maxLength":2},"in":"query","name":"state","required":false},{"schema":{"type":"string","maxLength":100},"in":"query","name":"city","required":false},{"schema":{"type":"string","maxLength":10},"in":"query","name":"zip","required":false},{"schema":{"type":"string","enum":["single_family","condo","townhouse","multi_family","land","manufactured","apartment","other"]},"in":"query","name":"property_type","required":false},{"schema":{"type":"string","enum":["for_sale","pending","sold","for_rent","off_market","coming_soon"]},"in":"query","name":"listing_status","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_price","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_price","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_beds","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_beds","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"min_sqft","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"max_sqft","required":false},{"schema":{"type":"integer","minimum":1600,"maximum":9007199254740991},"in":"query","name":"min_year_built","required":false},{"schema":{"type":"string","enum":["high","medium","low","single_source"]},"in":"query","name":"confidence","required":false},{"schema":{"default":"json","type":"string","enum":["json","csv","ndjson","geojson","xlsx"]},"in":"query","name":"format","required":false},{"schema":{"default":25,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false},{"schema":{"type":"string","minLength":1,"maxLength":500},"in":"query","name":"q","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"address":{"type":"object","properties":{"street":{"type":"string"},"unit":{"nullable":true,"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"county":{"nullable":true,"type":"string"}},"required":["street","unit","city","state","zip","county"],"additionalProperties":false},"coordinates":{"nullable":true,"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":false},"price":{"type":"object","properties":{"listing":{"nullable":true,"type":"number"},"sold":{"nullable":true,"type":"number"},"per_sqft":{"nullable":true,"type":"number"}},"required":["listing","sold","per_sqft"],"additionalProperties":false},"details":{"type":"object","properties":{"beds":{"nullable":true,"type":"number"},"baths":{"nullable":true,"type":"number"},"sqft":{"nullable":true,"type":"number"},"lot_sqft":{"nullable":true,"type":"number"},"year_built":{"nullable":true,"type":"number"},"property_type":{"nullable":true,"type":"string"},"stories":{"nullable":true,"type":"number"},"garage":{"nullable":true,"type":"number"},"hoa_monthly":{"nullable":true,"type":"number"}},"required":["beds","baths","sqft","lot_sqft","year_built","property_type","stories","garage","hoa_monthly"],"additionalProperties":false},"listing":{"type":"object","properties":{"status":{"nullable":true,"type":"string"},"days_on_market":{"nullable":true,"type":"number"},"date_listed":{"nullable":true,"type":"string"},"date_sold":{"nullable":true,"type":"string"},"mls_id":{"nullable":true,"type":"string"}},"required":["status","days_on_market","date_listed","date_sold","mls_id"],"additionalProperties":false},"description":{"nullable":true,"type":"string"},"listing_url":{"nullable":true,"type":"string"},"freshness":{"type":"object","properties":{"last_verified":{"type":"string"},"age_hours":{"type":"number"},"is_stale":{"type":"boolean"}},"required":["last_verified","age_hours","is_stale"],"additionalProperties":false},"geographic_ids":{"type":"object","properties":{"census_tract":{"nullable":true,"type":"string"},"fips_code":{"nullable":true,"type":"string"},"cbsa_code":{"nullable":true,"type":"string"},"placekey":{"nullable":true,"type":"string"}},"required":["census_tract","fips_code","cbsa_code","placekey"],"additionalProperties":false},"data_summary":{"type":"object","properties":{"overall_confidence":{"nullable":true,"type":"string"},"source_count":{"type":"number"},"completeness_score":{"nullable":true,"type":"number"},"source_tier":{"nullable":true,"type":"string"}},"required":["overall_confidence","source_count","completeness_score","source_tier"],"additionalProperties":false},"price_history":{},"tax_history":{},"tax_year_coverage":{},"government_data":{},"data_quality":{},"sources":{},"validation_warnings":{},"enrichment_failures":{},"raw_record":{}},"required":["id","address","coordinates","price","details","listing","description","listing_url","freshness","geographic_ids","data_summary"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"query":{"type":"string"}},"required":["properties","total","limit","offset","query"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/properties/{id}/enrichment":{"get":{"tags":["Properties"],"description":"Get government enrichment data for a property. Requires Pro or Enterprise tier.","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"government_data":{"nullable":true},"census_tract":{"nullable":true,"type":"string"},"fips_code":{"nullable":true,"type":"string"},"cbsa_code":{"nullable":true,"type":"string"},"placekey":{"nullable":true,"type":"string"}},"required":["government_data","census_tract","fips_code","cbsa_code","placekey"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/exports":{"post":{"tags":["Properties"],"description":"Create an export job. Starter+ tier required. Row limits vary by tier (500/2500/10K). Returns a job ID to poll.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","minLength":2,"maxLength":2},"city":{"type":"string","maxLength":100},"zip":{"type":"string","maxLength":10},"property_type":{"type":"string","enum":["single_family","condo","townhouse","multi_family","land","manufactured","apartment","other"]},"listing_status":{"type":"string","enum":["for_sale","pending","sold","for_rent","off_market","coming_soon"]},"min_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_year_built":{"type":"integer","minimum":1600,"maximum":9007199254740991},"confidence":{"type":"string","enum":["high","medium","low","single_source"]},"format":{"default":"json","type":"string","enum":["json","csv","ndjson","geojson","xlsx","zip"]},"limit":{"default":1000,"type":"integer","minimum":1,"maximum":10000}}}}}},"security":[{"apiKey":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"exportId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"format":{"type":"string"},"estimatedRows":{"type":"number"}},"required":["exportId","status","format","estimatedRows"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/exports/{id}":{"get":{"tags":["Properties"],"description":"Check export job status. When completed, use GET /exports/:id/download to retrieve the file.","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"exportId":{"type":"string"},"status":{"type":"string","enum":["running","completed","failed"]},"format":{"type":"string"},"rowCount":{"type":"number"},"createdAt":{"type":"string"},"downloadUrl":{"type":"string"},"error":{"type":"string"}},"required":["exportId","status"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/exports/{id}/download":{"get":{"tags":["Properties"],"description":"Download a completed export. Returns the file in the requested format.","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/reports/property/{id}":{"get":{"tags":["Properties"],"description":"Generate a branded PDF report for a single property. Requires Starter tier or above.","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/reports/search":{"post":{"tags":["Properties"],"description":"Generate a branded PDF report for search results. Requires Starter tier or above.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","minLength":2,"maxLength":2},"city":{"type":"string","maxLength":100},"zip":{"type":"string","maxLength":10},"property_type":{"type":"string","enum":["single_family","condo","townhouse","multi_family","land","manufactured","apartment","other"]},"listing_status":{"type":"string","enum":["for_sale","pending","sold","for_rent","off_market","coming_soon"]},"min_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_year_built":{"type":"integer","minimum":1600,"maximum":9007199254740991},"confidence":{"type":"string","enum":["high","medium","low","single_source"]},"limit":{"default":100,"type":"integer","minimum":1,"maximum":200}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/reports/market-snapshot":{"post":{"tags":["Properties"],"description":"Generate a market snapshot one-pager PDF for a location. Requires Starter tier or above and at least state or zip filter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","minLength":2,"maxLength":2},"city":{"type":"string","maxLength":100},"zip":{"type":"string","maxLength":10},"property_type":{"type":"string","enum":["single_family","condo","townhouse","multi_family","land","manufactured","apartment","other"]},"listing_status":{"type":"string","enum":["for_sale","pending","sold","for_rent","off_market","coming_soon"]},"min_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_price":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_beds":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"max_sqft":{"type":"integer","minimum":0,"maximum":9007199254740991},"min_year_built":{"type":"integer","minimum":1600,"maximum":9007199254740991},"confidence":{"type":"string","enum":["high","medium","low","single_source"]}}}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/internal/health/pdf":{"get":{"tags":["Properties"],"description":"PDF service liveness probe. Calls pdf-api.vitkidata.com/health and reports whether it is reachable.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]}},"required":["ok"],"additionalProperties":false}}}}}}},"/api/v1/reports/pdf":{"post":{"tags":["Properties"],"description":"Enqueue a customer-facing audit PDF (PDF/A-2b + PAdES-signed). Returns a jobId — poll /api/v1/reports/pdf/:jobId for the signed download URL. Requires Starter tier or above.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template":{"type":"string","enum":["site-read","legal-risk-audit"]},"data":{"type":"object","additionalProperties":{}},"outputName":{"type":"string","minLength":1,"maxLength":120}},"required":["template","data"]}}}},"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"template":{"type":"string"}},"required":["jobId","template"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/reports/pdf/{jobId}":{"get":{"tags":["Properties"],"description":"Poll a previously enqueued PDF render job. Returns the signed download URL once state === completed. Requires Starter tier or above.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"in":"path","name":"jobId","required":true}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"state":{"type":"string","enum":["waiting","active","completed","failed","delayed","paused"]},"signedUrl":{"type":"string","format":"uri"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"expiresAt":{"type":"string"},"templateVersion":{"type":"string"},"error":{"type":"string"}},"required":["jobId","state"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/scrape":{"post":{"tags":["Properties"],"description":"Request a live property scrape for a location. Starter+ tier required.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"location":{"type":"string","minLength":2,"maxLength":200,"pattern":"^[a-zA-Z0-9\\s,.\\-'#]+$"},"listing_type":{"default":"for_sale","type":"string","enum":["for_sale","for_rent","sold","all"]},"max_results":{"default":200,"type":"integer","minimum":1,"maximum":2000}},"required":["location"]}}}},"security":[{"apiKey":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"scrapeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"location":{"type":"string"},"listingType":{"type":"string"},"maxResults":{"type":"number"},"reused":{"type":"boolean"},"propertiesFound":{"type":"number"},"propertiesIngested":{"type":"number"},"error":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"startedAt":{"nullable":true,"type":"string"},"completedAt":{"nullable":true,"type":"string"},"estimatedMinutes":{"type":"number"}},"required":["scrapeId","status","location","listingType","maxResults","propertiesFound","propertiesIngested","error","createdAt","startedAt","completedAt"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"get":{"tags":["Properties"],"description":"List your recent scrape jobs.","parameters":[{"schema":{"default":10,"type":"integer","minimum":1,"maximum":50},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"jobs":{"type":"array","items":{"type":"object","properties":{"scrapeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"location":{"type":"string"},"listingType":{"type":"string"},"maxResults":{"type":"number"},"reused":{"type":"boolean"},"propertiesFound":{"type":"number"},"propertiesIngested":{"type":"number"},"error":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"startedAt":{"nullable":true,"type":"string"},"completedAt":{"nullable":true,"type":"string"},"estimatedMinutes":{"type":"number"}},"required":["scrapeId","status","location","listingType","maxResults","propertiesFound","propertiesIngested","error","createdAt","startedAt","completedAt"],"additionalProperties":false}},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["jobs","limit","offset"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/scrape/{id}":{"get":{"tags":["Properties"],"description":"Poll the status of a scrape job.","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"scrapeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"location":{"type":"string"},"listingType":{"type":"string"},"maxResults":{"type":"number"},"reused":{"type":"boolean"},"propertiesFound":{"type":"number"},"propertiesIngested":{"type":"number"},"error":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"startedAt":{"nullable":true,"type":"string"},"completedAt":{"nullable":true,"type":"string"},"estimatedMinutes":{"type":"number"}},"required":["scrapeId","status","location","listingType","maxResults","propertiesFound","propertiesIngested","error","createdAt","startedAt","completedAt"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/permits":{"get":{"tags":["Permits"],"description":"Search building permits with filters. Returns paginated results.","parameters":[{"schema":{"type":"string"},"in":"query","name":"source","required":false,"description":"Filter by source (austin, chicago, los-angeles)"},{"schema":{"type":"string","maxLength":10},"in":"query","name":"zip","required":false},{"schema":{"type":"string","minLength":2,"maxLength":2},"in":"query","name":"state","required":false},{"schema":{"type":"string","maxLength":100},"in":"query","name":"city","required":false},{"schema":{"type":"string"},"in":"query","name":"census_tract","required":false},{"schema":{"type":"string"},"in":"query","name":"fips_code","required":false},{"schema":{"type":"string"},"in":"query","name":"permit_type","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false,"description":"Status filter (e.g. FINAL, ACTIVE, EXPIRED)"},{"schema":{"type":"string"},"in":"query","name":"address","required":false,"description":"Address search (partial match)"},{"schema":{"type":"string"},"in":"query","name":"issued_after","required":false,"description":"ISO date — permits issued after this date"},{"schema":{"type":"string"},"in":"query","name":"issued_before","required":false,"description":"ISO date — permits issued before this date"},{"schema":{"type":"number","minimum":0},"in":"query","name":"min_valuation","required":false},{"schema":{"default":25,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"permits":{"type":"array","items":{}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["permits","total","limit","offset"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/permits/{id}":{"get":{"tags":["Permits"],"description":"Get a single building permit by ID.","parameters":[{"schema":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/permits/stats":{"get":{"tags":["Permits"],"description":"Permit statistics by source (total records, coordinate coverage, date range).","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"total":{"type":"number"},"withCoordinates":{"type":"number"},"latestIssued":{"nullable":true,"type":"string"},"earliestIssued":{"nullable":true,"type":"string"}},"required":["source","total","withCoordinates","latestIssued","earliestIssued"],"additionalProperties":false}},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/customers":{"get":{"tags":["Admin"],"description":"List all customers (admin only)","parameters":[{"schema":{"default":50,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["free","trial","starter","pro","enterprise"]},"in":"query","name":"tier","required":false},{"schema":{"type":"string","enum":["trialing","active","past_due","canceled","incomplete","unpaid"]},"in":"query","name":"status","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"customers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"tier":{"type":"string"},"subscriptionStatus":{"type":"string"},"isAdmin":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","email","tier","subscriptionStatus","isAdmin","createdAt"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["customers","total","limit","offset"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/customers/{id}":{"get":{"tags":["Admin"],"description":"Get customer detail with usage history (admin only)","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"customer":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"tier":{"type":"string"},"tierName":{"type":"string"},"subscriptionStatus":{"type":"string"},"isAdmin":{"type":"boolean"},"stripeCustomerId":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","email","tier","tierName","subscriptionStatus","isAdmin","stripeCustomerId","createdAt"],"additionalProperties":false},"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keyPrefix":{"type":"string"},"name":{"type":"string"},"isActive":{"type":"boolean"},"lastUsedAt":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","keyPrefix","name","isActive","lastUsedAt","createdAt"],"additionalProperties":false}},"usageHistory":{"type":"array","items":{"type":"object","properties":{"yearMonth":{"type":"string"},"propertiesConsumed":{"type":"number"},"requestsMade":{"type":"number"}},"required":["yearMonth","propertiesConsumed","requestsMade"],"additionalProperties":false}}},"required":["customer","keys","usageHistory"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/metrics":{"get":{"tags":["Admin"],"description":"Get platform metrics (admin only)","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"totalCustomers":{"type":"number"},"activeCustomers":{"type":"number"},"customersByTier":{"type":"object","additionalProperties":{"type":"number"}},"mrr":{"type":"number"},"mrrFormatted":{"type":"string"}},"required":["totalCustomers","activeCustomers","customersByTier","mrr","mrrFormatted"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/usage":{"get":{"tags":["Admin"],"description":"Get aggregated monthly usage report (admin only)","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"in":"query","name":"year_month","required":false}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"yearMonth":{"type":"string"},"totalProperties":{"type":"number"},"totalRequests":{"type":"number"},"activeCustomers":{"type":"number"}},"required":["yearMonth","totalProperties","totalRequests","activeCustomers"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/cleanup":{"post":{"tags":["Admin"],"description":"Trigger database cleanup (admin only)","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"refreshTokens":{"type":"number"},"passwordResetTokens":{"type":"number"},"emailVerifications":{"type":"number"},"requestLogs":{"type":"number"},"stripeEvents":{"type":"number"},"webhookDeliveries":{"type":"number"},"recoveryCodesUsed":{"type":"number"},"scrapeJobs":{"type":"number"}},"required":["refreshTokens","passwordResetTokens","emailVerifications","requestLogs","stripeEvents","webhookDeliveries","recoveryCodesUsed","scrapeJobs"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/scrape-schedule":{"get":{"tags":["Admin"],"description":"List all scheduled scrape locations (admin only)","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"location":{"type":"string"},"listingType":{"type":"string"},"maxResults":{"type":"number"},"intervalHours":{"type":"number"},"sources":{"type":"array","items":{"type":"string"}},"isActive":{"type":"boolean"},"lastRunAt":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","location","listingType","maxResults","intervalHours","sources","isActive","lastRunAt","createdAt"],"additionalProperties":false}},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"tags":["Admin"],"description":"Add a location to the background scrape schedule (admin only)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"location":{"type":"string","minLength":2,"maxLength":200,"pattern":"^[a-zA-Z0-9\\s,.\\-'#]+$"},"listing_type":{"default":"for_sale","type":"string","enum":["for_sale","for_rent","sold","all"]},"max_results":{"default":500,"type":"integer","minimum":1,"maximum":5000},"interval_hours":{"default":168,"type":"integer","minimum":1,"maximum":720},"sources":{"default":["redfin","zillow","realtor"],"minItems":1,"type":"array","items":{"type":"string"}}},"required":["location"]}}}},"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"location":{"type":"string"},"locationKey":{"type":"string"}},"required":["id","location","locationKey"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/scrape-schedule/{id}":{"delete":{"tags":["Admin"],"description":"Remove a location from the scrape schedule (admin only)","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"id","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/admin/scrape-schedule/run":{"post":{"tags":["Admin"],"description":"Manually trigger all due scheduled scrapes (admin only)","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"triggered":{"type":"boolean"}},"required":["triggered"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/webhooks":{"get":{"tags":["Account"],"description":"List your webhook subscriptions","security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"webhooks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","url","events","description","isActive","createdAt"],"additionalProperties":false}},"maxWebhooks":{"type":"number"}},"required":["webhooks","maxWebhooks"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"tags":["Account"],"description":"Create a webhook subscription. Returns the signing secret once — store it securely.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"description":{"default":"","type":"string","maxLength":200}},"required":["url"]}}}},"security":[{"apiKey":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"secret":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"description":{"type":"string"}},"required":["id","url","secret","events","description"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/webhooks/{webhookId}":{"patch":{"tags":["Account"],"description":"Update a webhook (URL, description, or active status)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"description":{"type":"string","maxLength":200},"isActive":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"webhookId","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"isActive":{"type":"boolean"}},"required":["id","url","events","description","isActive"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"tags":["Account"],"description":"Delete a webhook subscription","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"webhookId","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/account/webhooks/{webhookId}/deliveries":{"get":{"tags":["Account"],"description":"View recent delivery attempts for a webhook","parameters":[{"schema":{"default":20,"type":"integer","minimum":1,"maximum":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"webhookId","required":true}],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deliveries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"event":{"type":"string"},"statusCode":{"nullable":true,"type":"number"},"success":{"type":"boolean"},"errorMessage":{"nullable":true,"type":"string"},"createdAt":{"type":"string"}},"required":["id","event","statusCode","success","errorMessage","createdAt"],"additionalProperties":false}}},"required":["deliveries"],"additionalProperties":false},"meta":{"type":"object","properties":{"timestamp":{"type":"string"}},"required":["timestamp"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/health":{"get":{"description":"Health check endpoint","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"timestamp":{"type":"string"}},"required":["status","timestamp"],"additionalProperties":false}}}}}}},"/api/v1":{"get":{"description":"API root — version and navigation links","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"docs":{"type":"string"},"openapi":{"type":"string"},"signup":{"type":"string"},"checkout":{"type":"string"}},"required":["name","version","docs","openapi","signup","checkout"],"additionalProperties":false}}}}}}}},"servers":[{"url":"https://api.vitkidata.com","description":"Production"}],"tags":[{"name":"Properties","description":"Property search, retrieval, and bulk export"},{"name":"Billing","description":"Checkout, signup, and subscription management"},{"name":"Account","description":"Customer account, usage, and API key management"},{"name":"Auth","description":"Email/password authentication and session management"},{"name":"Admin","description":"Platform administration (admin only)"},{"name":"Permits","description":"Building permit data (Austin, Chicago, LA)"}],"externalDocs":{"description":"API Documentation","url":"https://vitkidata.com/docs"}}