{"openapi":"3.1.0","info":{"title":"CheapSequencer API","version":"1.0.0","description":"Customer REST API. Send a customer API key in Authorization: Bearer <key>."},"servers":[{"url":"https://api.cheapsequencer.com/v1"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key"}},"schemas":{"StepVariant":{"type":"object","additionalProperties":false,"description":"One A/B copy of a step. Reads always emit at least one; a single-copy step is just [A].","properties":{"id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"An existing variant id, echoed from a read. Required to EDIT a variant rather than replace it — a missing id mints a new variant and orphans the sends already attributed to the old one. Not accepted when creating a sequence."},"subject":{"type":"string","maxLength":998,"description":"Subject line for this copy. Ignored on a reply_to_previous step, which inherits the thread subject."},"body_text":{"type":"string","maxLength":100000,"description":"Plain-text body for this copy."},"body_html":{"type":"string","maxLength":200000,"description":"HTML body for this copy."},"weight":{"type":"integer","minimum":0,"maximum":100,"description":"Share of sends, as an integer percent. Only meaningful while the step distribution_mode is manual; weights are normalized to total 100 across the active variants."},"archived":{"type":"boolean","description":"Archive this copy: it stops sending but stays resolvable for reporting. A variant that has already been sent can only be archived, never removed from the array."}}},"SequenceStep":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"An existing step id, echoed from a read. Not accepted when creating a sequence. Sending steps without ids REPLACES the sequence steps."},"delay_days":{"type":"integer","minimum":0,"maximum":365,"description":"Whole days to wait after the previous step. Step 1 of a campaign always sends immediately and is forced to 0."},"subject":{"type":"string","maxLength":998,"description":"Subject line. When variants are sent this field is a read-only MIRROR of the first active variant — send copy in variants instead."},"body_text":{"type":"string","maxLength":100000,"description":"Plain-text body. Mirrors the first active variant when variants are sent."},"body_html":{"type":"string","maxLength":200000,"description":"HTML body. Mirrors the first active variant when variants are sent."},"thread_mode":{"type":"string","enum":["new_thread","reply_to_previous"],"description":"Whether this step starts a new thread or replies inside the previous one."},"send_as_plain_text":{"type":"boolean","description":"Send this step as plain text only."},"variants":{"type":"array","maxItems":26,"items":{"$ref":"#/components/schemas/StepVariant"},"description":"The step's A/B copies. OMIT the array entirely to leave the existing variants alone; send it to create, edit, re-weight or archive them. At most 10 may be active at once. When both this and the step-level subject/body_* are sent, this wins — and step-level copy matching none of these entries is REFUSED rather than silently dropped."},"distribution_mode":{"type":"string","enum":["equal","manual"],"description":"How sends split across the active variants: equal derives the shares from the count, manual uses their weight values. Only accepted together with variants."}}},"SpintaxVariable":{"type":"object","additionalProperties":false,"required":["name","variations"],"properties":{"id":{"type":"string","maxLength":120,"description":"An existing variable id, echoed from a read."},"name":{"type":"string","minLength":1,"maxLength":64,"description":"Merge-tag name for the variable. May not shadow a lead field or a built-in tag."},"variations":{"type":"array","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":10000,"description":"One phrasing."},"description":"The interchangeable phrasings, chosen per send."}}},"InboxUpdateRequest":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"display_name":{"type":"string","minLength":1,"maxLength":120,"description":"The mailbox owner's display name, used as the From name and the {{sender_name}} merge value."},"tags":{"type":"array","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":64,"description":"A mailbox tag."},"description":"Replaces the mailbox tag set."},"send_limits":{"type":"object","additionalProperties":false,"properties":{"total_daily":{"type":"integer","minimum":0,"maximum":10000,"description":"Combined daily ceiling. Derived from the two lanes below; sending it directly is not required."},"warmup_daily":{"type":"integer","minimum":0,"maximum":10000,"description":"Daily WarmUp sends for this mailbox."},"sequence_daily":{"type":"integer","minimum":0,"maximum":10000,"description":"Daily campaign sends for this mailbox."}},"description":"At least one value is required when send_limits is present."}}},"InboxOAuthLinkRequest":{"type":"object","additionalProperties":false,"required":["provider"],"properties":{"provider":{"type":"string","enum":["gmail","outlook"],"description":"Which provider consent screen to build a link for."},"account_hint":{"type":"string","maxLength":320,"description":"Email address to pre-fill on the provider consent screen."}}},"ThreadReplyRequest":{"type":"object","additionalProperties":false,"description":"One of body_text or body_html is required.","anyOf":[{"required":["body_text"]},{"required":["body_html"]}],"properties":{"body_text":{"type":"string","maxLength":100000,"description":"Plain-text reply body."},"body_html":{"type":"string","maxLength":200000,"description":"HTML reply body. When only this is sent, the plain-text part is derived from it."}}},"ThreadReadStateRequest":{"type":"object","additionalProperties":false,"properties":{"read":{"type":"boolean","default":true,"description":"Mark the thread read (default) or unread."}}},"MessageClassificationRequest":{"type":"object","additionalProperties":false,"required":["classification"],"properties":{"classification":{"type":"string","enum":["interested","not_interested","out_of_office","bounce","unsubscribe","neutral"],"description":"The classification to apply. untagged is not settable — it is the absence of a classification."},"destructive_confirmed":{"type":"boolean","description":"Acknowledge a reclassification that changes lead state."}}},"WarmupSettingsRequest":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"enabled":{"type":"boolean","description":"Turn WarmUp on or off for this mailbox."},"daily_limit":{"type":"integer","minimum":0,"maximum":10000,"description":"Combined daily send ceiling for the mailbox."},"warmup_daily_limit":{"type":"integer","minimum":0,"maximum":10000,"description":"Daily WarmUp sends."},"sequence_daily_limit":{"type":"integer","minimum":0,"maximum":10000,"description":"Daily campaign sends."},"reply_rate_percent":{"type":"integer","minimum":0,"maximum":100,"description":"Share of WarmUp mail that receives an automatic reply."},"ramp_increment_per_day":{"type":"integer","minimum":0,"maximum":1000,"description":"Daily increase of the WarmUp volume. 0 restores the automatic ramp."},"ramp_starting_daily_sends":{"type":"integer","minimum":0,"maximum":1000,"description":"Volume the custom ramp starts at. 0 restores the automatic ramp."}}},"WarmupToggleRequest":{"type":"object","additionalProperties":false,"required":["enabled"],"properties":{"enabled":{"type":"boolean","description":"Whether WarmUp runs for this mailbox."}}},"WebhookSubscriptionCreateRequest":{"type":"object","additionalProperties":false,"required":["url","event_types"],"properties":{"url":{"type":"string","minLength":1,"maxLength":2048,"description":"HTTPS endpoint that receives signed deliveries. It is verified before the subscription is created."},"description":{"type":"string","maxLength":200,"description":"Human-readable label."},"event_types":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","enum":["inbox.connected","inbox.connection_failed","inbox.paused","inbox.deleted","import.completed","import.failed","sequence.activated","sequence.paused","sequence.completed","enrollment.completed","enrollment.stopped","message.sent","message.failed","message.replied","message.bounced","thread.created","thread.classified","warmup.placement_checked","warmup.needs_review","api_action.completed","api_action.failed"]},"description":"Events to deliver."}}},"WebhookSubscriptionUpdateRequest":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"url":{"type":"string","minLength":1,"maxLength":2048,"description":"Replacement endpoint. Re-verified before it is stored."},"description":{"type":"string","maxLength":200,"description":"Human-readable label."},"event_types":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","enum":["inbox.connected","inbox.connection_failed","inbox.paused","inbox.deleted","import.completed","import.failed","sequence.activated","sequence.paused","sequence.completed","enrollment.completed","enrollment.stopped","message.sent","message.failed","message.replied","message.bounced","thread.created","thread.classified","warmup.placement_checked","warmup.needs_review","api_action.completed","api_action.failed"]},"description":"Replaces the subscribed event list."},"status":{"type":"string","enum":["active","disabled"],"description":"Enable or disable delivery without losing history."}}},"LeadListCreateRequest":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"List name."}}},"LeadListUpdateRequest":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Replacement list name."}}},"LeadCreateRequest":{"type":"object","additionalProperties":false,"required":["email"],"description":"Creates a lead, or updates the existing one with the same normalized email.","properties":{"email":{"type":"string","minLength":1,"maxLength":320,"description":"Email address. Normalized to lowercase and used as the upsert key.","format":"email"},"first_name":{"type":"string","maxLength":240,"description":"The lead's first name. Resolves the {{first_name}} merge tag."},"last_name":{"type":"string","maxLength":240,"description":"The lead's last name. Resolves the {{last_name}} merge tag."},"company_name":{"type":"string","maxLength":240,"description":"Company name — the field is company_name, not company. Resolves {{company_name}}."},"job_title":{"type":"string","maxLength":240,"description":"The lead's job title. Resolves the {{job_title}} merge tag."},"phone":{"type":"string","maxLength":240,"description":"Phone number. Resolves the {{phone}} merge tag."},"website":{"type":"string","maxLength":240,"description":"Website URL. Resolves the {{website}} merge tag."},"linkedin_profile":{"type":"string","maxLength":240,"description":"LinkedIn profile URL. Resolves the {{linkedin_profile}} merge tag."},"list_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Optional list to attach the lead to on creation."}}},"LeadUpdateRequest":{"type":"object","additionalProperties":false,"minProperties":1,"description":"Email is not updatable — it is the lead identity.","properties":{"first_name":{"type":"string","maxLength":240,"description":"The lead's first name. Resolves the {{first_name}} merge tag."},"last_name":{"type":"string","maxLength":240,"description":"The lead's last name. Resolves the {{last_name}} merge tag."},"company_name":{"type":"string","maxLength":240,"description":"Company name — the field is company_name, not company. Resolves {{company_name}}."},"job_title":{"type":"string","maxLength":240,"description":"The lead's job title. Resolves the {{job_title}} merge tag."},"phone":{"type":"string","maxLength":240,"description":"Phone number. Resolves the {{phone}} merge tag."},"website":{"type":"string","maxLength":240,"description":"Website URL. Resolves the {{website}} merge tag."},"linkedin_profile":{"type":"string","maxLength":240,"description":"LinkedIn profile URL. Resolves the {{linkedin_profile}} merge tag."},"status":{"type":"string","enum":["new","active","interested","not_interested","out_of_office","bounced","unsubscribed","blacklisted"],"description":"Lead status."}}},"LeadDirectSendRequest":{"type":"object","additionalProperties":false,"required":["inbox_id","subject","body_text"],"properties":{"inbox_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Mailbox to send from."},"subject":{"type":"string","minLength":1,"maxLength":998,"description":"Subject line."},"body_text":{"type":"string","minLength":1,"maxLength":100000,"description":"Plain-text body."},"body_html":{"type":"string","maxLength":200000,"description":"Optional HTML body."}}},"LeadListMembershipRequest":{"type":"object","additionalProperties":false,"required":["list_id"],"properties":{"list_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"List to attach the lead to."}}},"LeadSuppressRequest":{"type":"object","additionalProperties":false,"properties":{"reason":{"type":"string","enum":["manual","unsubscribe","bounce","complaint","customer_request","other"],"default":"manual","description":"Why the address is being suppressed."},"note":{"type":"string","maxLength":1000,"description":"Free-text note kept with the record."}}},"SuppressionCreateRequest":{"type":"object","additionalProperties":false,"required":["value"],"properties":{"kind":{"type":"string","enum":["email","domain"],"default":"email","description":"Whether value is a single address or a whole domain."},"value":{"type":"string","minLength":1,"maxLength":320,"description":"The address or domain to suppress."},"reason":{"type":"string","enum":["manual","unsubscribe","bounce","complaint","customer_request","other"],"default":"manual","description":"Why it is suppressed."},"note":{"type":"string","maxLength":1000,"description":"Free-text note kept with the record."}}},"ImportUploadUrlRequest":{"type":"object","additionalProperties":false,"required":["list_id","filename"],"properties":{"list_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"List the imported leads land in."},"filename":{"type":"string","minLength":1,"maxLength":255,"description":"Original CSV filename."},"content_type":{"type":"string","maxLength":120,"description":"MIME type of the upload."},"size_bytes":{"type":"integer","minimum":1,"maximum":52428800,"description":"Size of the CSV in bytes."}}},"ImportMappingRequest":{"type":"object","additionalProperties":false,"required":["mapping"],"properties":{"mapping":{"type":"object","minProperties":1,"propertyNames":{"maxLength":120},"additionalProperties":{"oneOf":[{"type":"string","maxLength":240},{"type":"integer","minimum":0,"maximum":10000}]},"description":"Lead field name to CSV column, given as either the column header or its zero-based index."},"has_header":{"type":"boolean","description":"Whether the first CSV row is a header."},"delimiter":{"type":"string","maxLength":1,"description":"Single-character column delimiter."}}},"SequenceCreateRequest":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":140,"description":"Campaign name."},"inbox_ids":{"type":"array","maxItems":5000,"items":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"A 24-character hexadecimal resource id, exactly as returned by a read."},"description":"Explicitly selected sending inboxes. The field is inbox_ids — there is no sender_selection object on a write; that shape appears only in reads."},"inbox_tag_slugs":{"type":"array","maxItems":25,"items":{"type":"string","minLength":1,"maxLength":64,"description":"A mailbox tag slug."},"description":"Select senders by mailbox tag."},"inbox_tag_match_mode":{"type":"string","enum":["any","all"],"description":"Whether a mailbox must carry any or all of inbox_tag_slugs."},"inbox_selection_mode":{"type":"string","enum":["manual","tags","manual_and_tags"],"description":"Which of the two selectors is in force."},"spintax_variables":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/SpintaxVariable"},"description":"Workspace-independent phrasing variables usable in step copy."},"timezone":{"type":"string","minLength":1,"maxLength":120,"description":"IANA timezone the sending window and delays are measured in, e.g. Europe/Belgrade."},"sending_days":{"type":"object","additionalProperties":false,"properties":{"monday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"tuesday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"wednesday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"thursday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"friday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"saturday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"sunday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}}},"description":"Per-weekday sending window."},"daily_send_cap":{"type":"integer","minimum":1,"maximum":100000,"description":"Most emails this campaign may send per day across all its inboxes."},"jitter_min_seconds":{"type":"integer","minimum":0,"maximum":86400,"description":"Lower bound of the random gap between sends."},"jitter_max_seconds":{"type":"integer","minimum":0,"maximum":86400,"description":"Upper bound of the random gap between sends."},"priority":{"type":"string","enum":["follow_ups_first","new_leads_first","balanced"],"description":"Which work the scheduler places first when capacity is short."},"stop_on_reply":{"type":"boolean","description":"Stop a lead when they reply."},"stop_on_bounce":{"type":"boolean","description":"Stop a lead when a send bounces."},"stop_on_unsubscribe":{"type":"boolean","description":"Stop a lead when they unsubscribe."},"steps":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/SequenceStep"},"description":"The full ordered step list. Sending this REPLACES every step, so echo the steps you want to keep — including their ids."}}},"SequenceUpdateRequest":{"type":"object","additionalProperties":false,"minProperties":1,"description":"Only a draft or paused campaign is editable; an active one answers 409 ACTIVE_SEQUENCE_EDIT_BLOCKED.","properties":{"name":{"type":"string","minLength":1,"maxLength":140,"description":"Campaign name."},"inbox_ids":{"type":"array","maxItems":5000,"items":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"A 24-character hexadecimal resource id, exactly as returned by a read."},"description":"Explicitly selected sending inboxes. The field is inbox_ids — there is no sender_selection object on a write; that shape appears only in reads."},"inbox_tag_slugs":{"type":"array","maxItems":25,"items":{"type":"string","minLength":1,"maxLength":64,"description":"A mailbox tag slug."},"description":"Select senders by mailbox tag."},"inbox_tag_match_mode":{"type":"string","enum":["any","all"],"description":"Whether a mailbox must carry any or all of inbox_tag_slugs."},"inbox_selection_mode":{"type":"string","enum":["manual","tags","manual_and_tags"],"description":"Which of the two selectors is in force."},"spintax_variables":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/SpintaxVariable"},"description":"Workspace-independent phrasing variables usable in step copy."},"timezone":{"type":"string","minLength":1,"maxLength":120,"description":"IANA timezone the sending window and delays are measured in, e.g. Europe/Belgrade."},"sending_days":{"type":"object","additionalProperties":false,"properties":{"monday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"tuesday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"wednesday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"thursday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"friday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"saturday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}},"sunday":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","description":"Whether the campaign may send on this weekday."},"start_hour":{"type":"integer","minimum":0,"maximum":23,"description":"First hour of the sending window, in the sequence timezone."},"end_hour":{"type":"integer","minimum":1,"maximum":24,"description":"Hour the sending window closes, in the sequence timezone."}}}},"description":"Per-weekday sending window."},"daily_send_cap":{"type":"integer","minimum":1,"maximum":100000,"description":"Most emails this campaign may send per day across all its inboxes."},"jitter_min_seconds":{"type":"integer","minimum":0,"maximum":86400,"description":"Lower bound of the random gap between sends."},"jitter_max_seconds":{"type":"integer","minimum":0,"maximum":86400,"description":"Upper bound of the random gap between sends."},"priority":{"type":"string","enum":["follow_ups_first","new_leads_first","balanced"],"description":"Which work the scheduler places first when capacity is short."},"stop_on_reply":{"type":"boolean","description":"Stop a lead when they reply."},"stop_on_bounce":{"type":"boolean","description":"Stop a lead when a send bounces."},"stop_on_unsubscribe":{"type":"boolean","description":"Stop a lead when they unsubscribe."},"steps":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/SequenceStep"},"description":"The full ordered step list. Sending this REPLACES every step, so echo the steps you want to keep — including their ids."}}},"SequenceInboxResolutionRequest":{"type":"object","additionalProperties":false,"properties":{"inbox_ids":{"type":"array","maxItems":5000,"items":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"A 24-character hexadecimal resource id, exactly as returned by a read."},"description":"Explicitly selected sending inboxes. The field is inbox_ids — there is no sender_selection object on a write; that shape appears only in reads."},"inbox_tag_slugs":{"type":"array","maxItems":25,"items":{"type":"string","minLength":1,"maxLength":64,"description":"A mailbox tag slug."},"description":"Select senders by mailbox tag."},"inbox_tag_match_mode":{"type":"string","enum":["any","all"],"description":"Whether a mailbox must carry any or all of inbox_tag_slugs."},"inbox_selection_mode":{"type":"string","enum":["manual","tags","manual_and_tags"],"description":"Which of the two selectors is in force."}}},"SequenceEnrollRequest":{"type":"object","additionalProperties":false,"required":["list_ids"],"properties":{"list_ids":{"type":"array","maxItems":5000,"items":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"A 24-character hexadecimal resource id, exactly as returned by a read."},"description":"Lists whose current leads are enrolled. Enrolment is by LIST — there is no lead_ids form."}}},"EnrollmentStopRequest":{"type":"object","additionalProperties":false,"properties":{"reason":{"type":"string","minLength":1,"maxLength":500,"description":"Why the enrolment was stopped, kept on the record."}}},"EnrollmentRemoveRequest":{"type":"object","additionalProperties":false,"required":["mode"],"properties":{"mode":{"type":"string","enum":["ids","filter"],"description":"Select the leads to remove explicitly, or by filter. lead_ids is only valid with ids; filter only with filter."},"lead_ids":{"type":"array","maxItems":5000,"items":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"A 24-character hexadecimal resource id, exactly as returned by a read."},"description":"Leads to remove. Only with mode ids."},"filter":{"type":"object","additionalProperties":false,"description":"Only with mode filter.","properties":{"q":{"type":"string","maxLength":500,"description":"Search term matched against the lead."},"status":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":40,"description":"An enrolment status."},"description":"Enrolment statuses to match."},"lead_status":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":40,"description":"A lead status."},"description":"Lead statuses to match."},"step":{"type":"array","maxItems":100,"items":{"type":"string","minLength":1,"maxLength":10,"description":"A step number."},"description":"Current step numbers to match."}}}}},"SequenceTestSendRequest":{"type":"object","additionalProperties":false,"required":["recipient_email"],"properties":{"recipient_email":{"type":"string","minLength":1,"maxLength":320,"description":"Where to send the test. The field is recipient_email, not email.","format":"email"},"step_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Which saved step to render. Defaults to the first step."},"variant_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Which A/B copy of that step to send. Defaults to the first ACTIVE variant, so the default reflects what a real lead could receive."},"inbox_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Mailbox to send from."},"lead_id":{"type":"string","pattern":"^[a-f\\d]{24}$","description":"Lead whose values resolve the merge tags."}}},"EmptyRequest":{"type":"object","additionalProperties":false,"maxProperties":0,"description":"This operation takes no fields. Send {} or omit the body."}}},"paths":{"/":{"get":{"summary":"Discover the authenticated workspace and key scopes","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Discovery response"},"401":{"description":"Invalid API key"}}}},"/openapi.json":{"get":{"summary":"Read this OpenAPI contract","responses":{"200":{"description":"OpenAPI document"}}}},"/me":{"get":{"summary":"Read the authenticated API-key identity","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: workspace:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/workspace":{"get":{"summary":"Read the authenticated workspace","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: workspace:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/usage":{"get":{"summary":"Read current plan-safe capacity usage","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: workspace:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/api-actions":{"get":{"summary":"List customer API action status. Filters: type, status, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: workspace:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/api-actions/{id}":{"get":{"summary":"Read one customer API action status.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: workspace:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes":{"get":{"summary":"List sending inboxes. Filters: search, provider, status, tag, warmup, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/{id}":{"get":{"summary":"Read one sending inbox.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Update safe mailbox settings. The current inbox ETag must be sent in If-Match.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxUpdateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/oauth-links":{"post":{"summary":"Create a short-lived Gmail or Outlook OAuth authorization link. The first response contains the one-time URL; idempotent replays intentionally do not.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxOAuthLinkRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:connect."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/{id}/reconnect-links":{"post":{"summary":"Create a fresh provider OAuth reconnect link for one manually connected Gmail or Outlook inbox.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:connect."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/{id}/pause":{"post":{"summary":"Pause one inbox from sequence sending.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/{id}/resume":{"post":{"summary":"Resume one inbox after a provider connection check.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inboxes/{id}/test":{"post":{"summary":"Test a configured inbox connection without sending email.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inbox-tags":{"get":{"summary":"List mailbox tags and current inbox counts.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: inboxes:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/threads":{"get":{"summary":"List unified inbox threads. Filters: mailbox_id, search, read_state, classification, lead_id, include_warmup, cursor, limit. WarmUp is excluded unless include_warmup=true.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/threads/{threadId}":{"get":{"summary":"Read one unified inbox thread and its safe message content.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/threads/{threadId}/reply":{"post":{"summary":"Reply to one unified inbox thread through its sending mailbox.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReplyRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/threads/{threadId}/read-state":{"post":{"summary":"Mark all inbound messages in a unified inbox thread read or unread.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadReadStateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/threads/{threadId}/archive":{"post":{"summary":"Archive all messages in a unified inbox thread.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/inbox/messages/{messageId}/classification":{"post":{"summary":"Manually classify one inbound unified inbox message.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageClassificationRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: messages:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/warmup":{"get":{"summary":"Read workspace WarmUp metrics and seven-day performance.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: warmup:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/warmup/inboxes":{"get":{"summary":"List WarmUp inbox health, placement, and recent-event rows. Filters: search, domain, state, provider, tag, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: warmup:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/warmup/inboxes/{id}":{"get":{"summary":"Read WarmUp history, recent sends, placement results, and failures for one inbox.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: warmup:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Update WarmUp settings with the current inbox ETag in If-Match.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmupSettingsRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: warmup:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/warmup/inboxes/{id}/toggle":{"post":{"summary":"Enable or disable WarmUp for one inbox with the current inbox ETag in If-Match.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmupToggleRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: warmup:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/webhook-subscriptions":{"get":{"summary":"List customer-owned webhook subscriptions.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Verify and create a signed customer webhook subscription. The signing secret is returned only once.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionCreateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/webhook-subscriptions/{id}":{"get":{"summary":"Read one customer webhook subscription.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Update, verify, enable, or disable a customer webhook subscription.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionUpdateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}},"delete":{"summary":"Disable a customer webhook subscription while retaining delivery history.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/webhook-subscriptions/{id}/test":{"post":{"summary":"Queue a signed test delivery.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/webhook-deliveries":{"get":{"summary":"List safe webhook delivery history. Filters: subscription_id, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/webhook-deliveries/{id}/retry":{"post":{"summary":"Retry one failed webhook delivery.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: webhooks:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/lists":{"get":{"summary":"List lead lists. Filters: search, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: lists:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Create a lead list.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadListCreateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: lists:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/lists/{id}":{"get":{"summary":"Read one lead list.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: lists:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Rename a lead list with an ETag precondition.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadListUpdateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: lists:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}},"delete":{"summary":"Archive a lead list with an ETag precondition.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: lists:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads":{"get":{"summary":"List leads. Filters: search, list_id, status, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Create or upsert a lead by normalized email.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCreateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads/{id}":{"get":{"summary":"Read one lead.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Update a lead with an ETag precondition.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadUpdateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}},"delete":{"summary":"Delete a lead and cancel its pending sequence sends.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads/{id}/send":{"post":{"summary":"Queue one direct lead email through the unified inbox and existing sendability gates. Poll the returned action for the terminal result.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDirectSendRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:send."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads/{id}/lists":{"post":{"summary":"Attach a lead to a list. The current lead ETag is required in If-Match.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadListMembershipRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads/{id}/lists/{listId}":{"delete":{"summary":"Remove a lead from a list. The current lead ETag is required in If-Match.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"listId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: leads:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/leads/{id}/suppress":{"post":{"summary":"Add the lead email to the workspace do-not-contact registry.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadSuppressRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: suppressions:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/suppressions":{"get":{"summary":"List do-not-contact records. Filters: search, kind, reason, source, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: suppressions:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Create a do-not-contact email or domain record.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionCreateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: suppressions:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/suppressions/{id}":{"delete":{"summary":"Remove a do-not-contact record with an ETag precondition.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: suppressions:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/imports":{"get":{"summary":"List CSV imports. Filters: search, list_id, status, cursor, limit.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/imports/{id}":{"get":{"summary":"Read one CSV import without source-file or sample-row data.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/imports/upload-url":{"post":{"summary":"Create a short-lived DigitalOcean Spaces CSV upload URL for a lead list.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportUploadUrlRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/imports/{id}/mapping-suggestion":{"post":{"summary":"Analyze an uploaded CSV and return detected headers, sample rows, and a suggested mapping.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/imports/{id}/mapping":{"post":{"summary":"Confirm the explicit CSV column mapping before import.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportMappingRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/imports/{id}/process":{"post":{"summary":"Queue a confirmed CSV import and return a public action for polling.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"x-request-body":"none","responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: imports:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences":{"get":{"summary":"List sequences. Filters: search, status, cursor, limit. Collection rows contain step_count, not bodies.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Create a draft sequence with steps and explicit or tag-based sender selection.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceCreateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}":{"get":{"summary":"Read a sequence and its editable step templates.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"patch":{"summary":"Update a draft or paused sequence with an ETag precondition.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceUpdateRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}},"delete":{"summary":"Archive a sequence with an ETag precondition.","x-request-body":"none","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/stats":{"get":{"summary":"Read cached sequence totals and live scheduled-send counts per step.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: reports:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/activate":{"post":{"summary":"Activate a sequence and queue its scheduler/enrollment work. Poll the returned action for the terminal result.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/pause":{"post":{"summary":"Pause a sequence and remove its pending sends through the existing scheduler path.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/inbox-resolution":{"post":{"summary":"Preview eligible inboxes for an explicit or tag-based sender selector without changing the sequence.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceInboxResolutionRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/enrollments":{"get":{"summary":"List a sequence's enrollment state. Filters: status, current_step, cursor, limit.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response envelope."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:read."},"404":{"description":"Resource not found in this workspace."},"429":{"description":"Rate limit exceeded."}}},"post":{"summary":"Queue the current leads from one or more lists into a sequence and return a pollable action.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceEnrollRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/enrollments/{enrollmentId}/stop":{"post":{"summary":"Stop one enrollment while preserving its send history.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentStopRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/enrollments/remove":{"post":{"summary":"Asynchronously remove selected or filtered enrollments and cancel their pending sends.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentRemoveRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:write."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}},"/sequences/{id}/test-sends":{"post":{"summary":"Send a saved sequence step as a non-sequence test email and return a safe action result.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceTestSendRequest"}}}},"responses":{"200":{"description":"Successful response envelope."},"202":{"description":"Authorization link created."},"400":{"description":"Validation error."},"401":{"description":"Invalid or expired customer API key."},"403":{"description":"Missing required scope: sequences:send."},"404":{"description":"Resource not found in this workspace."},"409":{"description":"Idempotency key conflict or operation conflict."},"412":{"description":"The resource changed; refresh its ETag and retry."},"428":{"description":"The required If-Match header was not supplied."},"429":{"description":"Rate limit exceeded."}}}}}}