{"openapi":"3.1.0","info":{"title":"Bodega CRM API","version":"2.0.0","description":"Pigeon Labs' API-first cold email CRM. Authenticate every request with `Authorization: Bearer bdg_...`.\n\nTemplate variables in step/magnet bodies: {{first_name}}, {{last_name}}, {{full_name}}, {{title}}, {{company_name}}, {{company_domain}}, {{research.<key>}}; use {{first_name|there}} for a fallback.\n\nA lead may be in only one live (active/paused) sequence at a time. Replies, bounces, complaints, and unsubscribes end the enrollment automatically."},"servers":[{"url":"https://bodega.artoo.love/api/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Bodega API key (bdg_...)"}}},"paths":{"/stats":{"get":{"summary":"Pipeline overview","tags":["Overview"],"responses":{"200":{"description":"Overview stats"},"401":{"description":"Missing or invalid API key"}}}},"/leads":{"get":{"summary":"List leads","tags":["Leads"],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["new","contacted","replied","interested","meeting_booked","not_interested","unsubscribed","bounced","customer","lost"]},{"type":"array","items":{"type":"string","enum":["new","contacted","replied","interested","meeting_booked","not_interested","unsubscribed","bounced","customer","lost"]}}]}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","enum":["web_inbound","cold_email"]}},{"name":"campaign_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"tag","in":"query","required":false,"schema":{"type":"string"}},{"name":"email_status","in":"query","required":false,"schema":{"type":"string"}},{"name":"company_domain","in":"query","required":false,"schema":{"type":"string"}},{"name":"has_live_enrollment","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"sort","in":"query","required":false,"schema":{"default":"created_at","type":"string","enum":["created_at","updated_at","last_contacted_at","last_inbound_at","company_name","email"]}},{"name":"order","in":"query","required":false,"schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Paginated leads"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create lead","tags":["Leads"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"first_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"full_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"title":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"linkedin_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"twitter_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"phone":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_domain":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_website":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"company_industry":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_size":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_location":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"stage":{"type":"string","enum":["new","contacted","replied","interested","meeting_booked","not_interested","unsubscribed","bounced","customer","lost"]},"source":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"campaign_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"notes":{"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}]},"research":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"custom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"do_not_contact":{"type":"boolean"}},"required":["email"]}}}},"responses":{"201":{"description":"Lead"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/leads/bulk":{"post":{"summary":"Bulk create/update leads","tags":["Leads"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"leads":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"first_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"full_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"title":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"linkedin_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"twitter_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"phone":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_domain":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_website":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"company_industry":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_size":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_location":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"stage":{"type":"string","enum":["new","contacted","replied","interested","meeting_booked","not_interested","unsubscribed","bounced","customer","lost"]},"source":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"campaign_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"notes":{"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}]},"research":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"custom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"do_not_contact":{"type":"boolean"}},"required":["email"]}},"on_conflict":{"default":"skip","type":"string","enum":["skip","update"]}},"required":["leads"]}}}},"responses":{"200":{"description":"Import summary"},"401":{"description":"Missing or invalid API key"}}}},"/leads/{id}":{"get":{"summary":"Get lead (with live enrollment)","tags":["Leads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Lead"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update lead","tags":["Leads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"first_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"full_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"title":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"linkedin_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"twitter_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"phone":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_name":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_domain":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_website":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"company_industry":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_size":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"company_location":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"stage":{"type":"string","enum":["new","contacted","replied","interested","meeting_booked","not_interested","unsubscribed","bounced","customer","lost"]},"source":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"campaign_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"notes":{"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}]},"research":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"custom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"do_not_contact":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Lead"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete lead","tags":["Leads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"204":{"description":"Deleted"}}}},"/leads/{id}/emails":{"get":{"summary":"Lead email thread","tags":["Leads"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Emails oldest first"},"401":{"description":"Missing or invalid API key"}}}},"/leads/{id}/find-email":{"post":{"summary":"Hunter Email Finder for this lead","tags":["Enrichment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"domain":{"type":"string"},"company":{"type":"string"},"apply":{"default":true,"type":"boolean"}}}}}},"responses":{"200":{"description":"Finder result and updated lead"},"401":{"description":"Missing or invalid API key"}}}},"/leads/{id}/verify-email":{"post":{"summary":"Hunter Email Verifier for this lead","tags":["Enrichment"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Verifier result and updated lead"},"401":{"description":"Missing or invalid API key"}}}},"/leads/{id}/enroll":{"post":{"summary":"Enroll lead in a sequence","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sequence_id":{"type":"string"},"replace_existing":{"default":false,"type":"boolean"},"start_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["sequence_id"]}}}},"responses":{"200":{"description":"Enrollment result"},"401":{"description":"Missing or invalid API key"}}}},"/enrichment/find-email":{"post":{"summary":"Hunter Email Finder","tags":["Enrichment"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"domain":{"type":"string"},"company":{"type":"string"}},"required":["first_name","last_name"]}}}},"responses":{"200":{"description":"Finder result"},"401":{"description":"Missing or invalid API key"}}}},"/enrichment/verify-email":{"post":{"summary":"Hunter Email Verifier","tags":["Enrichment"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}}},"responses":{"200":{"description":"Verifier result"},"401":{"description":"Missing or invalid API key"}}}},"/campaigns":{"get":{"summary":"List campaigns (grouping tags)","tags":["Campaigns"],"responses":{"200":{"description":"Campaigns with counts"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create campaign","tags":["Campaigns"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"status":{"type":"string","enum":["active","archived"]},"is_default_landing":{"type":"boolean"}},"required":["name"]}}}},"responses":{"201":{"description":"Campaign"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/campaigns/{id}":{"get":{"summary":"Get campaign","tags":["Campaigns"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID or slug"}],"responses":{"200":{"description":"Campaign"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update campaign","tags":["Campaigns"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID or slug"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"status":{"type":"string","enum":["active","archived"]},"is_default_landing":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Campaign"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete campaign","tags":["Campaigns"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID or slug"}],"responses":{"204":{"description":"Deleted"}}}},"/sequences":{"get":{"summary":"List sequences with stats","tags":["Sequences"],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","active","paused","archived"]}},{"name":"campaign_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Sequences"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create sequence (steps may be inlined)","tags":["Sequences"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"status":{"type":"string","enum":["draft","active","paused","archived"]},"campaign_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"from_name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"from_email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"reply_to":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"send_window":{"type":"object","properties":{"days":{"minItems":1,"maxItems":7,"type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"start_hour":{"type":"integer","minimum":0,"maximum":23},"end_hour":{"type":"integer","minimum":1,"maximum":24},"timezone":{"type":"string","minLength":1}},"required":["days","start_hour","end_hour","timezone"]},"stop_on_reply":{"type":"boolean"},"daily_send_limit":{"anyOf":[{"type":"integer","minimum":1,"maximum":5000},{"type":"null"}]},"steps":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"position":{"type":"integer","minimum":1,"maximum":9007199254740991},"name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"delay_hours":{"type":"number","minimum":0},"delay_days":{"type":"number","minimum":0},"subject":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"type":"string","enum":["text","markdown","html"]},"thread_with_previous":{"type":"boolean"},"lead_magnet_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"condition_prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"condition_model":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"active":{"type":"boolean"}},"required":["body"]}}},"required":["name"]}}}},"responses":{"201":{"description":"Sequence with steps"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/sequences/{id}":{"get":{"summary":"Get sequence with steps and stats","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"responses":{"200":{"description":"Sequence"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update sequence / change status","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"status":{"type":"string","enum":["draft","active","paused","archived"]},"campaign_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"from_name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"from_email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"reply_to":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"send_window":{"type":"object","properties":{"days":{"minItems":1,"maxItems":7,"type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"start_hour":{"type":"integer","minimum":0,"maximum":23},"end_hour":{"type":"integer","minimum":1,"maximum":24},"timezone":{"type":"string","minLength":1}},"required":["days","start_hour","end_hour","timezone"]},"stop_on_reply":{"type":"boolean"},"daily_send_limit":{"anyOf":[{"type":"integer","minimum":1,"maximum":5000},{"type":"null"}]}}}}}},"responses":{"200":{"description":"Sequence"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete sequence","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"responses":{"204":{"description":"Deleted"}}}},"/sequences/{id}/steps":{"get":{"summary":"List steps","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"responses":{"200":{"description":"Steps"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Add step","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"position":{"type":"integer","minimum":1,"maximum":9007199254740991},"name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"delay_hours":{"type":"number","minimum":0},"delay_days":{"type":"number","minimum":0},"subject":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"type":"string","enum":["text","markdown","html"]},"thread_with_previous":{"type":"boolean"},"lead_magnet_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"condition_prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"condition_model":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"active":{"type":"boolean"}},"required":["body"]}}}},"responses":{"201":{"description":"Step"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/sequences/{id}/steps/reorder":{"post":{"summary":"Reorder steps","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"step_ids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["step_ids"]}}}},"responses":{"200":{"description":"Steps"},"401":{"description":"Missing or invalid API key"}}}},"/sequences/{id}/steps/{stepId}":{"get":{"summary":"Get step","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Step"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update step","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"position":{"type":"integer","minimum":1,"maximum":9007199254740991},"name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"delay_hours":{"type":"number","minimum":0},"delay_days":{"type":"number","minimum":0},"subject":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"type":"string","enum":["text","markdown","html"]},"thread_with_previous":{"type":"boolean"},"lead_magnet_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"condition_prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"condition_model":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Step"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete step","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"204":{"description":"Deleted"}}}},"/sequences/{id}/enrollments":{"get":{"summary":"List enrollments","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","paused","completed","replied","bounced","unsubscribed","exited"]}},{"name":"limit","in":"query","required":false,"schema":{"default":100,"type":"integer","minimum":1,"maximum":500}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Enrollments"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Enroll leads","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_ids":{"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"emails":{"maxItems":500,"type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"replace_existing":{"default":false,"type":"boolean"},"start_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}}}}},"responses":{"201":{"description":"Enrolled + skipped"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/sequences/{id}/enrollments/{enrollmentId}":{"get":{"summary":"Get enrollment with step executions","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Enrollment"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"pause | resume | exit | skip_step | reschedule","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["pause","resume","exit","skip_step","reschedule"]},"reason":{"type":"string","maxLength":500},"next_step_due_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["action"]}}}},"responses":{"200":{"description":"Enrollment"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Exit enrollment","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Enrollment"},"401":{"description":"Missing or invalid API key"}}}},"/sequences/{id}/preview":{"get":{"summary":"Render every step for a lead","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"lead_id","in":"query","schema":{"type":"string"}},{"name":"email","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Rendered steps with schedule and unresolved tokens"},"401":{"description":"Missing or invalid API key"}}}},"/sequences/{id}/run":{"post":{"summary":"Process due steps now","tags":["Sequences"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence UUID or slug"},{"name":"force","in":"query","schema":{"type":"boolean"},"description":"Ignore send window"}],"responses":{"200":{"description":"Run summary"},"401":{"description":"Missing or invalid API key"}}}},"/emails":{"get":{"summary":"Delivery log","tags":["Email"],"parameters":[{"name":"lead_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"sequence_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"thread_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["inbound","outbound"]}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Emails"},"401":{"description":"Missing or invalid API key"}}}},"/emails/send":{"post":{"summary":"Send a one-off email or reply","tags":["Email"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"to":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"subject":{"default":"","type":"string","maxLength":300},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"default":"text","type":"string","enum":["text","markdown","html"]},"reply_to_email_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"from_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"from_email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"lead_magnet_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"include_signature":{"default":true,"type":"boolean"}},"required":["body"]}}}},"responses":{"201":{"description":"Email"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/emails/{id}":{"get":{"summary":"Get email","tags":["Email"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Email"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Mark read / handled","tags":["Email"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"is_read":{"type":"boolean"},"handled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Email"},"401":{"description":"Missing or invalid API key"}}}},"/threads/{threadId}":{"get":{"summary":"Get thread","tags":["Email"],"parameters":[{"name":"threadId","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Emails oldest first"},"401":{"description":"Missing or invalid API key"}}}},"/inbox":{"get":{"summary":"Inbound replies","tags":["Email"],"parameters":[{"name":"unhandled_only","in":"query","required":false,"schema":{"default":"true","type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Inbound emails"},"401":{"description":"Missing or invalid API key"}}}},"/templates":{"get":{"summary":"List templates","tags":["Content"],"parameters":[{"name":"category","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Templates"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create template","tags":["Content"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"subject":{"type":"string","maxLength":300},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"type":"string","enum":["text","markdown","html"]},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"tags":{"maxItems":30,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}}},"required":["name","subject","body"]}}}},"responses":{"201":{"description":"Template"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/templates/{id}":{"get":{"summary":"Get template","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Template"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update template","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"subject":{"type":"string","maxLength":300},"body":{"type":"string","minLength":1,"maxLength":50000},"body_format":{"type":"string","enum":["text","markdown","html"]},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"tags":{"maxItems":30,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}}}}}}},"responses":{"200":{"description":"Template"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete template","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"204":{"description":"Deleted"}}}},"/lead-magnets":{"get":{"summary":"List lead magnets","tags":["Content"],"responses":{"200":{"description":"Lead magnets"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create lead magnet (Markdown → PDF)","tags":["Content"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"body_markdown":{"type":"string","minLength":1,"maxLength":200000},"filename_template":{"type":"string","minLength":1,"maxLength":200}},"required":["name","body_markdown"]}}}},"responses":{"201":{"description":"Lead magnet"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/lead-magnets/{id}":{"get":{"summary":"Get lead magnet","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Lead magnet"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update lead magnet","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"slug":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"body_markdown":{"type":"string","minLength":1,"maxLength":200000},"filename_template":{"type":"string","minLength":1,"maxLength":200}}}}}},"responses":{"200":{"description":"Lead magnet"},"401":{"description":"Missing or invalid API key"}}},"delete":{"summary":"Delete lead magnet","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"204":{"description":"Deleted"}}}},"/lead-magnets/{id}/preview":{"get":{"summary":"Render personalized PDF","tags":["Content"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"},{"name":"lead_id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"application/pdf"}}}},"/ai/models":{"get":{"summary":"Novita model presets (and catalog with ?all=true)","tags":["Settings"],"parameters":[{"name":"all","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Models"},"401":{"description":"Missing or invalid API key"}}}},"/settings":{"get":{"summary":"Sender identity, AI default model, integrations","tags":["Settings"],"responses":{"200":{"description":"Settings"},"401":{"description":"Missing or invalid API key"}}},"patch":{"summary":"Update settings","tags":["Settings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ai":{"type":"object","properties":{"default_model":{"type":"string"}}},"sender":{"type":"object","properties":{"from_name":{"type":"string"},"from_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"reply_to":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"signature":{"type":"string"}}}}}}}},"responses":{"200":{"description":"Settings"},"401":{"description":"Missing or invalid API key"}}}},"/api-keys":{"get":{"summary":"List API keys (console session only)","tags":["Settings"],"responses":{"200":{"description":"Keys"},"401":{"description":"Missing or invalid API key"}}},"post":{"summary":"Create API key (console session only)","tags":["Settings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}},"responses":{"201":{"description":"Key (plaintext returned once)"},"400":{"description":"Validation failed"},"409":{"description":"Conflict"}}}},"/api-keys/{id}":{"delete":{"summary":"Revoke API key (console session only)","tags":["Settings"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"UUID"}],"responses":{"200":{"description":"Revoked key"},"401":{"description":"Missing or invalid API key"}}}}}}