{"openapi":"3.1.0","info":{"title":"Djinnletter API","version":"0.18.0","description":"Delivery infrastructure for newsletters authored by external agents. The current transitional golden path is: create a draft newsletter, add and reorder topics, approve the newsletter, then send it immediately or set scheduled_for for the delivery tick. Topics and generation_config.targetTagIds remain a deprecated compatibility bridge until Campaign v2. Bearer keys use workspace:read for delivery reads, workspace:write for delivery mutations, and keys:read or keys:write for API-key management. Each supported agent operation declares x-required-scopes.","contact":{"name":"Djinnletter Support","email":"support@djinnletter.com"},"license":{"name":"Proprietary"}},"servers":[{"url":"/api/v1","description":"Current origin"},{"url":"http://localhost:8787/api/v1","description":"Local dev"}],"tags":[{"name":"workspaces","description":"Publication workspaces and members"},{"name":"api-keys","description":"Agent API-key management"},{"name":"subscribers","description":"Newsletter audience"},{"name":"tags","description":"Subscriber segmentation"},{"name":"topics","description":"Deprecated newsletter content bridge"},{"name":"newsletters","description":"Draft, approval, scheduling, and delivery"},{"name":"templates","description":"System and immutable custom email templates"},{"name":"assets","description":"Workspace image assets and active logo"},{"name":"signup-forms","description":"Embeddable subscriber acquisition form"},{"name":"metrics","description":"Delivery and engagement metrics"},{"name":"alerts","description":"System and delivery alerts"},{"name":"webhooks","description":"Outgoing event notifications"},{"name":"domains","description":"Sender-domain verification"},{"name":"admin","description":"Read-only platform operator views for explicitly provisioned human sessions"},{"name":"billing","description":"Prepaid email credits and embedded payment settings"},{"name":"health","description":"Database and email readiness"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_*"},"SessionCookie":{"type":"apiKey","in":"cookie","name":"better-auth.session_token"}},"schemas":{"OpenApiDocument":{"type":"object","additionalProperties":true},"SuccessResponse":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]}},"additionalProperties":false},"Workspace":{"type":"object","required":["id","name","slug","from_email","from_name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"audience_type":{"type":["string","null"],"enum":["performance","chronic",null]},"primary_color":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"from_email":{"type":"string"},"from_name":{"type":"string"},"voice_guidelines":{"type":["string","null"]},"voice_samples":{"type":["string","null"]},"voice_author":{"type":["string","null"]},"template_style":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"Member":{"type":"object","required":["id","workspace_id","user_id","role","created_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"user_id":{"type":"string"},"role":{"type":"string","enum":["owner","admin","editor","viewer"]},"email":{"type":"string"},"name":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"ApiKey":{"type":"object","required":["id","workspaceId","name","prefix","scopes","lastUsedAt","expiresAt","revokedAt","createdAt"],"properties":{"id":{"type":"string"},"workspaceId":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["workspace:read","workspace:write","keys:read","keys:write"]}},"secret":{"type":"string"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"Tag":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"Subscriber":{"type":"object","required":["id","workspace_id","email","language","status"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["active","unsubscribed","bounced"]},"subscribed_at":{"type":"string","format":"date-time"},"unsubscribed_at":{"type":["string","null"],"format":"date-time"},"last_open_at":{"type":["string","null"],"format":"date-time"},"last_click_at":{"type":["string","null"],"format":"date-time"},"engagement_score":{"type":"number"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false},"Newsletter":{"type":"object","required":["id","workspace_id","language","status"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["draft","ready","sent"]},"week_start":{"type":["string","null"]},"week_end":{"type":["string","null"]},"special_instructions":{"type":["string","null"]},"intro_es":{"type":["string","null"]},"intro_en":{"type":["string","null"]},"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"template_id":{"type":"string"},"html_content":{"type":["string","null"]},"plain_content":{"type":["string","null"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"generation_config":{"type":["object","string","null"],"deprecated":true,"description":"Temporary sender compatibility. Only targetTagIds is delivery-relevant."},"target_tags":{"type":["string","null"]},"version":{"type":"integer"},"generated_at":{"type":["string","null"],"format":"date-time"},"approved_at":{"type":["string","null"],"format":"date-time"},"sent_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"workspace_name":{"type":"string"},"workspace_slug":{"type":"string"},"total_sent":{"type":"integer"},"opens":{"type":"integer"},"clicks":{"type":"integer"}},"additionalProperties":false},"Topic":{"type":"object","required":["id","newsletter_id","position","title_es","title_en","summary_es","summary_en"],"properties":{"id":{"type":"string"},"newsletter_id":{"type":"string"},"position":{"type":"integer"},"title_es":{"type":"string"},"title_en":{"type":"string"},"summary_es":{"type":"string"},"summary_en":{"type":"string"},"source_url":{"type":["string","null"]},"paper_url":{"type":["string","null"]},"image_url":{"type":["string","null"]},"source_type":{"type":["string","null"]},"relevance_score":{"type":["number","null"]},"created_at":{"type":"string","format":"date-time"},"title":{"type":"string"},"summary":{"type":"string"},"newsletter_status":{"type":"string","enum":["draft","ready","sent"]},"newsletter_language":{"type":"string","enum":["es","en"]},"newsletter_workspace_id":{"type":"string"}},"additionalProperties":true,"deprecated":true},"EmailTemplateSummary":{"type":"object","required":["id","family_id","version","name","description","status","type"],"properties":{"id":{"type":"string"},"family_id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":["string","null"]},"status":{"type":"string","enum":["system","active","archived"]},"type":{"type":"string","enum":["system","custom"]}},"additionalProperties":false},"EmailTemplateDetail":{"type":"object","required":["id","family_id","version","name","description","status","type","html","css"],"properties":{"id":{"type":"string"},"family_id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":["string","null"]},"status":{"type":"string","enum":["system","active","archived"]},"type":{"type":"string","enum":["system","custom"]},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false},"BrandAsset":{"type":"object","required":["id","workspace_id","name","mime_type","size_bytes","created_at","url"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"name":{"type":"string"},"mime_type":{"type":"string","enum":["image/png","image/jpeg","image/webp"]},"size_bytes":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"url":{"type":"string","format":"uri"}},"additionalProperties":false},"Alert":{"type":"object","required":["id","workspace_id","type","message","read","created_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"type":{"type":"string","enum":["error","warning","info","success"]},"title":{"type":["string","null"]},"message":{"type":"string"},"context":{"type":["object","null"],"additionalProperties":true},"read":{"type":"integer"},"is_read":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebhookEndpoint":{"type":"object","required":["id","workspaceId","url","events","description","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"workspaceId":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["newsletter.sent","webhook.test"]}},"description":{"type":["string","null"]},"enabled":{"type":"boolean"},"signingSecret":{"type":"string"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastFailureAt":{"type":["string","null"],"format":"date-time"},"consecutiveFailures":{"type":"integer"},"createdByUserId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebhookDelivery":{"type":"object","required":["id","endpointId","event","status","responseStatus","responseBody","attempts","lastAttemptAt","nextAttemptAt","createdAt"],"properties":{"id":{"type":"string"},"endpointId":{"type":"string"},"event":{"type":"string"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"responseStatus":{"type":["integer","null"]},"responseBody":{"type":["string","null"]},"attempts":{"type":"integer"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"Domain":{"type":"object","required":["id","workspace_id","domain","status","region","dns_records","created_at","verified_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["pending","verified","failed"]},"region":{"type":"string"},"dns_records":{"type":"array","items":{"type":"object","additionalProperties":true}},"created_at":{"type":"string","format":"date-time"},"verified_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"SignupForm":{"type":"object","required":["id","workspace_id","public_token","enabled","default_language","privacy_url","created_at","updated_at","rotated_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"public_token":{"type":"string"},"enabled":{"type":"boolean"},"default_language":{"type":"string","enum":["es","en"]},"privacy_url":{"type":"string","format":"uri"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"rotated_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"SignupFormSettings":{"type":"object","required":["sender_ready","form","health"],"properties":{"sender_ready":{"type":"boolean"},"form":{"oneOf":[{"$ref":"#/components/schemas/SignupForm"},{"type":"null"}]},"health":{"type":"object","required":["requests_last_hour","hourly_limit","capacity_reached","delivery_failures_last_24h","last_delivery_failure_at"],"properties":{"requests_last_hour":{"type":"integer"},"hourly_limit":{"type":"integer"},"capacity_reached":{"type":"boolean"},"delivery_failures_last_24h":{"type":"integer"},"last_delivery_failure_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"SignupFormSettingsResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SignupFormSettings"}},"additionalProperties":false},"ImportResult":{"type":"object","required":["imported","skipped","duplicatesInPayload"],"properties":{"imported":{"type":"integer"},"skipped":{"type":"integer"},"duplicatesInPayload":{"type":"integer"},"invalidRows":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"HealthReport":{"type":"object","required":["ok","services","environment"],"properties":{"ok":{"type":"boolean"},"environment":{"type":"string"},"services":{"type":"object","required":["db","email"],"properties":{"db":{"type":"boolean"},"email":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"HealthResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/HealthReport"}},"additionalProperties":false},"NewsletterResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Newsletter"}},"additionalProperties":false},"NewsletterPageResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","page","pageSize","totalPages"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Newsletter"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"NewsletterWithTopicsResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["id","workspace_id","language","status","topics"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["draft","ready","sent"]},"topics":{"type":"array","items":{"$ref":"#/components/schemas/Topic"}}},"additionalProperties":true}},"additionalProperties":false},"NewsletterSendResponse":{"type":"object","required":["success","data","sentTo","failed","errors"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Newsletter"},"sentTo":{"type":"integer"},"failed":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"NewsletterSendReconciliationResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["newsletterId","batchIndex","decision","resumeReady","state"],"properties":{"newsletterId":{"type":"string"},"batchIndex":{"type":"integer"},"decision":{"type":"string","enum":["accepted","rejected"]},"resumeReady":{"type":"boolean"},"state":{"type":"string","enum":["awaiting_reconciliation","completed"]}},"additionalProperties":false}},"additionalProperties":false},"NewsletterSendStatusResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["newsletterId","newsletterStatus","claimState","resumeReady","requiresReconciliation","batches"],"properties":{"newsletterId":{"type":"string"},"newsletterStatus":{"type":"string","enum":["draft","ready","sent"]},"claimState":{"type":["string","null"],"enum":["claimed","provider_started","completed",null]},"resumeReady":{"type":"boolean"},"requiresReconciliation":{"type":"boolean"},"batches":{"type":"array","items":{"type":"object","required":["batchIndex","status","recipientCount","providerAttemptToken","lastError"],"properties":{"batchIndex":{"type":"integer"},"status":{"type":"string","enum":["prepared","provider_started","accepted","rejected","unknown"]},"recipientCount":{"type":"integer"},"providerAttemptToken":{"type":["string","null"]},"lastError":{"type":["string","null"]}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"TopicResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Topic"}},"additionalProperties":false},"TopicListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Topic"}}},"additionalProperties":false},"BillingAccountResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["balance","pricing","paymentMethod","autoRecharge","topups","movements","permissions","configured"],"properties":{"balance":{"type":"object","required":["credits","euros"],"properties":{"credits":{"type":"integer"},"euros":{"type":"number"}},"additionalProperties":false},"pricing":{"type":"object","required":["currency","creditsPerEuro"],"properties":{"currency":{"type":"string","enum":["EUR"]},"creditsPerEuro":{"type":"integer","enum":[1000]}},"additionalProperties":false},"paymentMethod":{"oneOf":[{"type":"object","required":["brand","last4","expMonth","expYear"],"properties":{"brand":{"type":"string"},"last4":{"type":"string"},"expMonth":{"type":"integer"},"expYear":{"type":"integer"}},"additionalProperties":false},{"type":"null"}]},"autoRecharge":{"type":"object","required":["enabled","amountEur","thresholdCredits","consentAt"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":["integer","null"],"minimum":1},"thresholdCredits":{"type":["integer","null"],"minimum":0},"consentAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"topups":{"type":"array","items":{"type":"object","required":["id","source","amountEur","credits","status","createdAt","completedAt"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto","migration_adjustment","refund"]},"amountEur":{"type":"number"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"movements":{"type":"array","items":{"type":"object","required":["id","type","credits","description","createdAt"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"credits":{"type":"integer"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"permissions":{"type":"object","required":["canManage"],"properties":{"canManage":{"type":"boolean"}},"additionalProperties":false},"configured":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"BillingTopupResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["topupId","clientSecret","credits"],"properties":{"topupId":{"type":"string"},"clientSecret":{"type":"string"},"credits":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"BillingPaymentMethodSetupResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["clientSecret"],"properties":{"clientSecret":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"BillingAutoRechargeResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["enabled","amountEur","thresholdCredits","consentAt"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":["integer","null"],"minimum":1},"thresholdCredits":{"type":["integer","null"],"minimum":0},"consentAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"NewsletterMetricSummary":{"type":"object","required":["id","subject","sent_at","total_sent","total_delivered","opens","clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate"],"properties":{"id":{"type":"string"},"subject":{"type":"string"},"sent_at":{"type":"string","format":"date-time"},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"opens":{"type":"integer"},"clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"MetricSummary":{"type":"object","required":["total_sent","total_delivered","total_opens","total_clicks","unique_opens","unique_clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate","newsletters"],"properties":{"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"total_opens":{"type":"integer"},"total_clicks":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"},"newsletters":{"type":"array","items":{"$ref":"#/components/schemas/NewsletterMetricSummary"}}},"additionalProperties":false},"LegacyClickBreakdown":{"type":"object","required":["id","newsletter_id","topic_id","url","click_count","created_at","title_es","title_en"],"properties":{"id":{"type":"string"},"newsletter_id":{"type":"string"},"topic_id":{"type":["string","null"]},"url":{"type":"string"},"click_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"title_es":{"type":["string","null"]},"title_en":{"type":["string","null"]}},"additionalProperties":false},"ClickUrlBreakdown":{"type":"object","required":["url","total_clicks","unique_clicks"],"properties":{"url":{"type":"string"},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"}},"additionalProperties":false},"ClickDeviceBreakdown":{"type":"object","required":["device_class","total_clicks","unique_clicks"],"properties":{"device_class":{"type":"string","enum":["mobile","tablet","desktop","bot","unknown"]},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"}},"additionalProperties":false},"NewsletterMetricDetail":{"type":"object","required":["id","newsletter_id","total_sent","total_delivered","total_opened","total_clicked","unique_opens","unique_clicks","bounced","unsubscribed","complained","updated_at","language","sent_at","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate","clicksByLink","clicksByUrl","clicksByDevice"],"properties":{"id":{"type":"string"},"newsletter_id":{"type":"string"},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"total_opened":{"type":"integer"},"total_clicked":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"updated_at":{"type":"string","format":"date-time"},"language":{"type":"string","enum":["es","en"]},"sent_at":{"type":["string","null"],"format":"date-time"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"},"clicksByLink":{"type":"array","items":{"$ref":"#/components/schemas/LegacyClickBreakdown"}},"clicksByUrl":{"type":"array","items":{"$ref":"#/components/schemas/ClickUrlBreakdown"}},"clicksByDevice":{"type":"array","items":{"$ref":"#/components/schemas/ClickDeviceBreakdown"}}},"additionalProperties":false},"MetricHistoryItem":{"type":"object","required":["id","workspace_id","language","sent_at","total_sent","total_delivered","unique_opens","unique_clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"sent_at":{"type":"string","format":"date-time"},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"TopLink":{"type":"object","required":["url","title_es","title_en","total_clicks","unique_clicks","legacy_clicks","enriched_clicks"],"properties":{"url":{"type":"string"},"title_es":{"type":["string","null"]},"title_en":{"type":["string","null"]},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"},"legacy_clicks":{"type":"integer"},"enriched_clicks":{"type":"integer"}},"additionalProperties":false},"AdminTenant":{"type":"object","required":["id","name","slug","owner_email","owner_name","member_count","subscriber_count","newsletter_count","total_sent","recent_volume","last_send_at","delivery_health","configuration","status","funding_status","credit_balance","latest_payment_status","auto_recharge_enabled","last_topup_at","lifetime_credits_purchased","lifetime_credits_spent"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"owner_email":{"type":["string","null"]},"owner_name":{"type":["string","null"]},"member_count":{"type":"integer"},"subscriber_count":{"type":"integer"},"newsletter_count":{"type":"integer"},"total_sent":{"type":"integer"},"recent_volume":{"type":"integer"},"last_send_at":{"type":["string","null"],"format":"date-time"},"delivery_health":{"type":"object","required":["status","delivery_rate","bounce_rate"],"properties":{"status":{"type":"string","enum":["healthy","warning","critical","no_data"]},"delivery_rate":{"type":"number"},"bounce_rate":{"type":"number"}},"additionalProperties":false},"configuration":{"type":"object","required":["from_email","domain_verified"],"properties":{"from_email":{"type":"boolean"},"domain_verified":{"type":"boolean"}},"additionalProperties":false},"status":{"type":"string","enum":["ready","needs_setup"]},"funding_status":{"type":"string","enum":["credits_available","depleted","never_paid"]},"credit_balance":{"type":"integer"},"latest_payment_status":{"type":"string","enum":["none","pending","succeeded","failed"]},"auto_recharge_enabled":{"type":"boolean"},"last_topup_at":{"type":["string","null"],"format":"date-time"},"lifetime_credits_purchased":{"type":"integer"},"lifetime_credits_spent":{"type":"integer"}},"additionalProperties":false},"AdminTenantListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AdminTenant"}}},"additionalProperties":false},"AdminOverviewResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["range","totals","delivery","email_series","topup_series","health"],"properties":{"range":{"type":"string","enum":["7d","30d","90d","all"]},"totals":{"type":"object","required":["workspaces","paying_workspaces","subscribers","emails_sent"],"properties":{"workspaces":{"type":"integer"},"paying_workspaces":{"type":"integer"},"subscribers":{"type":"integer"},"emails_sent":{"type":"integer"}},"additionalProperties":false},"delivery":{"type":"object","required":["sent","delivered","bounced","complained","delivery_rate","bounce_rate","complaint_rate"],"properties":{"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"bounce_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"email_series":{"type":"array","items":{"type":"object","required":["date","sent","delivered","bounced","complained"],"properties":{"date":{"type":"string","format":"date"},"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"}},"additionalProperties":false}},"topup_series":{"type":"array","items":{"type":"object","required":["date","first_time_paying_workspaces","cumulative_paying_workspaces","successful_topups","failed_topups","gross_topup_revenue_cents"],"properties":{"date":{"type":"string","format":"date"},"first_time_paying_workspaces":{"type":"integer"},"cumulative_paying_workspaces":{"type":"integer"},"successful_topups":{"type":"integer"},"failed_topups":{"type":"integer"},"gross_topup_revenue_cents":{"type":"integer"}},"additionalProperties":false}},"health":{"type":"object","required":["email_provider_configured","email_webhook_configured","billing_provider_configured","billing_webhook_configured","domains"],"properties":{"email_provider_configured":{"type":"boolean"},"email_webhook_configured":{"type":"boolean"},"billing_provider_configured":{"type":"boolean"},"billing_webhook_configured":{"type":"boolean"},"domains":{"type":"object","required":["verified","pending","failed"],"properties":{"verified":{"type":"integer"},"pending":{"type":"integer"},"failed":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"AdminTenantDetailResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["identity","owner","member_count","usage","billing","domains","last_send","unresolved_send_claims"],"properties":{"identity":{"type":"object","required":["id","name","slug","description","created_at"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"owner":{"oneOf":[{"type":"object","required":["email","name"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"]}},"additionalProperties":false},{"type":"null"}]},"member_count":{"type":"integer"},"usage":{"type":"object","required":["emails_sent_30d","emails_sent_lifetime"],"properties":{"emails_sent_30d":{"type":"integer"},"emails_sent_lifetime":{"type":"integer"}},"additionalProperties":false},"billing":{"type":"object","required":["currency","balance","paid_ever","lifetime_paid_cents","lifetime_credits_purchased","lifetime_credits_spent","latest_topup","payment_method_configured","auto_recharge"],"properties":{"currency":{"type":"string","enum":["EUR"]},"balance":{"type":"object","required":["credits","euros"],"properties":{"credits":{"type":"integer"},"euros":{"type":"number"}},"additionalProperties":false},"paid_ever":{"type":"boolean"},"lifetime_paid_cents":{"type":"integer"},"lifetime_credits_purchased":{"type":"integer"},"lifetime_credits_spent":{"type":"integer"},"latest_topup":{"oneOf":[{"type":"object","required":["id","source","amount_cents","credits","status","created_at","completed_at"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto"]},"amount_cents":{"type":"integer"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},{"type":"null"}]},"payment_method_configured":{"type":"boolean"},"auto_recharge":{"type":"object","required":["enabled","amount_eur","consent_at"],"properties":{"enabled":{"type":"boolean"},"amount_eur":{"type":["integer","null"],"minimum":1},"consent_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"domains":{"type":"array","items":{"type":"object","required":["id","domain","status","region","created_at","verified_at"],"properties":{"id":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["pending","verified","failed"]},"region":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"verified_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"last_send":{"oneOf":[{"type":"object","required":["id","sent_at","sent","delivered","bounced","complained"],"properties":{"id":{"type":"string"},"sent_at":{"type":"string","format":"date-time"},"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"}},"additionalProperties":false},{"type":"null"}]},"unresolved_send_claims":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"AdminTopupListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","limit","offset"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","source","amount_cents","amount_eur","credits","status","created_at","completed_at","receipt_url"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto","migration_adjustment","refund"]},"amount_cents":{"type":"integer"},"amount_eur":{"type":"number"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"receipt_url":{"type":["string","null"],"format":"uri"}},"additionalProperties":false}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0}},"additionalProperties":false}},"additionalProperties":false}}},"security":[{"BearerAuth":[]},{"SessionCookie":[]}],"paths":{"/openapi.json":{"get":{"tags":["health"],"summary":"Fetch this OpenAPI document","security":[],"responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}},"/docs":{"get":{"tags":["health"],"summary":"Interactive API reference","security":[],"responses":{"200":{"description":"Interactive API reference","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Check database and email readiness","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/health/{service}":{"get":{"tags":["health"],"summary":"Check one dependency","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","enum":["db","email"]}}],"responses":{"200":{"description":"Dependency status","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["service","ok"],"properties":{"service":{"type":"string","enum":["db","email"]},"ok":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces":{"get":{"tags":["workspaces"],"summary":"List accessible workspaces","responses":{"200":{"description":"Workspace list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Workspace"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"post":{"tags":["workspaces"],"summary":"Create a workspace","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","fromEmail","fromName"],"properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string","minLength":1,"pattern":"^[a-z0-9-]+$","description":"Internal handle. Omit it to derive one from the name."},"description":{"type":"string"},"audience_type":{"type":"string","enum":["performance","chronic"]},"primaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"logoUrl":{"type":"string","format":"uri"},"fromEmail":{"type":"string","format":"email"},"fromName":{"type":"string","minLength":1}},"additionalProperties":false}}}},"responses":{"201":{"description":"Workspace created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"500":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}":{"get":{"tags":["workspaces"],"summary":"Get a workspace","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Workspace","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"patch":{"tags":["workspaces"],"summary":"Update a workspace","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"audience_type":{"type":"string","enum":["performance","chronic"]},"primaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"logoUrl":{"type":"string","format":"uri"},"fromEmail":{"type":"string","format":"email"},"fromName":{"type":"string","minLength":1}},"additionalProperties":false}}}},"responses":{"200":{"description":"Workspace updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}/members":{"get":{"tags":["workspaces"],"summary":"List members","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Member list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"post":{"tags":["workspaces"],"summary":"Add a member","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["admin","editor","viewer"],"default":"editor"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Member added","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Member"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}/members/{userId}":{"patch":{"tags":["workspaces"],"summary":"Change a member role","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["owner","admin","editor","viewer"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Member updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Member"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"delete":{"tags":["workspaces"],"summary":"Remove a member","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/api-keys":{"get":{"tags":["api-keys"],"summary":"List API keys","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"API key list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:read"]},"post":{"tags":["api-keys"],"summary":"Create an API key","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"workspaceId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["workspace:read","workspace:write","keys:read","keys:write"]}},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":false}}}},"responses":{"201":{"description":"API key created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ApiKey"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/api-keys/{id}":{"delete":{"tags":["api-keys"],"summary":"Revoke an API key","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/subscribers":{"get":{"tags":["subscribers"],"summary":"List subscribers","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","unsubscribed","bounced"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string","enum":["es","en"]}},{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Subscriber page","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","page","pageSize","totalPages"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Subscriber"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["subscribers"],"summary":"Create or reactivate a subscriber","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Subscriber reactivated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"201":{"description":"Subscriber created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/stats":{"get":{"tags":["subscribers"],"summary":"Get subscriber counts","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Subscriber statistics","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["totalActive","breakdown"],"properties":{"totalActive":{"type":"integer"},"breakdown":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/subscribers/import":{"post":{"tags":["subscribers"],"summary":"Import subscribers from JSON","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subscribers"],"properties":{"subscribers":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]}},"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Import result","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ImportResult"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/import/csv":{"post":{"tags":["subscribers"],"summary":"Import subscribers from CSV","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"text/csv":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Import result","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ImportResult"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"413":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"415":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/export":{"get":{"tags":["subscribers"],"summary":"Export subscribers as CSV","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","unsubscribed","bounced"],"default":"active"}}],"responses":{"200":{"description":"Subscriber CSV","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/subscribers/{id}":{"patch":{"tags":["subscribers"],"summary":"Update a subscriber","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"language":{"type":"string","enum":["es","en"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Subscriber updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["subscribers"],"summary":"Unsubscribe a subscriber","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/{id}/tags":{"get":{"tags":["subscribers"],"summary":"List subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"put":{"tags":["subscribers"],"summary":"Replace subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagIds":{"type":"array","maxItems":100,"items":{"type":"string"}},"tag_ids":{"type":"array","maxItems":100,"items":{"type":"string"}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/{id}/tags/{tagId}":{"post":{"tags":["subscribers"],"summary":"Add a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tagId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["subscribers"],"summary":"Remove a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tagId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/tags":{"get":{"tags":["tags"],"summary":"List subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["tags"],"summary":"Create a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"type":["string","null"],"maxLength":1000},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Tag created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/tags/{id}":{"get":{"tags":["tags"],"summary":"Get a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["tags"],"summary":"Update a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"type":["string","null"],"maxLength":1000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tag updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["tags"],"summary":"Delete a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/tags/{id}/subscribers":{"get":{"tags":["tags"],"summary":"List subscribers with a tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Subscriber list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscriber"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/topics":{"get":{"tags":["topics"],"summary":"List topics for a newsletter","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"newsletterId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicListResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["topics"],"summary":"Add externally-authored content to a draft newsletter","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["newsletterId","titleEs","titleEn","summaryEs","summaryEn"],"properties":{"newsletterId":{"type":"string"},"titleEs":{"type":"string","minLength":1},"titleEn":{"type":"string","minLength":1},"summaryEs":{"type":"string","minLength":1},"summaryEn":{"type":"string","minLength":1},"sourceUrl":{"type":"string","format":"uri"},"paperUrl":{"type":["string","null"],"format":"uri"},"imageUrl":{"type":["string","null"],"format":"uri"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Topic created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/topics/{id}":{"get":{"tags":["topics"],"summary":"Get a topic","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["topics"],"summary":"Update a topic","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"summary":{"type":"string","minLength":1},"titleEs":{"type":"string","minLength":1},"titleEn":{"type":"string","minLength":1},"summaryEs":{"type":"string","minLength":1},"summaryEn":{"type":"string","minLength":1},"sourceUrl":{"type":["string","null"],"format":"uri"},"paperUrl":{"type":["string","null"],"format":"uri"},"imageUrl":{"type":["string","null"],"format":"uri"},"position":{"type":"integer","minimum":0},"source_type":{"type":"string","minLength":1},"relevance_score":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false,"allOf":[{"not":{"anyOf":[{"required":["title","titleEs"]},{"required":["title","titleEn"]}]}},{"not":{"anyOf":[{"required":["summary","summaryEs"]},{"required":["summary","summaryEn"]}]}}]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["topics"],"summary":"Delete a topic","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/topics/{id}/reorder":{"post":{"tags":["topics"],"summary":"Move a topic to a new position","deprecated":true,"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["position"],"properties":{"position":{"type":"integer","minimum":0}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates":{"get":{"tags":["templates"],"summary":"List system templates and latest active custom versions","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Template list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/EmailTemplateSummary"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["templates"],"summary":"Create a custom template family","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","html"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates/preview":{"post":{"tags":["templates"],"summary":"Render a system, saved custom, or unsaved custom template without persistence","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["template_id"],"properties":{"workspaceId":{"type":"string"},"template_id":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["html","css"],"properties":{"workspaceId":{"type":"string"},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}]}}}},"responses":{"200":{"description":"Rendered template sample","content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/templates/{id}":{"get":{"tags":["templates"],"summary":"Get an exact template version","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Template","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["templates"],"summary":"Create a new immutable version","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template version created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["templates"],"summary":"Archive every version in a custom family","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates/{id}/duplicate":{"post":{"tags":["templates"],"summary":"Duplicate a system or custom template into a new family","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template duplicated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets":{"get":{"tags":["assets"],"summary":"List workspace image assets","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Asset list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/BrandAsset"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["assets"],"summary":"Upload a PNG, JPEG, or WebP image up to 5MB","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Asset uploaded","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BrandAsset"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"413":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"415":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/logo":{"delete":{"tags":["assets"],"summary":"Clear the active workspace logo","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Logo cleared","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["logo_url"],"properties":{"logo_url":{"type":"null"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/{id}":{"get":{"tags":["assets"],"summary":"Read a public image asset","servers":[{"url":"/"}],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"PNG, JPEG, or WebP image bytes","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"delete":{"tags":["assets"],"summary":"Delete a workspace asset","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/{id}/logo":{"post":{"tags":["assets"],"summary":"Set a workspace asset as the active logo","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Logo selected","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["logo_url","asset"],"properties":{"logo_url":{"type":"string","format":"uri"},"asset":{"$ref":"#/components/schemas/BrandAsset"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/signup-form":{"get":{"tags":["signup-forms"],"summary":"Read the embeddable signup form configuration","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupFormSettingsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"put":{"tags":["signup-forms"],"summary":"Create or update the embeddable signup form","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled","defaultLanguage","privacyUrl"],"properties":{"enabled":{"type":"boolean"},"defaultLanguage":{"type":"string","enum":["es","en"]},"privacyUrl":{"type":"string","format":"uri","pattern":"^https://","maxLength":2048,"description":"HTTPS is required outside loopback local development."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupFormSettingsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/signup-form/rotate":{"post":{"tags":["signup-forms"],"summary":"Rotate the public signup URL","description":"Existing embeds stop accepting requests. Confirmation links already sent remain valid.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupFormSettingsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters":{"get":{"tags":["newsletters"],"summary":"List newsletters","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","ready","sent"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string","enum":["es","en"]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterPageResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["newsletters"],"summary":"Create a draft newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["language"],"properties":{"workspaceId":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"weekStart":{"type":"string"},"weekEnd":{"type":"string"},"specialInstructions":{"type":"string"},"subject":{"type":"string"},"preview_text":{"type":"string"},"template_id":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"generation_config":{"type":["object","null"],"deprecated":true,"description":"Temporary targeting bridge. Use targetTagIds only."}},"additionalProperties":false}}}},"responses":{"201":{"description":"Newsletter created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}":{"get":{"tags":["newsletters"],"summary":"Get a newsletter and its topics","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterWithTopicsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["newsletters"],"summary":"Update a draft or ready newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"template_id":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"intro_es":{"type":["string","null"]},"intro_en":{"type":["string","null"]},"special_instructions":{"type":["string","null"]},"week_start":{"type":["string","null"]},"week_end":{"type":["string","null"]},"generation_config":{"type":["object","string","null"],"deprecated":true,"description":"Temporary targeting bridge. Use targetTagIds only."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["newsletters"],"summary":"Delete an unsent newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/preview":{"post":{"tags":["newsletters"],"summary":"Render unsaved local overrides without mutating the draft","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"intro_es":{"type":["string","null"]},"intro_en":{"type":["string","null"]},"template_id":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Rendered email","content":{"application/json":{"schema":{"type":"object","required":["html","plain"],"properties":{"html":{"type":"string"},"plain":{"type":"string"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/test-send":{"post":{"tags":["newsletters"],"summary":"Email a test copy of the issue to one address","description":"Renders the stored issue and sends it from the workspace sender to a single recipient. Requires a verified sender domain, consumes no credits, and leaves the status unchanged. Unsubscribe links in the copy are inert.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"properties":{"to":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Test copy accepted by the provider","content":{"application/json":{"schema":{"type":"object","required":["to","subject"],"properties":{"to":{"type":"string"},"subject":{"type":"string"},"provider_id":{"type":["string","null"]}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/approve":{"post":{"tags":["newsletters"],"summary":"Approve a draft newsletter (status becomes ready); needs a subject and an introduction or a topic","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/send":{"post":{"tags":["newsletters"],"summary":"Send a ready newsletter now","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"500":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/send-status":{"get":{"tags":["newsletters"],"summary":"Inspect durable delivery and reconciliation state","description":"Returns batch status and provider attempt identifiers without recipient payloads.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendStatusResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/newsletters/{id}/reconcile":{"post":{"tags":["newsletters"],"summary":"Reconcile one ambiguous provider batch after external confirmation","description":"Inspect send-status and confirm the provider result before choosing accepted or rejected. When all ambiguous batches are resolved, this operation resumes and finalizes delivery. Use a new Idempotency-Key for each distinct reconciliation attempt.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["decision","batchIndex","note"],"properties":{"workspaceId":{"type":"string"},"decision":{"type":"string","enum":["accepted","rejected"]},"batchIndex":{"type":"integer","minimum":0},"note":{"type":"string","minLength":1,"maxLength":1000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendReconciliationResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/metrics":{"get":{"tags":["metrics"],"summary":"Get aggregate delivery metrics","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"range","in":"query","required":false,"schema":{"type":"string","enum":["7d","30d","90d","all"]}},{"name":"days","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Metric summary","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/MetricSummary"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/newsletter/{id}":{"get":{"tags":["metrics"],"summary":"Get newsletter delivery metrics","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Newsletter metrics","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/NewsletterMetricDetail"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/history":{"get":{"tags":["metrics"],"summary":"Get newsletter metric history","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Metric history","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/MetricHistoryItem"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/top-links":{"get":{"tags":["metrics"],"summary":"Get most-clicked links","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"days","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Top links","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/TopLink"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/alerts":{"get":{"tags":["alerts"],"summary":"List alerts","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"unreadOnly","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Alert list or page","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Alert"}},{"type":"object","required":["items","total","page","pageSize","totalPages"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Alert"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}},"additionalProperties":false}]}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["alerts"],"summary":"Create an alert","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","message"],"properties":{"type":{"type":"string","enum":["error","warning","info","success"]},"title":{"type":["string","null"]},"message":{"type":"string","minLength":1,"maxLength":2000},"context":{"type":"object","additionalProperties":true},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Alert created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Alert"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/alerts/count":{"get":{"tags":["alerts"],"summary":"Count unread alerts","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Unread count","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["unreadCount"],"properties":{"unreadCount":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/alerts/{id}/read":{"patch":{"tags":["alerts"],"summary":"Mark an alert read","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/alerts/read-all":{"post":{"tags":["alerts"],"summary":"Mark all alerts read","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/alerts/{id}":{"delete":{"tags":["alerts"],"summary":"Delete an alert","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks":{"get":{"tags":["webhooks"],"summary":"List outgoing webhooks","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Webhook list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["webhooks"],"summary":"Register an outgoing webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"events":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","enum":["newsletter.sent","webhook.test"]}},"description":{"type":["string","null"],"maxLength":1000},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Webhook registered","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}":{"get":{"tags":["webhooks"],"summary":"Get a webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["webhooks"],"summary":"Update a webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"events":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","enum":["newsletter.sent","webhook.test"]}},"description":{"type":["string","null"],"maxLength":1000},"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Webhook updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["webhooks"],"summary":"Disable a webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}/rotate":{"post":{"tags":["webhooks"],"summary":"Rotate a webhook signing secret","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Rotated webhook secret","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List webhook deliveries","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Webhook delivery list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/webhooks/{id}/test":{"post":{"tags":["webhooks"],"summary":"Queue a test webhook delivery","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"202":{"description":"Test queued","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["deliveryIds"],"properties":{"deliveryIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains":{"get":{"tags":["domains"],"summary":"List sender domains","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Domain list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["domains"],"summary":"Register a sender domain","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","minLength":3,"maxLength":253}},"additionalProperties":false}}}},"responses":{"201":{"description":"Domain registered","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains/{id}":{"get":{"tags":["domains"],"summary":"Get a sender domain","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Domain","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"delete":{"tags":["domains"],"summary":"Delete a sender domain","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains/{id}/verify":{"post":{"tags":["domains"],"summary":"Refresh domain verification","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Domain verification refreshed","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/admin/access":{"get":{"tags":["admin"],"summary":"Check platform-admin access","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Admin access","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["authorized"],"properties":{"authorized":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/overview":{"get":{"tags":["admin"],"summary":"Get platform delivery and prepaid funding overview","security":[{"SessionCookie":[]}],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string","enum":["7d","30d","90d","all"],"default":"30d"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOverviewResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants":{"get":{"tags":["admin"],"summary":"List tenant prepaid funding and delivery health","security":[{"SessionCookie":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"fundingStatus","in":"query","required":false,"schema":{"type":"string","enum":["credits_available","depleted","never_paid"]}},{"name":"deliveryStatus","in":"query","required":false,"schema":{"type":"string","enum":["healthy","warning","critical","no_data"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantListResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants/{id}":{"get":{"tags":["admin"],"summary":"Get tenant operational detail","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantDetailResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants/{id}/topups":{"get":{"tags":["admin"],"summary":"List local tenant top-ups with optional verified receipts","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}},{"name":"includeReceipts","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTopupListResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/billing/account":{"get":{"tags":["billing"],"summary":"Get prepaid balance, card, auto-recharge, and activity","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingAccountResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/billing/topups":{"post":{"tags":["billing"],"summary":"Prepare a prepaid credit purchase","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amountEur"],"properties":{"amountEur":{"type":"integer","minimum":1}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTopupResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/payment-method/setup":{"post":{"tags":["billing"],"summary":"Prepare a reusable card for auto-recharge","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPaymentMethodSetupResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/auto-recharge":{"patch":{"tags":["billing"],"summary":"Configure the maximum next automatic recharge","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":"integer","minimum":1}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingAutoRechargeResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}}}}