{"openapi":"3.1.0","info":{"title":"Nichify","description":"Vinted niche detection SaaS","version":"1.0.0"},"paths":{"/health":{"get":{"summary":"Health Check","description":"Readiness check: verifies DB connectivity.","operationId":"healthCheck","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"422":{"description":"Validation failed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Register Part of the Nichify public API."}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Login Part of the Nichify public API."}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Idempotent logout.\n\nWe do NOT depend on ``get_current_user`` so the route still clears the\nbrowser cookie when the session is expired, invalid or missing. The\nprevious version raised 401 in those cases, leaving a stale cookie on\nthe client for its full 30-day TTL — ugly UX with zero security value\nsince the cookie is already unusable server-side.\n\nBehaviour:\n- If the incoming cookie maps to any DB session rows (current OR\n  stale), delete them + invalidate the Redis cache.\n- Always delete the browser cookie, even if no session row existed.\n- Always return 200.","operationId":"logout","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","operationId":"forgotPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Forgot Password Part of the Nichify public API."}},"/api/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"resetPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Reset Password Part of the Nichify public API."}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Me Part of the Nichify public API."}},"/api/billing/plans":{"get":{"tags":["billing"],"summary":"List Plans","operationId":"listPlans","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"List Plans Part of the Nichify public API."}},"/api/billing/checkout":{"post":{"tags":["billing"],"summary":"Checkout","operationId":"checkout","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Checkout Part of the Nichify public API."}},"/api/billing/portal":{"post":{"tags":["billing"],"summary":"Portal","operationId":"portal","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Portal Part of the Nichify public API."}},"/api/billing/trial/start":{"post":{"tags":["billing"],"summary":"Trial Start","operationId":"trialStart","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialStartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Trial Start Part of the Nichify public API."}},"/api/billing/trial/confirm":{"get":{"tags":["billing"],"summary":"Trial Confirm","operationId":"trialConfirm","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"},"description":"Opaque, single-use token value delivered by email."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Trial Confirm Part of the Nichify public API."}},"/api/billing/sync-checkout":{"post":{"tags":["billing"],"summary":"Sync Checkout","description":"Called by the frontend after a successful Stripe checkout redirect.\nRetrieves the session from Stripe and immediately syncs the subscription.\n\nSECURITY (C-1): we MUST verify the session belongs to the caller. Without\nthis check, any authenticated user can POST a stranger's session_id and\nabsorb their plan + customer_id (free Pro/Expert upgrade by replay).\nStripe sets `client_reference_id` to our `user.id` and stashes our\n`workspace_id` in metadata at session creation — both are forwarded back\nby Stripe and serve as cryptographically-guaranteed ownership tags.","operationId":"syncCheckout","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/runs":{"get":{"tags":["runs"],"summary":"List Runs","operationId":"listRuns","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"List Runs Part of the Nichify public API."},"post":{"tags":["runs"],"summary":"Create Run","operationId":"createRun","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRunRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Create Run Part of the Nichify public API."}},"/api/runs/{run_id}":{"get":{"tags":["runs"],"summary":"Get Run","operationId":"getRun","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Run Part of the Nichify public API."},"delete":{"tags":["runs"],"summary":"Delete Run","operationId":"deleteRun","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Delete Run Part of the Nichify public API."}},"/api/runs/{run_id}/cancel":{"post":{"tags":["runs"],"summary":"Cancel Run","operationId":"cancelRun","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Cancel Run Part of the Nichify public API."}},"/api/runs/{run_id}/replay":{"post":{"tags":["runs"],"summary":"Replay Run","operationId":"replayRun","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Replay Run Part of the Nichify public API."}},"/api/runs/{run_id}/alerts-download":{"get":{"tags":["runs"],"summary":"Download Alerts","operationId":"downloadAlerts","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Download Alerts Part of the Nichify public API."}},"/api/runs/{run_id}/log":{"get":{"tags":["runs"],"summary":"Get Run Log","operationId":"getRunLog","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"tail_lines","in":"query","required":false,"schema":{"type":"integer","default":160,"title":"Tail Lines"},"description":"Value for tail lines."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Run Log Part of the Nichify public API."}},"/api/dashboard":{"get":{"tags":["runs"],"summary":"Get Dashboard","operationId":"getDashboard","parameters":[{"name":"run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"description":"Unique identifier of the analysis run."},{"name":"include_top_niches","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Top Niches"},"description":"Value for include top niches."},{"name":"include_recent_runs","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Recent Runs"},"description":"Value for include recent runs."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Dashboard Part of the Nichify public API."}},"/api/monitoring/start":{"post":{"tags":["monitoring"],"summary":"Start Monitor","description":"Create a Monitor record and schedule the initial scrape as a background task.\n\nReturns 202 immediately so the gateway never times out. The monitor starts\nwith status='paused' and switches to 'active' once the bootstrap completes.\n\nAccepts exactly one of:\n- ``analysis_id``: bootstrap from an existing Analysis (existing behaviour).\n- ``url``: create a monitor directly from a Vinted catalogue URL.","operationId":"startMonitor","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartMonitorRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/monitoring":{"get":{"tags":["monitoring"],"summary":"List Monitors","operationId":"listMonitors","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"List Monitors Part of the Nichify public API."}},"/api/monitoring/{monitor_id}":{"get":{"tags":["monitoring"],"summary":"Get Monitor","operationId":"getMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Monitor Part of the Nichify public API."},"delete":{"tags":["monitoring"],"summary":"Delete Monitor","operationId":"deleteMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Delete Monitor Part of the Nichify public API."}},"/api/monitoring/{monitor_id}/listings":{"get":{"tags":["monitoring"],"summary":"Get Monitor Listings","operationId":"getMonitorListings","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"state","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|sold|reserved|deleted|all)$","default":"open","title":"State"},"description":"Value for state."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"},"description":"One-based page number used together with per_page."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"},"description":"Value for page size."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Monitor Listings"}},"/api/monitoring/{monitor_id}/export":{"get":{"tags":["monitoring"],"summary":"Export Monitor","description":"Emit a self-describing JSON dump of a monitor's full captured history.\n\nThe dump is consumable by POST /api/analysis/import-monitoring which\nre-renders the 4 analysis graphs without firing a Vinted scrape.\n\nAuthentication + workspace ownership are enforced via the same\n``_get_owned_monitor`` helper used by every other monitor endpoint.","operationId":"exportMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/monitoring/{monitor_id}/trends":{"get":{"tags":["monitoring"],"summary":"Get Monitor Trends","operationId":"getMonitorTrends","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":2160,"minimum":1,"default":168,"title":"Window Hours"},"description":"Value for window hours."},{"name":"bucket_hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":6,"title":"Bucket Hours"},"description":"Value for bucket hours."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Monitor Trends Part of the Nichify public API."}},"/api/monitoring/{monitor_id}/pause":{"post":{"tags":["monitoring"],"summary":"Pause Monitor","operationId":"pauseMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Pause Monitor Part of the Nichify public API."}},"/api/monitoring/{monitor_id}/resume":{"post":{"tags":["monitoring"],"summary":"Resume Monitor","operationId":"resumeMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Resume Monitor Part of the Nichify public API."}},"/api/monitoring/{monitor_id}/stop":{"post":{"tags":["monitoring"],"summary":"Stop Monitor","operationId":"stopMonitor","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Stop Monitor Part of the Nichify public API."}},"/api/monitoring/{monitor_id}/interval":{"patch":{"tags":["monitoring"],"summary":"Update Interval","operationId":"updateInterval","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"},"description":"Unique identifier of the monitor."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntervalUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Update Interval Part of the Nichify public API."}},"/api/account/status":{"get":{"tags":["account"],"summary":"Account Status","operationId":"accountStatus","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Account Status Part of the Nichify public API."}},"/api/account/sessions":{"get":{"tags":["account"],"summary":"List Sessions","operationId":"listSessions","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"List Sessions Part of the Nichify public API."}},"/api/account/sessions/{session_id}":{"delete":{"tags":["account"],"summary":"Revoke Session","operationId":"revokeSession","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"},"description":"Unique identifier of an individual browser session."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Revoke Session Part of the Nichify public API."}},"/api/account/delete-request":{"post":{"tags":["account"],"summary":"Request Account Deletion","operationId":"requestAccountDeletion","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Request Account Deletion"}},"/api/account/confirm-delete":{"post":{"tags":["account"],"summary":"Confirm Account Deletion","operationId":"confirmAccountDeletion","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"},"description":"Opaque, single-use token value delivered by email."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Confirm Account Deletion"}},"/api/referral/code":{"post":{"tags":["referral"],"summary":"Create Referral Code","operationId":"createReferralCode","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Create Referral Code"}},"/api/referral/payout-method":{"put":{"tags":["referral"],"summary":"Update Payout Method","operationId":"updatePayoutMethod","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutMethodBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Update Payout Method"}},"/api/referral/stats":{"get":{"tags":["referral"],"summary":"Get Referral Stats","operationId":"getReferralStats","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Referral Stats Part of the Nichify public API."}},"/api/analysis":{"post":{"tags":["analysis"],"summary":"Run Analysis","description":"Analyse a niche by scraping its catalog pages (SSE stream).\n\n- *run_id*: takes the run's URL, strips to brand+category, crawls all pages.\n- *url*: scrapes the given URL directly.\n\nReturns a text/event-stream with:\n  event: progress  — {items, pages} after each page crawled\n  event: done       — full analysis payload","operationId":"runAnalysis","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}},"get":{"tags":["analysis"],"summary":"List Analyses","description":"Return all analyses (running + saved), sorted by creation date (newest first).\n\nRunning/failed entries come from the filesystem-backed ``analysis_registry``\n(shared across uvicorn workers); persisted ones come from\n``analysis_store``.\n\n**Merge rule:** when an ``analysis_id`` is present in both (a rerun of an\nexisting analysis, by design), the **registry entry wins** — otherwise\nthe \"Relancer\" button looks like a no-op because the saved ``done`` row\nmasks the live ``running`` progress. The saved KPIs (``avg_price``,\ncached total) are grafted onto the running row so the card still shows\nmeaningful numbers while the rescrape is in flight.","operationId":"listAnalyses","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/import-monitoring":{"post":{"tags":["analysis"],"summary":"Import Monitoring","description":"Import a monitoring export JSON dump and persist it as a real Analysis.\n\nNo scrape is fired. No Vinted traffic. No analyses-quota increment\n(see decision D4 in docs/superpowers/specs/2026-04-20-url-launch-and-monitoring-replay-design.md).\n\nValidates ``schema_version`` against the accepted set, converts each\nitem to a ``ListingData`` via the shared helper, runs the same\naggregate computation used by live scrapes, and writes\n``summary.json`` + ``listings.jsonl`` under a new\n``imported-{hex8}`` id. The resulting analysis shows in the user's\nanalyses list and renders the four standard graphs (prix / marque /\nétat / mots-clés).","operationId":"importMonitoring","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}/rerun":{"post":{"tags":["analysis"],"summary":"Rerun Analysis","description":"Re-scrape an existing analysis in place, reusing its source metadata.\n\nReads ``source_meta`` from the saved summary.json to find the original\nURL (or run_id) and re-launches a scrape under the same analysis_id.\nThe fresh result overwrites summary.json and listings.jsonl so the\ndetails page sees updated data after the stream completes.\n\nLegacy ``run-*`` analyses without source_meta fall back to extracting\nthe run_id from the analysis_id itself. Legacy ``url-*`` analyses\nwithout source_meta cannot be rerun (422).","operationId":"rerunAnalysis","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}":{"get":{"tags":["analysis"],"summary":"Get Analysis","description":"Return a previously saved analysis summary.","operationId":"getAnalysis","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}/status":{"get":{"tags":["analysis"],"summary":"Get Analysis Status","description":"Return the live scrape status for an analysis.\n\nUsed by the details page to detect an in-flight rerun after the user\nclosed and reopened the tab. The scrape runs as a fire-and-forget\nbackground task and updates ``analysis_registry`` on every crawled\npage — polling this endpoint is enough to show a live central loading\nstate until the scrape finishes.\n\nResponse shape:\n    { \"state\": \"running\" | \"failed\" | \"idle\",\n      \"items\": int, \"pages\": int,\n      \"label\": str | None, \"source\": str | None,\n      \"error_message\": str | None }\n\n``idle`` means no active entry — either the scrape finished (caller\nshould reload the summary) or none ever started.","operationId":"getAnalysisStatus","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}/scatter":{"get":{"tags":["analysis"],"summary":"Get Analysis Scatter","description":"Return a scatter sample (max 2000 points), optionally filtered by brands.","operationId":"getAnalysisScatter","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"brands","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated brand names","title":"Brands"},"description":"Comma-separated brand names"},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}/listings":{"get":{"tags":["analysis"],"summary":"Get Analysis Listings","description":"Return paginated listings for a saved analysis.\n\nSupports the same filters as ``/filtered`` so the table stays in\nsync with the rest of the dashboard when filters are applied. The\n``status`` param (US-003) filters on ``listing_status``; values\noutside {active, sold, reserved} are silently ignored and all rows\nare returned so an invalid client value never breaks the page.","operationId":"getAnalysisListings","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"},"description":"One-based page number used together with per_page."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"},"description":"Value for page size."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"like_count","title":"Sort"},"description":"Value for sort."},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Order"},"description":"Value for order."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"},"description":"Value for q."},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Price Min"},"description":"Value for price min."},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Price Max"},"description":"Value for price max."},{"name":"conditions","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated condition values","title":"Conditions"},"description":"Comma-separated condition values"},{"name":"brands","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated brand names","title":"Brands"},"description":"Comma-separated brand names"},{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated category names","title":"Categories"},"description":"Comma-separated category names"},{"name":"keywords","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated keyword words","title":"Keywords"},"description":"Comma-separated keyword words"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by listing_status: active | sold | reserved. Unknown / absent returns all rows.","title":"Status"},"description":"Filter by listing_status: active | sold | reserved. Unknown / absent returns all rows."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/analysis/{analysis_id}/filtered":{"get":{"tags":["analysis"],"summary":"Get Filtered Analysis","description":"Recompute all aggregates (KPIs, charts, matrix, pépites) on a filtered subset.\n\nLoads the raw listings from disk, applies in-memory filters, and returns\nthe same payload shape as the cached summary. No filters = the full\nanalysis (identical to the summary, plus a freshly-computed volume if\nolder analyses were missing ``total_price_eur``).","operationId":"getFilteredAnalysis","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"},"description":"Unique identifier of the saved analysis."},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Price Min"},"description":"Value for price min."},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Price Max"},"description":"Value for price max."},{"name":"conditions","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated condition values","title":"Conditions"},"description":"Comma-separated condition values"},{"name":"brands","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated brand names","title":"Brands"},"description":"Comma-separated brand names"},{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated category names","title":"Categories"},"description":"Comma-separated category names"},{"name":"keywords","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated keyword words","title":"Keywords"},"description":"Comma-separated keyword words"},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/admin/seo/data":{"get":{"tags":["seo-admin"],"summary":"Seo Data","operationId":"seoData","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Seo Data Part of the Nichify public API."}},"/admin/seo/trigger/gsc":{"post":{"tags":["seo-admin"],"summary":"Trigger Gsc","operationId":"triggerGsc","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Trigger Gsc Part of the Nichify public API."}},"/admin/seo/trigger/psi":{"post":{"tags":["seo-admin"],"summary":"Trigger Psi","operationId":"triggerPsi","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Trigger Psi Part of the Nichify public API."}},"/admin/seo":{"get":{"tags":["seo-admin"],"summary":"Seo Page","operationId":"seoPage","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Seo Page Part of the Nichify public API."}},"/u/{token}":{"get":{"tags":["email-prefs"],"summary":"Unsubscribe","operationId":"unsubscribe","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"},"description":"Opaque, single-use token value delivered by email."}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Unsubscribe Part of the Nichify public API."}},"/api/keys":{"post":{"tags":["keys"],"summary":"Mint a new Personal Access Token","description":"Returns the plaintext token ONCE. Store it securely — it cannot be retrieved later.","operationId":"createMyKey","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}},"get":{"tags":["keys"],"summary":"List my Personal Access Tokens","description":"Returns every PAT the caller owns (active and revoked). Plaintext is never included.","operationId":"listMyKeys","parameters":[{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/keys/{key_id}":{"patch":{"tags":["keys"],"summary":"Rename a Personal Access Token","operationId":"renameMyKey","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"},"description":"Unique identifier of the personal access token (PAT)."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Rename a Personal Access Token"},"delete":{"tags":["keys"],"summary":"Revoke a Personal Access Token","description":"Soft-revoke — sets revoked_at. The row is kept for audit.","operationId":"revokeMyKey","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"},"description":"Unique identifier of the personal access token (PAT)."},{"name":"session_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"description":"Browser session cookie set by POST /api/auth/login. Usually attached automatically by the browser; explicit values are only needed for scripted clients that choose cookie auth over Bearer."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/status":{"get":{"tags":["public"],"summary":"Public health status","description":"Unauthenticated health probe.\n\nReturns a summary of the worker's DB connectivity, scraper freshness,\nand rolling HTTP error rate so humans and agents can decide whether to\nretry a failing call or fail fast.","operationId":"getPublicStatus","responses":{"200":{"description":"Current health summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"422":{"description":"Validation failed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/mcp/manifest":{"get":{"tags":["MCP"],"summary":"MCP server manifest","description":"Public manifest for the Nichify MCP server. Advertises the Streamable HTTP endpoint, accepted authentication scheme, and a preview of available tools. Safe to fetch without auth.","operationId":"mcpManifest","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Manifest Mcp Manifest Get"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"422":{"description":"Validation failed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/ask":{"post":{"tags":["nlweb"],"summary":"NLWeb-compatible ask endpoint","description":"Public, read-only question answering over Nichify's niche catalog. Set ``prefer.streaming=true`` to receive Server-Sent Events with NLWeb event types (``start`` / ``result`` / ``complete``). Otherwise returns a single JSON payload.","operationId":"ask","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"request_id":"abc123","question":"sneakers nike","results":[],"source":"nichify.public-niches"}},"text/event-stream":{"example":"event: start\ndata: {\"request_id\":\"abc\"}\n\nevent: result\ndata: {\"index\":0,\"item\":{...}}\n\nevent: complete\ndata: {\"summary\":{\"result_count\":1}}\n\n"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}}}},"/api/landing":{"get":{"tags":["public"],"summary":"Get Landing Summary","operationId":"getLandingSummary","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"401":{"description":"Not authenticated","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"422":{"description":"Validation failed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"description":"Get Landing Summary Part of the Nichify public API."}}},"components":{"schemas":{"AnalysisRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"pages":{"type":"integer","title":"Pages","default":5},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"}},"type":"object","title":"AnalysisRequest"},"AskPrefer":{"properties":{"streaming":{"type":"boolean","title":"Streaming","default":false}},"type":"object","title":"AskPrefer"},"AskRequest":{"properties":{"question":{"type":"string","maxLength":500,"minLength":1,"title":"Question"},"prefer":{"$ref":"#/components/schemas/AskPrefer"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},"type":"object","required":["question"],"title":"AskRequest"},"CheckoutRequest":{"properties":{"plan_key":{"type":"string","title":"Plan Key"}},"type":"object","required":["plan_key"],"title":"CheckoutRequest"},"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string","enum":["read","write"]},"type":"array"},{"type":"null"}],"title":"Scopes"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["name"],"title":"CreateKeyRequest"},"CreateRunRequest":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params","default":{}}},"type":"object","title":"CreateRunRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IntervalUpdateRequest":{"properties":{"interval_minutes":{"type":"integer","maximum":1440.0,"minimum":5.0,"title":"Interval Minutes"}},"type":"object","required":["interval_minutes"],"title":"IntervalUpdateRequest"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"PayoutMethodBody":{"properties":{"paypal_email":{"type":"string","title":"Paypal Email"}},"type":"object","required":["paypal_email"],"title":"PayoutMethodBody"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"type":"string","title":"Display Name"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["email","password","display_name"],"title":"RegisterRequest"},"RenameKeyRequest":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"RenameKeyRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"StartMonitorRequest":{"properties":{"analysis_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analysis Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"interval_minutes":{"type":"integer","maximum":1440.0,"minimum":5.0,"title":"Interval Minutes","default":30},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"StartMonitorRequest"},"StatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Overall status: 'ok', 'degraded', or 'down'."},"version":{"type":"string","title":"Version","description":"Deployed git SHA or APP_VERSION, 'dev' locally."},"uptime_seconds":{"type":"integer","title":"Uptime Seconds","description":"Seconds since the worker process started."},"db":{"type":"string","title":"Db","description":"Result of the trailing SELECT 1 probe: 'ok' or 'fail'."},"db_elapsed_ms":{"type":"integer","title":"Db Elapsed Ms","description":"Wall clock of the DB probe, in milliseconds."},"scraper_last_success_utc":{"type":"string","title":"Scraper Last Success Utc","description":"ISO-8601 UTC timestamp of the most recent successful Vinted scrape, or 'unknown' when the worker has not scraped yet."},"rate_limit_window":{"type":"string","title":"Rate Limit Window","description":"Human-readable summary of the default slowapi rate-limits."},"error_rate_5m":{"type":"number","title":"Error Rate 5M","description":"Fraction (0.0 to 1.0) of 5xx responses over the trailing 5 minutes."},"generated_at_utc":{"type":"string","title":"Generated At Utc","description":"ISO-8601 UTC timestamp at which this snapshot was computed."}},"type":"object","required":["status","version","uptime_seconds","db","db_elapsed_ms","scraper_last_success_utc","rate_limit_window","error_rate_5m","generated_at_utc"],"title":"StatusResponse"},"TrialStartRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"TrialStartRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ApiErrorEnvelope":{"$defs":{"ErrorDetail":{"description":"Body of the ``error`` field on every envelope response.","properties":{"code":{"description":"Machine-readable error code. Stable across versions.","title":"Code","type":"string"},"message":{"description":"Human-readable message. Safe to surface to end users.","title":"Message","type":"string"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Structured context (field-level errors, offending IDs, ...).","title":"Details"},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"When non-null, the client may retry after this many seconds.","title":"Retry After Seconds"},"docs_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Link to documentation that explains this error.","title":"Docs Url"},"suggest":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Suggestions for self-recovery (e.g. close endpoint paths on 404).","title":"Suggest"}},"required":["code","message"],"title":"ErrorDetail","type":"object"}},"description":"RFC-7807-compatible error envelope.","properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"required":["error"],"title":"ApiErrorEnvelope","type":"object"}}}}