{"openapi":"3.1.0","info":{"title":"Emit","description":"Programmable RSS feeds: pipe anything on the web into a clean RSS feed (Watchers, page->feed), transform it (filter, dedupe, summarize), and deliver it anywhere (newsletter, Slack/Discord, webhooks, plain RSS). Pay per use, no tiers. Everything via API.","version":"1.7.0"},"paths":{"/v1/accounts":{"post":{"tags":["accounts"],"summary":"Create Account","description":"Self-serve signup. Returns the API key exactly once — store it now.","operationId":"create_account_v1_accounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify-email/{token}":{"get":{"tags":["accounts"],"summary":"Verify Email","operationId":"verify_email_verify_email__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account":{"get":{"tags":["accounts"],"summary":"Get Account","operationId":"get_account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["accounts"],"summary":"Delete Account","description":"Permanently delete the account and all its data.","operationId":"delete_account_v1_account_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["accounts"],"summary":"Update Account","description":"Update account preferences, e.g. toggle open/click tracking for privacy.","operationId":"update_account_v1_account_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/snippets":{"get":{"tags":["accounts"],"summary":"List Snippets","description":"Ready-to-embed subscribe-form snippets, personalized with this account's\npublic form token. Each carries a 'powered by emit' backlink.","operationId":"list_snippets_v1_snippets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Snippet"},"type":"array","title":"Response List Snippets V1 Snippets Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/rotate-key":{"post":{"tags":["accounts"],"summary":"Rotate Key","description":"Issue a new API key and immediately revoke the current one.\n\nThe new key is returned exactly once. The old key stops working as soon as\nthis returns.","operationId":"rotate_key_v1_account_rotate_key_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreated"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/keys":{"get":{"tags":["accounts"],"summary":"List Api Keys","operationId":"list_api_keys_v1_account_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyOut"},"type":"array","title":"Response List Api Keys V1 Account Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["accounts"],"summary":"Create Api Key","description":"Create an additional named API key (e.g. per teammate or CI). Shown once.","operationId":"create_api_key_v1_account_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/keys/{key_id}":{"delete":{"tags":["accounts"],"summary":"Delete Api Key","operationId":"delete_api_key_v1_account_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/analytics":{"get":{"tags":["accounts"],"summary":"Account Analytics","description":"Basic usage analytics for the dashboard.","operationId":"account_analytics_v1_account_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/analytics/broadcasts":{"get":{"tags":["accounts"],"summary":"Broadcast Analytics","description":"Per-broadcast open/click counts, newest first.\n\nOpens/clicks are counted from the broadcast's sends (opened_at / clicked_at).\nBroadcasts that never dispatched a send are omitted — there is nothing to chart.","operationId":"broadcast_analytics_v1_account_analytics_broadcasts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BroadcastStat"},"type":"array","title":"Response Broadcast Analytics V1 Account Analytics Broadcasts Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Request Login","description":"Email a one-time login link to the account owner. Always reports success\nso the endpoint can't be used to probe which emails have accounts.","operationId":"request_login_v1_auth_login_post","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"}}}}}}},"/v1/auth/verify":{"post":{"tags":["auth"],"summary":"Verify Login","description":"Exchange a magic-link token for a dashboard session token.","operationId":"verify_login_v1_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Revoke the presented session token (no-op for API keys).","operationId":"logout_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/feeds":{"post":{"tags":["feeds"],"summary":"Create Feed","operationId":"create_feed_v1_feeds_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["feeds"],"summary":"List Feeds","operationId":"list_feeds_v1_feeds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedOut"},"title":"Response List Feeds V1 Feeds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feeds/test":{"post":{"tags":["feeds"],"summary":"Test Feed","description":"Fetch + parse a feed URL and report what we'd see, without connecting it.","operationId":"test_feed_v1_feeds_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedTest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedTestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/feeds/{feed_id}":{"get":{"tags":["feeds"],"summary":"Get Feed","operationId":"get_feed_v1_feeds__feed_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["feeds"],"summary":"Update Feed","description":"Update a feed in place — change from_email/schedule/title/template, or set\nactive=false to pause it (and true to resume) without losing item history.","operationId":"update_feed_v1_feeds__feed_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["feeds"],"summary":"Delete Feed","operationId":"delete_feed_v1_feeds__feed_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feeds/{feed_id}/ping":{"post":{"tags":["feeds"],"summary":"Ping Feed","description":"Poll this feed right now (for on_publish push from your own webhook),\ninstead of waiting for the next scheduled poll. Queued emails are sent by the\nworker on its next drain.","operationId":"ping_feed_v1_feeds__feed_id__ping_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feeds/{feed_id}/test-send":{"post":{"tags":["feeds"],"summary":"Test Send Feed","description":"Render this feed's latest item exactly as a newsletter — through the feed's\ntemplate and from-address — and send it to one address, so you can preview the\nreal thing before publishing. Debits one credit (it's a real email).","operationId":"test_send_feed_v1_feeds__feed_id__test_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscribers":{"post":{"tags":["subscribers"],"summary":"Create Subscriber","description":"Add a subscriber. Triggers a double opt-in confirmation email.","operationId":"create_subscriber_v1_subscribers_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["subscribers"],"summary":"List Subscribers","description":"List subscribers, optionally filtered by ?status (e.g. confirmed, pending,\nunsubscribed, bounced, complained).","operationId":"list_subscribers_v1_subscribers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberOut"},"title":"Response List Subscribers V1 Subscribers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscribers/{subscriber_id}/resend-confirmation":{"post":{"tags":["subscribers"],"summary":"Resend Confirmation","description":"Re-send the double opt-in email to a pending subscriber — e.g. when the\nfirst one never arrived or the reader lost it.","operationId":"resend_confirmation_v1_subscribers__subscriber_id__resend_confirmation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscriber Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscribers/export":{"get":{"tags":["subscribers"],"summary":"Export Subscribers","description":"Export subscribers as CSV (optionally filtered by ?status).","operationId":"export_subscribers_v1_subscribers_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscribers/import":{"post":{"tags":["subscribers"],"summary":"Import Subscribers","description":"Bulk-add subscribers (e.g. migrating a list). Dedupes against existing\naddresses and skips malformed ones. Set `confirmed: true` for a list that\nalready opted in elsewhere; otherwise they're created pending (opt-in).","operationId":"import_subscribers_v1_subscribers_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberImport"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/subscribers/{subscriber_id}":{"delete":{"tags":["subscribers"],"summary":"Delete Subscriber","operationId":"delete_subscriber_v1_subscribers__subscriber_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscriber Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/confirm/{token}":{"get":{"tags":["subscribers"],"summary":"Confirm Subscription","operationId":"confirm_subscription_confirm__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/u/{token}":{"get":{"tags":["subscribers"],"summary":"Unsubscribe","operationId":"unsubscribe_u__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["subscribers"],"summary":"Unsubscribe One Click","description":"RFC 8058 one-click unsubscribe (List-Unsubscribe-Post).","operationId":"unsubscribe_one_click_u__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers":{"post":{"tags":["watchers"],"summary":"Create Watcher","description":"Create a Watcher. Two front doors, freely combined: bring your own\nsources (feed URLs — the \"filter my feeds\" path), and/or a natural-language\nprompt whose matching sources are auto-discovered (when a discovery provider\nis configured). No prompt = no filter: a pure merge/page->feed pipeline.","operationId":"create_watcher_v1_watchers_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["watchers"],"summary":"List Watchers","operationId":"list_watchers_v1_watchers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WatcherOut"},"title":"Response List Watchers V1 Watchers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}":{"get":{"tags":["watchers"],"summary":"Get Watcher","operationId":"get_watcher_v1_watchers__watcher_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["watchers"],"summary":"Update Watcher","description":"Edit prompt/name/cadence/threshold, or pause/resume via status. A prompt\nedit does not re-run discovery on its own — call /discover to propose new\nsources for the updated prompt.","operationId":"update_watcher_v1_watchers__watcher_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["watchers"],"summary":"Delete Watcher","operationId":"delete_watcher_v1_watchers__watcher_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/discover":{"post":{"tags":["watchers"],"summary":"Rediscover","description":"Re-run source discovery against the current prompt and add new sources\n(up to the per-watcher ceiling). Existing sources are never touched.\nMetered (semantic search is rented per query); discovery at watcher\ncreation is free.","operationId":"rediscover_v1_watchers__watcher_id__discover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherDiscoveryResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/sources":{"post":{"tags":["watchers"],"summary":"Add Source","description":"Add a source by URL. A feed URL (or a site whose feed we can detect) is\nmonitored as a feed; a reachable page with no feed becomes a page->feed\nsource, monitored by link diffing.","operationId":"add_source_v1_watchers__watcher_id__sources_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherSourceAdd"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherSourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/sources/{source_id}":{"delete":{"tags":["watchers"],"summary":"Remove Source","description":"Prune a source. Deactivated, not deleted — its history and the\ndiscovered-vs-kept signal are retained.","operationId":"remove_source_v1_watchers__watcher_id__sources__source_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/items":{"get":{"tags":["watchers"],"summary":"List Items","description":"Recent items, newest first. With include_suppressed=true this is the audit\nview: everything the watcher saw and why each item was emitted or not.","operationId":"list_items_v1_watchers__watcher_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}},{"name":"include_suppressed","in":"query","required":false,"schema":{"type":"boolean","description":"Include filtered-out items with their suppression reason","default":false,"title":"Include Suppressed"},"description":"Include filtered-out items with their suppression reason"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WatcherItemOut"},"title":"Response List Items V1 Watchers  Watcher Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/items/{item_id}/feedback":{"post":{"tags":["watchers"],"summary":"Item Feedback","description":"One-tap tuning: \"more\" loosens the threshold, \"less\" tightens it, each\nwithin a clamp around the tier base. The tap is recorded on the item too.","operationId":"item_feedback_v1_watchers__watcher_id__items__item_id__feedback_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherFeedback"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/poll":{"post":{"tags":["watchers"],"summary":"Poll Watcher","description":"Run a monitoring pass right now instead of waiting for the next scheduled\ncycle. Newly emitted items appear on the feed immediately.","operationId":"poll_watcher_v1_watchers__watcher_id__poll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchers/{watcher_id}/pipe":{"post":{"tags":["watchers"],"summary":"Pipe To Newsletter","description":"The newsletter bridge: register this watcher's feed as a source in the\nnewsletter engine in one action. Everything downstream (scheduling,\ntemplates, delivery) works exactly as for any other feed.","operationId":"pipe_to_newsletter_v1_watchers__watcher_id__pipe_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Watcher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherPipe"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sinks":{"post":{"tags":["sinks"],"summary":"Create Sink","description":"Push a feed's new items to a Slack or Discord channel via an incoming\nwebhook. The feed can be anything — a watcher's output, your blog's RSS,\nany pipeline stage. Connecting never replays the feed's back-catalog.","operationId":"create_sink_v1_sinks_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SinkCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SinkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sinks"],"summary":"List Sinks","operationId":"list_sinks_v1_sinks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SinkOut"},"title":"Response List Sinks V1 Sinks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sinks/{sink_id}":{"patch":{"tags":["sinks"],"summary":"Update Sink","operationId":"update_sink_v1_sinks__sink_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sink_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sink Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SinkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SinkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sinks"],"summary":"Delete Sink","operationId":"delete_sink_v1_sinks__sink_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sink_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sink Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sinks/{sink_id}/test":{"post":{"tags":["sinks"],"summary":"Test Sink","description":"Send a test message to the channel so you can confirm the hookup.","operationId":"test_sink_v1_sinks__sink_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sink_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sink Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcasts":{"post":{"tags":["broadcasts"],"summary":"Create Broadcast","description":"Queue a one-off broadcast to all confirmed subscribers.\n\nDelivery is performed by the worker, debiting one credit per email. With no\ncredits, sends fail with `insufficient_credits` — there is no free tier.\n\nPass an `Idempotency-Key` header to make retries safe: a repeat with the same\nkey returns the original broadcast instead of creating a duplicate.","operationId":"create_broadcast_v1_broadcasts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["broadcasts"],"summary":"List Broadcasts","operationId":"list_broadcasts_v1_broadcasts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BroadcastOut"},"title":"Response List Broadcasts V1 Broadcasts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcasts/{broadcast_id}":{"get":{"tags":["broadcasts"],"summary":"Get Broadcast","operationId":"get_broadcast_v1_broadcasts__broadcast_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"broadcast_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Broadcast Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcasts/{broadcast_id}/preview":{"get":{"tags":["broadcasts"],"summary":"Preview Broadcast","description":"Render the broadcast exactly as recipients will see it (HTML + plain text),\nwithout sending. Free — no credit is charged.","operationId":"preview_broadcast_v1_broadcasts__broadcast_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"broadcast_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Broadcast Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcasts/{broadcast_id}/test":{"post":{"tags":["broadcasts"],"summary":"Test Send Broadcast","description":"Send a one-off test copy of this broadcast to a single address so you can\nconfirm rendering before it goes to the list. Debits one credit (it is a real\nemail); does not create Send rows or touch the broadcast's status.","operationId":"test_send_broadcast_v1_broadcasts__broadcast_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"broadcast_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Broadcast Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/topup":{"post":{"tags":["billing"],"summary":"Create Topup","description":"Create a Stripe Checkout session to buy prepaid email credits.","operationId":"create_topup_v1_billing_topup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/billing/transactions":{"get":{"tags":["billing"],"summary":"List Transactions","description":"Credit ledger: top-ups and per-email debits, newest first.","operationId":"list_transactions_v1_billing_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionOut"},"title":"Response List Transactions V1 Billing Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/setup":{"post":{"tags":["billing"],"summary":"Save Card","description":"Start a Stripe Checkout session (setup mode) to save a card for\nauto-recharge. The saved card becomes the customer's default on completion.","operationId":"save_card_v1_billing_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutUrl"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/billing/portal":{"post":{"tags":["billing"],"summary":"Billing Portal","description":"Stripe billing-portal link for managing saved cards and invoices.","operationId":"billing_portal_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutUrl"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/billing/auto-recharge":{"get":{"tags":["billing"],"summary":"Get Auto Recharge","operationId":"get_auto_recharge_v1_billing_auto_recharge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeSettings"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["billing"],"summary":"Update Auto Recharge","operationId":"update_auto_recharge_v1_billing_auto_recharge_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Stripe webhook: credit the account when a top-up payment succeeds.","operationId":"stripe_webhook_v1_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/domains":{"post":{"tags":["domains"],"summary":"Create Domain","description":"Register a sending domain and get the DNS records to add. The response's\n`provider_status` tells you whether registration with the email provider\nsucceeded (`pending`) or failed (`error`).","operationId":"create_domain_v1_domains_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["domains"],"summary":"List Domains","operationId":"list_domains_v1_domains_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DomainOut"},"title":"Response List Domains V1 Domains Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain_id}":{"get":{"tags":["domains"],"summary":"Get Domain","description":"Fetch a domain. For unverified domains this refreshes `provider_status`\nlive from the provider, so you can poll whether DKIM/SPF has propagated.","operationId":"get_domain_v1_domains__domain_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Domain Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["domains"],"summary":"Delete Domain","operationId":"delete_domain_v1_domains__domain_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Domain Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain_id}/verify":{"post":{"tags":["domains"],"summary":"Verify Domain","description":"Confirm the ownership challenge TXT and that the email provider has verified\nthe domain's DKIM/SPF — only then can it actually send. Re-registers with the\nprovider first if an earlier attempt failed.","operationId":"verify_domain_v1_domains__domain_id__verify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Domain Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/subscribe":{"post":{"tags":["public"],"summary":"Public Subscribe","operationId":"public_subscribe_v1_public_subscribe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_public_subscribe_v1_public_subscribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/preview":{"get":{"tags":["public"],"summary":"Public Preview","description":"SSRF-guarded server-side fetch of an RSS/Atom feed for the browser preview\ntool. Most feeds don't send CORS headers, so the browser can't fetch them\ndirectly; this proxies the fetch (validating the target is a public host and\ncapping the body) and returns the raw feed. Parsing/rendering stays client-side.\nUnauthenticated but rate-limited per IP.","operationId":"public_preview_v1_public_preview_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","maxLength":2048,"title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/o/{send_id}.gif":{"get":{"tags":["tracking"],"summary":"Track Open","operationId":"track_open_e_o__send_id__gif_get","parameters":[{"name":"send_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Send Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/c/o/{token}.gif":{"get":{"tags":["tracking"],"summary":"Track Confirmation Open","description":"Open pixel for the double opt-in email — stamps confirmation_opened_at.","operationId":"track_confirmation_open_c_o__token__gif_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/c/{send_id}":{"get":{"tags":["tracking"],"summary":"Track Click","operationId":"track_click_e_c__send_id__get","parameters":[{"name":"send_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Send Id"}},{"name":"u","in":"query","required":true,"schema":{"type":"string","title":"U"}},{"name":"s","in":"query","required":false,"schema":{"type":"string","default":"","title":"S"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook-endpoints":{"post":{"tags":["webhooks"],"summary":"Create Endpoint","description":"Register a URL to receive signed event callbacks (subscriber.confirmed,\nsubscriber.bounced/complained, broadcast.sent). Verify with the returned secret.","operationId":"create_endpoint_v1_webhook_endpoints_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"List Endpoints","operationId":"list_endpoints_v1_webhook_endpoints_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointOut"},"title":"Response List Endpoints V1 Webhook Endpoints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook-endpoints/{endpoint_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Deliveries","description":"Delivery log for one endpoint, newest first: every event we tried to\nsend, its status (pending/delivered/failed), attempts, and last error.","operationId":"list_deliveries_v1_webhook_endpoints__endpoint_id__deliveries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keyset cursor: created_at < before","title":"Before"},"description":"Keyset cursor: created_at < before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryOut"},"title":"Response List Deliveries V1 Webhook Endpoints  Endpoint Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook-endpoints/{endpoint_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Endpoint","operationId":"delete_endpoint_v1_webhook_endpoints__endpoint_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Endpoint Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/resend":{"post":{"tags":["webhooks"],"summary":"Resend Webhook","description":"Resend delivery/bounce/complaint events.\n\nBounces and complaints suppress the subscriber so they're never emailed again\n(protecting sender reputation). Verified with Svix when a secret is configured.","operationId":"resend_webhook_v1_webhooks_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks/ses":{"post":{"tags":["webhooks"],"summary":"Ses Webhook","description":"Amazon SES bounce/complaint notifications delivered via SNS.\n\nHandles the SNS SubscriptionConfirmation handshake (auto-confirms) and\nNotification messages, suppressing bounced/complained subscribers. Dedups on\nthe SNS MessageId. The SNS signature is verified (EMIT_SES_VERIFY_SNS).","operationId":"ses_webhook_v1_webhooks_ses_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"tags":["meta"],"summary":"Metrics","description":"Prometheus-format gauges of aggregate state. No PII — aggregate counts only.\n\nIf EMIT_METRICS_TOKEN is set, requires `Authorization: Bearer <token>`.","operationId":"metrics_metrics_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"get":{"tags":["mcp"],"summary":"Mcp Get","description":"No server-initiated stream; clients use POST for request/response.","operationId":"mcp_get_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Endpoint","description":"Streamable HTTP MCP endpoint. Accepts a JSON-RPC request (or batch).","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health","description":"Readiness: returns 503 if the database is unreachable.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["name","email"],"title":"AccountCreate"},"AccountCreated":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"credit_balance":{"type":"integer","title":"Credit Balance"},"api_key_prefix":{"type":"string","title":"Api Key Prefix"},"public_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Token"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"track_opens":{"type":"boolean","title":"Track Opens","default":true},"track_clicks":{"type":"boolean","title":"Track Clicks","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["id","name","email","credit_balance","api_key_prefix","created_at","api_key"],"title":"AccountCreated"},"AccountOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"credit_balance":{"type":"integer","title":"Credit Balance"},"api_key_prefix":{"type":"string","title":"Api Key Prefix"},"public_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Token"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"track_opens":{"type":"boolean","title":"Track Opens","default":true},"track_clicks":{"type":"boolean","title":"Track Clicks","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","email","credit_balance","api_key_prefix","created_at"],"title":"AccountOut"},"AccountUpdate":{"properties":{"track_opens":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track Opens"},"track_clicks":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track Clicks"}},"type":"object","title":"AccountUpdate"},"AnalyticsOut":{"properties":{"credit_balance":{"type":"integer","title":"Credit Balance"},"feeds":{"type":"integer","title":"Feeds"},"subscribers_total":{"type":"integer","title":"Subscribers Total"},"subscribers_confirmed":{"type":"integer","title":"Subscribers Confirmed"},"subscribers_pending":{"type":"integer","title":"Subscribers Pending"},"subscribers_unsubscribed":{"type":"integer","title":"Subscribers Unsubscribed"},"broadcasts":{"type":"integer","title":"Broadcasts"},"emails_sent":{"type":"integer","title":"Emails Sent"},"emails_failed":{"type":"integer","title":"Emails Failed"},"emails_queued":{"type":"integer","title":"Emails Queued"},"emails_opened":{"type":"integer","title":"Emails Opened","default":0},"emails_clicked":{"type":"integer","title":"Emails Clicked","default":0}},"type":"object","required":["credit_balance","feeds","subscribers_total","subscribers_confirmed","subscribers_pending","subscribers_unsubscribed","broadcasts","emails_sent","emails_failed","emails_queued"],"title":"AnalyticsOut"},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"ApiKeyCreated":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["id","name","key_prefix","created_at","api_key"],"title":"ApiKeyCreated"},"ApiKeyOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key_prefix","created_at"],"title":"ApiKeyOut"},"AutoRechargeSettings":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold":{"type":"integer","title":"Threshold"},"amount_usd":{"type":"number","title":"Amount Usd"},"has_card":{"type":"boolean","title":"Has Card"}},"type":"object","required":["enabled","threshold","amount_usd","has_card"],"title":"AutoRechargeSettings"},"AutoRechargeUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"threshold":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Threshold"},"amount_usd":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount Usd"}},"type":"object","title":"AutoRechargeUpdate"},"Body_public_subscribe_v1_public_subscribe_post":{"properties":{"token":{"type":"string","title":"Token"},"email":{"type":"string","title":"Email"},"hp":{"type":"string","title":"Hp","default":""},"redirect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect"}},"type":"object","required":["token","email"],"title":"Body_public_subscribe_v1_public_subscribe_post"},"BroadcastCreate":{"properties":{"subject":{"type":"string","maxLength":1024,"minLength":1,"title":"Subject"},"body_html":{"type":"string","title":"Body Html"},"feed_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Feed Id"}},"type":"object","required":["subject","body_html"],"title":"BroadcastCreate"},"BroadcastOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"subject":{"type":"string","title":"Subject"},"status":{"type":"string","title":"Status"},"recipient_count":{"type":"integer","title":"Recipient Count"},"feed_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Feed Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"}},"type":"object","required":["id","subject","status","recipient_count","feed_id","created_at","sent_at"],"title":"BroadcastOut"},"BroadcastPreview":{"properties":{"subject":{"type":"string","title":"Subject"},"html":{"type":"string","title":"Html"},"text":{"type":"string","title":"Text"}},"type":"object","required":["subject","html","text"],"title":"BroadcastPreview"},"BroadcastStat":{"properties":{"broadcast_id":{"type":"string","format":"uuid","title":"Broadcast Id"},"subject":{"type":"string","title":"Subject"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"sent":{"type":"integer","title":"Sent"},"opened":{"type":"integer","title":"Opened"},"clicked":{"type":"integer","title":"Clicked"}},"type":"object","required":["broadcast_id","subject","sent_at","sent","opened","clicked"],"title":"BroadcastStat","description":"Per-broadcast open/click counts, derived from the sends of one broadcast."},"CheckoutUrl":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"CheckoutUrl"},"DnsRecord":{"properties":{"type":{"type":"string","title":"Type"},"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["type","name","value"],"title":"DnsRecord"},"DomainCreate":{"properties":{"domain":{"type":"string","maxLength":255,"minLength":3,"title":"Domain"}},"type":"object","required":["domain"],"title":"DomainCreate"},"DomainOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"domain":{"type":"string","title":"Domain"},"status":{"type":"string","title":"Status"},"provider_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"},"dns_records":{"items":{"$ref":"#/components/schemas/DnsRecord"},"type":"array","title":"Dns Records","default":[]}},"type":"object","required":["id","domain","status","created_at","verified_at"],"title":"DomainOut"},"FeedCreate":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"from_email":{"type":"string","format":"email","title":"From Email"},"schedule":{"type":"string","enum":["on_publish","daily","weekly"],"title":"Schedule","default":"on_publish"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"digest_hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Digest Hour","default":9},"digest_weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Digest Weekday","default":0},"digest_tz":{"type":"string","title":"Digest Tz","default":"UTC"},"template_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Html"}},"type":"object","required":["url","from_email"],"title":"FeedCreate"},"FeedOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"schedule":{"type":"string","title":"Schedule"},"from_email":{"type":"string","title":"From Email"},"active":{"type":"boolean","title":"Active"},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"digest_hour":{"type":"integer","title":"Digest Hour"},"digest_weekday":{"type":"integer","title":"Digest Weekday"},"digest_tz":{"type":"string","title":"Digest Tz"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","title","schedule","from_email","active","last_polled_at","digest_hour","digest_weekday","digest_tz","created_at"],"title":"FeedOut"},"FeedTest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["url"],"title":"FeedTest"},"FeedTestResult":{"properties":{"ok":{"type":"boolean","title":"Ok"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"item_count":{"type":"integer","title":"Item Count","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["ok"],"title":"FeedTestResult"},"FeedUpdate":{"properties":{"from_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"From Email"},"schedule":{"anyOf":[{"type":"string","enum":["on_publish","daily","weekly"]},{"type":"null"}],"title":"Schedule"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"template_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Html"},"digest_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Digest Hour"},"digest_weekday":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Digest Weekday"},"digest_tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Digest Tz"}},"type":"object","title":"FeedUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportResult":{"properties":{"created":{"type":"integer","title":"Created"},"skipped":{"type":"integer","title":"Skipped"},"invalid":{"type":"integer","title":"Invalid"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["created","skipped","invalid","total"],"title":"ImportResult"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"LoginRequest"},"SessionOut":{"properties":{"session_token":{"type":"string","title":"Session Token"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["session_token","expires_at"],"title":"SessionOut"},"SinkCreate":{"properties":{"kind":{"type":"string","enum":["slack","discord"],"title":"Kind"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"feed_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Feed Url"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"template":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Template"}},"type":"object","required":["kind","url","feed_url"],"title":"SinkCreate"},"SinkOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"feed_url":{"type":"string","title":"Feed Url"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template"},"active":{"type":"boolean","title":"Active"},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","kind","name","url","feed_url","template","active","last_polled_at","created_at"],"title":"SinkOut"},"SinkUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"template":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Template"},"feed_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Feed Url"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"SinkUpdate"},"Snippet":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"language":{"type":"string","title":"Language"},"description":{"type":"string","title":"Description"},"code":{"type":"string","title":"Code"}},"type":"object","required":["id","name","language","description","code"],"title":"Snippet"},"SubscriberCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"SubscriberCreate"},"SubscriberImport":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":5000,"minItems":1,"title":"Emails"},"confirmed":{"type":"boolean","title":"Confirmed","default":false}},"type":"object","required":["emails"],"title":"SubscriberImport"},"SubscriberOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"confirmation_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmation Sent At"},"confirmation_opened_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmation Opened At"}},"type":"object","required":["id","email","status","created_at","confirmed_at"],"title":"SubscriberOut"},"TestSend":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"TestSend"},"TestSendResult":{"properties":{"sent":{"type":"boolean","title":"Sent"},"to":{"type":"string","title":"To"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"}},"type":"object","required":["sent","to"],"title":"TestSendResult"},"TopupCreate":{"properties":{"amount_usd":{"type":"number","exclusiveMinimum":0.0,"title":"Amount Usd","description":"USD to add; converted to email credits."}},"type":"object","required":["amount_usd"],"title":"TopupCreate"},"TopupOut":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"amount_usd":{"type":"number","title":"Amount Usd"},"credits":{"type":"integer","title":"Credits"}},"type":"object","required":["checkout_url","amount_usd","credits"],"title":"TopupOut"},"TransactionOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"delta":{"type":"integer","title":"Delta"},"balance_after":{"type":"integer","title":"Balance After"},"reason":{"type":"string","title":"Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","delta","balance_after","reason","created_at"],"title":"TransactionOut"},"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"},"VerifyRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":8,"title":"Token"}},"type":"object","required":["token"],"title":"VerifyRequest"},"WatcherCreate":{"properties":{"prompt":{"anyOf":[{"type":"string","maxLength":4000,"minLength":10},{"type":"null"}],"title":"Prompt"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"cadence":{"type":"string","enum":["hourly","6h","daily"],"title":"Cadence","default":"6h"},"threshold":{"type":"string","enum":["loose","balanced","strict"],"title":"Threshold","default":"balanced"},"summarize":{"type":"boolean","title":"Summarize","default":false},"sources":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","maxItems":50,"title":"Sources","default":[]},"discover":{"type":"boolean","title":"Discover","default":true}},"type":"object","title":"WatcherCreate"},"WatcherDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"status":{"type":"string","title":"Status"},"cadence":{"type":"string","title":"Cadence"},"threshold":{"type":"string","title":"Threshold"},"threshold_offset":{"type":"number","title":"Threshold Offset"},"summarize":{"type":"boolean","title":"Summarize","default":false},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"atom_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atom Url"},"json_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Json Url"},"sources":{"items":{"$ref":"#/components/schemas/WatcherSourceOut"},"type":"array","title":"Sources","default":[]},"source_errors":{"items":{"type":"string"},"type":"array","title":"Source Errors","default":[]}},"type":"object","required":["id","name","prompt","status","cadence","threshold","threshold_offset","last_polled_at","created_at"],"title":"WatcherDetail"},"WatcherDiscoveryResult":{"properties":{"added":{"items":{"$ref":"#/components/schemas/WatcherSourceOut"},"type":"array","title":"Added"},"candidates_seen":{"type":"integer","title":"Candidates Seen"},"discovery_available":{"type":"boolean","title":"Discovery Available"}},"type":"object","required":["added","candidates_seen","discovery_available"],"title":"WatcherDiscoveryResult"},"WatcherFeedback":{"properties":{"direction":{"type":"string","enum":["more","less"],"title":"Direction"}},"type":"object","required":["direction"],"title":"WatcherFeedback"},"WatcherItemOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Id"},"guid":{"type":"string","title":"Guid"},"title":{"type":"string","title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"summary":{"type":"string","title":"Summary"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"emitted":{"type":"boolean","title":"Emitted"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","source_id","guid","title","url","summary","published_at","score","reason","emitted","feedback","created_at"],"title":"WatcherItemOut"},"WatcherOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"status":{"type":"string","title":"Status"},"cadence":{"type":"string","title":"Cadence"},"threshold":{"type":"string","title":"Threshold"},"threshold_offset":{"type":"number","title":"Threshold Offset"},"summarize":{"type":"boolean","title":"Summarize","default":false},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"atom_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atom Url"},"json_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Json Url"}},"type":"object","required":["id","name","prompt","status","cadence","threshold","threshold_offset","last_polled_at","created_at"],"title":"WatcherOut"},"WatcherPipe":{"properties":{"from_email":{"type":"string","format":"email","title":"From Email"},"schedule":{"type":"string","enum":["on_publish","daily","weekly"],"title":"Schedule","default":"daily"},"digest_hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Digest Hour","default":9},"digest_weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Digest Weekday","default":0},"digest_tz":{"type":"string","title":"Digest Tz","default":"UTC"}},"type":"object","required":["from_email"],"title":"WatcherPipe","description":"Register this watcher's feed as a newsletter source in one action."},"WatcherSourceAdd":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["url"],"title":"WatcherSourceAdd"},"WatcherSourceOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_url":{"type":"string","title":"Site Url"},"feed_url":{"type":"string","title":"Feed Url"},"kind":{"type":"string","title":"Kind","default":"feed"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale"},"origin":{"type":"string","title":"Origin"},"active":{"type":"boolean","title":"Active"},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"item_count":{"type":"integer","title":"Item Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","site_url","feed_url","title","rationale","origin","active","last_polled_at","item_count","created_at"],"title":"WatcherSourceOut"},"WatcherUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"prompt":{"anyOf":[{"type":"string","maxLength":4000,"minLength":10},{"type":"null"}],"title":"Prompt"},"cadence":{"anyOf":[{"type":"string","enum":["hourly","6h","daily"]},{"type":"null"}],"title":"Cadence"},"threshold":{"anyOf":[{"type":"string","enum":["loose","balanced","strict"]},{"type":"null"}],"title":"Threshold"},"summarize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Summarize"},"status":{"anyOf":[{"type":"string","enum":["active","paused"]},{"type":"null"}],"title":"Status"}},"type":"object","title":"WatcherUpdate"},"WebhookDeliveryOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"endpoint_id":{"type":"string","format":"uuid","title":"Endpoint Id"},"event_type":{"type":"string","title":"Event Type"},"status":{"type":"string","title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Attempt At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"}},"type":"object","required":["id","endpoint_id","event_type","status","attempts","next_attempt_at","last_error","created_at","delivered_at"],"title":"WebhookDeliveryOut"},"WebhookEndpointCreate":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events","default":["*"]}},"type":"object","required":["url"],"title":"WebhookEndpointCreate"},"WebhookEndpointOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"type":"string","title":"Events"},"secret":{"type":"string","title":"Secret"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","events","secret","active","created_at"],"title":"WebhookEndpointOut"}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"Your emit_live_… API key","scheme":"bearer"}}}}