> For the complete documentation index, see [llms.txt](https://run.emailchaser.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://run.emailchaser.com/api-reference/models.md).

# Models

## The models.AttachCampaignSendersRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AttachCampaignSendersRequest":{"type":"object","required":["senderEmailIds"],"properties":{"senderEmailIds":{"description":"SenderEmailIDs are the sender emails to attach. Every ID must be a\nconnected sender email in your workspace; the call is refused whole if\nany is not.","type":"array","minItems":1,"items":{"type":"integer"}}}}}}}
```

## The models.AttachCampaignSendersResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AttachCampaignSendersResponse":{"type":"object","properties":{"alreadyAttached":{"description":"AlreadyAttached lists the requested sender emails that were attached\nbefore this call (the call is idempotent: they are left untouched).","type":"array","items":{"type":"integer"}},"attached":{"description":"Attached lists the sender emails newly attached by this call.","type":"array","items":{"type":"integer"}},"campaignId":{"type":"integer"},"message":{"type":"string"},"senderEmailIds":{"description":"SenderEmailIDs lists every sender email attached to the campaign after\nthis call.","type":"array","items":{"type":"integer"}}}}}}}
```

## The models.AudienceCountResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AudienceCountResponse":{"type":"object","properties":{"audienceSize":{"type":"integer"}}}}}}
```

## The models.AudienceSizeRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AudienceSizeRequest":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"industries":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"seniorities":{"type":"array","items":{"type":"string"}},"titles":{"type":"array","items":{"type":"string"}}}}}}}
```

## The models.AudienceSizeResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AudienceSizeResponse":{"type":"object","properties":{"audienceSize":{"type":"integer"},"icp":{"$ref":"#/components/schemas/models.ICPResponse"}}},"models.ICPResponse":{"type":"object","properties":{"audienceSizedAt":{"description":"AudienceSizedAt is when the audience size was last refreshed (RFC3339),\nor null when it has never been sized.","type":"string"},"companySizes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"estimatedAudienceSize":{"type":"integer"},"id":{"type":"integer"},"industries":{"type":"array","items":{"type":"string"}},"isGenerated":{"description":"IsGenerated is true while the profile is exactly what the AI proposed;\nany human edit clears it.","type":"boolean"},"isPrimary":{"description":"IsPrimary marks the workspace's active profile. At most one per space.","type":"boolean"},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.ICPPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"sourceWebsite":{"type":"string"},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.ICPPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.AutopilotAuditEvent object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AutopilotAuditEvent":{"type":"object","properties":{"actor":{"type":"string"},"at":{"type":"string"},"message":{"type":"string"},"stage":{"type":"string"}}}}}}
```

## The models.AutopilotPlanRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AutopilotPlanRequest":{"type":"object","properties":{"budgetUsd":{"description":"BudgetUsd is the total monthly budget in dollars, inclusive of the\nplatform subscription. Required, must be greater than zero.","type":"number"},"maxMailboxes":{"description":"MaxMailboxes caps infrastructure regardless of budget. 0 means no cap.","type":"integer"},"platformUsd":{"description":"PlatformUsd is the subscription cost to reserve before sizing\ninfrastructure. Defaults to 0.","type":"number"}}}}}}
```

## The models.AutopilotPlanResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AutopilotPlanResponse":{"type":"object","properties":{"credits":{"type":"integer"},"creditsUsd":{"type":"number"},"domains":{"type":"integer"},"expectedMeetingsPerMonth":{"description":"ExpectedMeetingsPerMonth is a planning ESTIMATE on pessimistic funnel\nassumptions, not a promise.","type":"number"},"feasible":{"description":"Feasible reports whether the budget covers a usable setup at all.","type":"boolean"},"firstMonthUsd":{"description":"FirstMonthUsd includes the one-off setup on top of the recurring cost.","type":"number"},"mailboxes":{"type":"integer"},"mailboxesMonthlyUsd":{"type":"number"},"monthlySends":{"type":"integer"},"notes":{"description":"Notes explains anything worth surfacing to a human.","type":"array","items":{"type":"string"}},"prospectsPerMonth":{"type":"integer"},"recurringUsd":{"description":"RecurringUsd is the steady-state monthly cost.","type":"number"},"setupUsd":{"description":"SetupUsd is the one-off cost in the first month (mailbox setup fees and\nannual domain registrations).","type":"number"}}}}}}
```

## The models.AutopilotRunResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AutopilotRunResponse":{"type":"object","properties":{"approvedAt":{"description":"ApprovedAt is when a human approved the run (RFC3339), or null.","type":"string"},"approvedByUserId":{"description":"ApprovedByUserID is who approved the run, or null.","type":"integer"},"audit":{"type":"array","items":{"$ref":"#/components/schemas/models.AutopilotAuditEvent"}},"autoOptimizeVariants":{"type":"boolean"},"autoTopupProspects":{"type":"boolean"},"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"icpId":{"type":"integer"},"id":{"type":"integer"},"killSwitch":{"description":"KillSwitch reports whether the run has been permanently halted.","type":"boolean"},"lastAdvancedAt":{"description":"LastAdvancedAt is when the run last made progress (RFC3339), or null.","type":"string"},"lastError":{"type":"string"},"prospectSearchId":{"type":"integer"},"replyMode":{"type":"string"},"status":{"description":"Status is one of: pending, building_icp, writing_sequence,\nsourcing_prospects, awaiting_approval, provisioning_infrastructure,\nrunning, paused, completed, failed. A run is at sourcing_prospects twice:\nbefore approval it checks for free that prospects match, after approval\n(approvedAt set) it reveals the first batch, which spends credits.","type":"string"},"targetProspectCount":{"type":"integer"},"website":{"type":"string"}}},"models.AutopilotAuditEvent":{"type":"object","properties":{"actor":{"type":"string"},"at":{"type":"string"},"message":{"type":"string"},"stage":{"type":"string"}}}}}}
```

## The models.AutopilotRunResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.AutopilotRunResult":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/models.AutopilotPlanResponse"},"run":{"$ref":"#/components/schemas/models.AutopilotRunResponse"}}},"models.AutopilotPlanResponse":{"type":"object","properties":{"credits":{"type":"integer"},"creditsUsd":{"type":"number"},"domains":{"type":"integer"},"expectedMeetingsPerMonth":{"description":"ExpectedMeetingsPerMonth is a planning ESTIMATE on pessimistic funnel\nassumptions, not a promise.","type":"number"},"feasible":{"description":"Feasible reports whether the budget covers a usable setup at all.","type":"boolean"},"firstMonthUsd":{"description":"FirstMonthUsd includes the one-off setup on top of the recurring cost.","type":"number"},"mailboxes":{"type":"integer"},"mailboxesMonthlyUsd":{"type":"number"},"monthlySends":{"type":"integer"},"notes":{"description":"Notes explains anything worth surfacing to a human.","type":"array","items":{"type":"string"}},"prospectsPerMonth":{"type":"integer"},"recurringUsd":{"description":"RecurringUsd is the steady-state monthly cost.","type":"number"},"setupUsd":{"description":"SetupUsd is the one-off cost in the first month (mailbox setup fees and\nannual domain registrations).","type":"number"}}},"models.AutopilotRunResponse":{"type":"object","properties":{"approvedAt":{"description":"ApprovedAt is when a human approved the run (RFC3339), or null.","type":"string"},"approvedByUserId":{"description":"ApprovedByUserID is who approved the run, or null.","type":"integer"},"audit":{"type":"array","items":{"$ref":"#/components/schemas/models.AutopilotAuditEvent"}},"autoOptimizeVariants":{"type":"boolean"},"autoTopupProspects":{"type":"boolean"},"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"icpId":{"type":"integer"},"id":{"type":"integer"},"killSwitch":{"description":"KillSwitch reports whether the run has been permanently halted.","type":"boolean"},"lastAdvancedAt":{"description":"LastAdvancedAt is when the run last made progress (RFC3339), or null.","type":"string"},"lastError":{"type":"string"},"prospectSearchId":{"type":"integer"},"replyMode":{"type":"string"},"status":{"description":"Status is one of: pending, building_icp, writing_sequence,\nsourcing_prospects, awaiting_approval, provisioning_infrastructure,\nrunning, paused, completed, failed. A run is at sourcing_prospects twice:\nbefore approval it checks for free that prospects match, after approval\n(approvedAt set) it reveals the first batch, which spends credits.","type":"string"},"targetProspectCount":{"type":"integer"},"website":{"type":"string"}}},"models.AutopilotAuditEvent":{"type":"object","properties":{"actor":{"type":"string"},"at":{"type":"string"},"message":{"type":"string"},"stage":{"type":"string"}}}}}}
```

## The models.BillingProfile object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BillingProfile":{"type":"object","properties":{"addressLineOne":{"type":"string"},"addressLineTwo":{"type":"string"},"city":{"type":"string"},"company":{"type":"string"},"country":{"description":"Country is an ISO 3166-1 alpha-2 code, uppercase.","type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"phoneCc":{"description":"PhoneCc is the telephone country calling code without the plus.","type":"string"},"postalAddress":{"description":"PostalAddress is the address rendered on one line, ready to paste into a\ncompliance footer. Read-only; it is derived from the fields above.","type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"updatedAt":{"description":"UpdatedAt is when the profile was last written (RFC3339).","type":"string"}}}}}}
```

## The models.BillingProfileResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BillingProfileResult":{"type":"object","properties":{"billingProfile":{"$ref":"#/components/schemas/models.BillingProfile"}}},"models.BillingProfile":{"type":"object","properties":{"addressLineOne":{"type":"string"},"addressLineTwo":{"type":"string"},"city":{"type":"string"},"company":{"type":"string"},"country":{"description":"Country is an ISO 3166-1 alpha-2 code, uppercase.","type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"phoneCc":{"description":"PhoneCc is the telephone country calling code without the plus.","type":"string"},"postalAddress":{"description":"PostalAddress is the address rendered on one line, ready to paste into a\ncompliance footer. Read-only; it is derived from the fields above.","type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"updatedAt":{"description":"UpdatedAt is when the profile was last written (RFC3339).","type":"string"}}}}}}
```

## The models.BlacklistListingResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlacklistListingResponse":{"type":"object","properties":{"answer":{"type":"string"},"delistUrl":{"description":"DelistURL is where to request removal. Always present: a listing you\ncannot act on is trivia.","type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"reason":{"type":"string"},"txt":{"type":"string"},"value":{"type":"string"},"zone":{"type":"string"}}}}}}
```

## The models.BlocklistAddRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistAddRequest":{"type":"object","required":["values"],"properties":{"scope":{"description":"Scope is \"workspace\" (default) or \"global\". A global entry suppresses\nacross every workspace on the account and can only be written with a\nmain workspace's API key.","type":"string","enum":["workspace","global"]},"values":{"description":"Values holds the email addresses and/or domains to block, up to 1000 per\nrequest.","type":"array","items":{"type":"string"}}}}}}}
```

## The models.BlocklistAddResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistAddResponse":{"type":"object","properties":{"created":{"description":"Created is the number of new suppression entries written.","type":"integer"},"scope":{"description":"Scope is the list the entries were written to.","type":"string","enum":["workspace","global"]},"skipped":{"description":"Skipped is the number of values ignored because they already existed or\nfailed validation.","type":"integer"}}}}}}
```

## The models.BlocklistDeleteEntryResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistDeleteEntryResponse":{"type":"object","properties":{"id":{"type":"integer"},"message":{"type":"string"}}}}}}
```

## The models.BlocklistDeleteRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistDeleteRequest":{"type":"object","properties":{"ids":{"description":"Ids are entry ids as returned by GET /blocklist.","type":"array","items":{"type":"integer"}},"scope":{"description":"Scope limits the delete to one list: \"workspace\" (default), \"global\", or\n\"all\". Deleting from \"global\" requires a main workspace's key.","type":"string","enum":["workspace","global","all"]},"values":{"description":"Values are domains or email addresses to unblock, matched\ncase-insensitively. Values not present are counted as skipped.","type":"array","items":{"type":"string"}}}}}}}
```

## The models.BlocklistDeleteResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistDeleteResponse":{"type":"object","properties":{"deleted":{"description":"Deleted is the number of entries removed.","type":"integer"},"skipped":{"description":"Skipped is the number of requested values or ids that matched nothing\nthe caller may delete.","type":"integer"}}}}}}
```

## The models.BlocklistEntry object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistEntry":{"type":"object","properties":{"createdAt":{"type":"string"},"domain":{"type":"string"},"emailAddress":{"description":"EmailAddress is the blocked address when the entry blocks one address\nrather than a whole domain.","type":"string"},"id":{"type":"integer"},"scope":{"description":"Scope is \"workspace\" for the calling workspace's own entry, \"global\" for\nan account-wide one.","type":"string","enum":["workspace","global"]},"workspaceId":{"description":"WorkspaceId is the workspace the entry is stored on. For a global entry\nread from a sub-workspace this is the main workspace, not the caller.","type":"integer"}}}}}}
```

## The models.BlocklistListResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/models.BlocklistEntry"}},"totalCount":{"type":"integer"}}},"models.BlocklistEntry":{"type":"object","properties":{"createdAt":{"type":"string"},"domain":{"type":"string"},"emailAddress":{"description":"EmailAddress is the blocked address when the entry blocks one address\nrather than a whole domain.","type":"string"},"id":{"type":"integer"},"scope":{"description":"Scope is \"workspace\" for the calling workspace's own entry, \"global\" for\nan account-wide one.","type":"string","enum":["workspace","global"]},"workspaceId":{"description":"WorkspaceId is the workspace the entry is stored on. For a global entry\nread from a sub-workspace this is the main workspace, not the caller.","type":"integer"}}}}}}
```

## The models.BlocklistUpdateRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.BlocklistUpdateRequest":{"type":"object","properties":{"scope":{"description":"Scope moves the entry between the workspace list and the account-wide\nlist. Moving an entry to \"global\" requires a main workspace's key.","type":"string","enum":["workspace","global"]},"value":{"description":"Value is the new domain or email address. Which of the two the entry\nholds is re-inferred from whether the value contains \"@\", so an entry\ncan be converted between a domain block and an address block.","type":"string"}}}}}}
```

## The models.CampaignEmailCounts object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignEmailCounts":{"type":"object","properties":{"blocked":{"type":"integer"},"bounced":{"type":"integer"},"canceled":{"type":"integer"},"catchAll":{"type":"integer"},"deferred":{"type":"integer"},"delivered":{"type":"integer"},"draft":{"type":"integer"},"dropped":{"type":"integer"},"errorOnSent":{"type":"integer"},"followUp":{"type":"integer"},"followUpCanceled":{"type":"integer"},"followUpDraft":{"type":"integer"},"invalid":{"type":"integer"},"pending":{"type":"integer"},"replied":{"type":"integer"},"scheduled":{"type":"integer"},"sent":{"type":"integer"},"spamReport":{"type":"integer"},"total":{"type":"integer"},"waitingForReschedule":{"type":"integer"}}}}}}
```

## The models.CampaignListItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignListItem":{"type":"object","properties":{"createdAt":{"type":"string"},"emoji":{"type":"string"},"flow":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"stats":{"$ref":"#/components/schemas/models.CampaignStats"},"status":{"type":"string"},"updatedAt":{"type":"string"}}},"models.CampaignStats":{"type":"object","properties":{"bouncedLeadsCount":{"type":"integer"},"contactedLeadsCount":{"type":"integer"},"emailsSentCount":{"type":"integer"},"leadsRespondedPositivelyCount":{"type":"integer"},"repliedLeadsCount":{"type":"integer"},"senderEmailsConnected":{"type":"integer"},"senderEmailsDisconnected":{"type":"integer"},"senderEmailsTotal":{"type":"integer"}}}}}}
```

## The models.CampaignSchedule object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignSchedule":{"type":"object","properties":{"cronSchedule":{"type":"string"},"daysSchedule":{"type":"array","items":{"type":"string"}},"endSchedule":{"type":"string"},"everySchedule":{"type":"integer"},"maximumTimeBetweenEmails":{"type":"integer"},"minimumTimeBetweenEmails":{"type":"integer"},"startSchedule":{"type":"string"}}}}}}
```

## The models.CampaignSettings object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignSettings":{"type":"object","properties":{"allowNonBusinessEmails":{"type":"boolean"},"dailyLimit":{"description":"DailyLimit is the campaign-level cap on total emails scheduled per\ncalendar day (campaign timezone). null means no campaign-level cap.","type":"integer"},"ignoreOutOfOfficeReplies":{"type":"boolean"},"isEnabledCatchallValidated":{"type":"boolean"},"isEnabledEmailVerifier":{"type":"boolean"},"isEnabledIgnoreHardBouncedLeads":{"type":"boolean"},"isEnabledIgnoreLeadsWhoAlreadyResponded":{"type":"boolean"},"isEnabledLlm":{"type":"boolean"},"isEnabledSkipLeadIfAlreadyExists":{"type":"boolean"},"isEnabledStopFollowUpsAcrossCampaigns":{"type":"boolean"},"isEnabledStopFollowUpsForSameCompany":{"type":"boolean"},"isEnabledStopFollowUpsOnReply":{"type":"boolean"},"maximumSendingLimitPerSenderEmail":{"type":"integer"},"maximumSendingLimitPerSenderEmailVariation":{"type":"integer"}}}}}}
```

## The models.CampaignStats object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignStats":{"type":"object","properties":{"bouncedLeadsCount":{"type":"integer"},"contactedLeadsCount":{"type":"integer"},"emailsSentCount":{"type":"integer"},"leadsRespondedPositivelyCount":{"type":"integer"},"repliedLeadsCount":{"type":"integer"},"senderEmailsConnected":{"type":"integer"},"senderEmailsDisconnected":{"type":"integer"},"senderEmailsTotal":{"type":"integer"}}}}}}
```

## The models.CampaignStatsDay object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignStatsDay":{"type":"object","properties":{"date":{"type":"string"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.CampaignStatsStep object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignStatsStep":{"type":"object","properties":{"index":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.CampaignStatsTotals object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignStatsTotals":{"type":"object","properties":{"bounced":{"type":"integer"},"meetings":{"type":"integer"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.CampaignStatsVariant object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CampaignStatsVariant":{"type":"object","properties":{"label":{"type":"string"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.CancelEmailVerificationJobResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CancelEmailVerificationJobResponse":{"type":"object","properties":{"message":{"type":"string"}}}}}}
```

## The models.CheckDfyDomainResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CheckDfyDomainResponse":{"type":"object","properties":{"available":{"type":"boolean"},"domain":{"type":"string"},"price":{"type":"number"},"reason":{"description":"Reason says why the domain cannot be bought, in words that can be shown\nto a person. Empty when available is true.","type":"string"},"tld":{"type":"string"},"unconfirmed":{"description":"Unconfirmed is true when we could not get an answer at all rather than\nthe answer \"no\". Do not report these as taken; offer a retry.","type":"boolean"}}}}}}
```

## The models.CheckDfyDomainsRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CheckDfyDomainsRequest":{"type":"object","required":["domains"],"properties":{"domains":{"type":"array","items":{"type":"string"}}}}}}}
```

## The models.CheckDfyDomainsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CheckDfyDomainsResponse":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/models.CheckDfyDomainResponse"}}}},"models.CheckDfyDomainResponse":{"type":"object","properties":{"available":{"type":"boolean"},"domain":{"type":"string"},"price":{"type":"number"},"reason":{"description":"Reason says why the domain cannot be bought, in words that can be shown\nto a person. Empty when available is true.","type":"string"},"tld":{"type":"string"},"unconfirmed":{"description":"Unconfirmed is true when we could not get an answer at all rather than\nthe answer \"no\". Do not report these as taken; offer a retry.","type":"boolean"}}}}}}
```

## The models.ConnectSenderEmailRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ConnectSenderEmailRequest":{"type":"object","required":["email","imapServerUrl","password","smtpServerUrl"],"properties":{"email":{"type":"string"},"firstName":{"type":"string","maxLength":255},"imapServerUrl":{"description":"ImapServerUrl and SmtpServerUrl accept the provider's host, optionally\nwith a port, for example \"imap.fastmail.com:993\".","type":"string","minLength":1},"lastName":{"type":"string","maxLength":255},"loginString":{"description":"LoginString defaults to the email address when omitted, which is what\nmost providers expect.","type":"string"},"password":{"type":"string","minLength":1},"smtpServerUrl":{"type":"string","minLength":1}}}}}}
```

## The models.ConnectSenderEmailResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ConnectSenderEmailResponse":{"type":"object","properties":{"message":{"type":"string"},"senderEmail":{"$ref":"#/components/schemas/models.SenderEmailResponse"}}},"models.SenderEmailResponse":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"connectionHistory":{"type":"array","items":{"$ref":"#/components/schemas/models.ConnectionHistoryItem"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"lastDisconnectedAt":{"type":"string"},"lastReconnectedAt":{"type":"string"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"pictureUrl":{"type":"string"},"provider":{"type":"string"},"provisioningStatus":{"type":"string"},"signature":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}},"models.ConnectionHistoryItem":{"type":"object","properties":{"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"disconnectionReason":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"eventType":{"type":"string"},"id":{"type":"integer"},"userId":{"type":"integer"}}}}}}
```

## The models.ConnectionHistoryItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ConnectionHistoryItem":{"type":"object","properties":{"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"disconnectionReason":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"eventType":{"type":"string"},"id":{"type":"integer"},"userId":{"type":"integer"}}}}}}
```

## The models.ConversationItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ConversationItem":{"type":"object","properties":{"body":{"type":"string"},"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"direction":{"description":"Direction is \"inbound\" (received from the prospect) or \"outbound\"\n(sent, scheduled, or drafted by the workspace).","type":"string"},"fromAddress":{"type":"string"},"id":{"type":"integer"},"isDraft":{"description":"IsDraft marks unsent drafts (status draft or followup_draft), including\nAI-suggested replies awaiting human review. Drafts cannot be sent\nthrough the REST API.","type":"boolean"},"responseCategory":{"description":"ResponseCategory is set on categorized inbound emails and null\neverywhere else.","type":"string"},"sentAt":{"description":"SentAt is the scheduled or actual send time and null when the email has\nnone (e.g. an AI draft that was never scheduled).","type":"string"},"status":{"type":"string"},"subject":{"type":"string"},"threadId":{"type":"string"}}}}}}
```

## The models.CopilotICP object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotICP":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"icpName":{"type":"string"},"industries":{"type":"array","items":{"type":"string"}},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.CopilotPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"suggestedSalesNavKeywords":{"type":"array","items":{"type":"string"}},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.CopilotPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.CopilotLaunchRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotLaunchRequest":{"type":"object","required":["name","salesNavSearchUrl","sequence"],"properties":{"icp":{"description":"ICP is optional and carried through for reference only.","allOf":[{"$ref":"#/components/schemas/models.CopilotICP"}]},"name":{"description":"Name is the campaign name.","type":"string"},"salesNavData":{"description":"SalesNavData is the optional base64 browser-extension payload that carries\nthe LinkedIn session required to actually run the search. When omitted the\nlead engine cannot authenticate to LinkedIn (see docs), so provide it to\nstart real extraction.","type":"string"},"salesNavSearchUrl":{"description":"SalesNavSearchURL is the LinkedIn Sales Navigator search URL the lead\nengine should extract leads from.","type":"string"},"sequence":{"description":"Sequence is the cold-email sequence to seed the draft campaign with.","type":"array","items":{"$ref":"#/components/schemas/models.CopilotSequenceStep"}}}},"models.CopilotICP":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"icpName":{"type":"string"},"industries":{"type":"array","items":{"type":"string"}},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.CopilotPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"suggestedSalesNavKeywords":{"type":"array","items":{"type":"string"}},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.CopilotPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}},"models.CopilotSequenceStep":{"type":"object","required":["body","subject"],"properties":{"body":{"type":"string"},"followUpAfter":{"description":"FollowUpAfter is the number of days after the previous step. 0 for the\ninitial email; 1-30 for follow-ups.","type":"integer"},"subject":{"type":"string"}}}}}}
```

## The models.CopilotLaunchResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotLaunchResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"jobId":{"type":"string"},"message":{"type":"string"},"status":{"type":"string"}}}}}}
```

## The models.CopilotPersona object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.CopilotPlanRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotPlanRequest":{"type":"object","required":["website"],"properties":{"context":{"description":"Context is optional extra guidance from the caller (e.g. \"we sell to\ndentists in the US\").","type":"string"},"website":{"description":"Website is the company homepage to analyse (with or without scheme).","type":"string"}}}}}}
```

## The models.CopilotPlanResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotPlanResponse":{"type":"object","properties":{"icp":{"$ref":"#/components/schemas/models.CopilotICP"},"suggestedSequence":{"type":"array","items":{"$ref":"#/components/schemas/models.CopilotSequenceStep"}}}},"models.CopilotICP":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"icpName":{"type":"string"},"industries":{"type":"array","items":{"type":"string"}},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.CopilotPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"suggestedSalesNavKeywords":{"type":"array","items":{"type":"string"}},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.CopilotPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}},"models.CopilotSequenceStep":{"type":"object","required":["body","subject"],"properties":{"body":{"type":"string"},"followUpAfter":{"description":"FollowUpAfter is the number of days after the previous step. 0 for the\ninitial email; 1-30 for follow-ups.","type":"integer"},"subject":{"type":"string"}}}}}}
```

## The models.CopilotSequenceStep object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CopilotSequenceStep":{"type":"object","required":["body","subject"],"properties":{"body":{"type":"string"},"followUpAfter":{"description":"FollowUpAfter is the number of days after the previous step. 0 for the\ninitial email; 1-30 for follow-ups.","type":"integer"},"subject":{"type":"string"}}}}}}
```

## The models.CreateCampaignRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateCampaignRequest":{"type":"object","required":["name"],"properties":{"allowNonBusinessEmails":{"type":"boolean"},"dailyLimit":{"description":"DailyLimit caps the total emails (initial + follow-ups) this campaign may\nschedule per calendar day in the campaign timezone. Omit for no\ncampaign-level cap; per-inbox limits still apply either way.","type":"integer","maximum":10000,"minimum":1},"emoji":{"type":"string","maxLength":10,"minLength":1},"flow":{"description":"Flow defaults to multiple_leads_scheduled, which is what the app creates,\nso a campaign made through the API behaves identically to one made in the\nUI. The api flow skips lead validation and the processing-leads guard at\nlaunch; pass it only if you want that.","type":"string","enum":["multiple_leads_scheduled","api"]},"ignoreOutOfOfficeReplies":{"type":"boolean"},"isEnabledCatchallValidated":{"type":"boolean"},"isEnabledEmailVerifier":{"type":"boolean"},"isEnabledIgnoreHardBouncedLeads":{"type":"boolean"},"isEnabledIgnoreLeadsWhoAlreadyResponded":{"type":"boolean"},"isEnabledLlm":{"description":"Settings - all optional, mirroring UpdateCampaignRequest","type":"boolean"},"isEnabledSkipLeadIfAlreadyExists":{"type":"boolean"},"isEnabledStopFollowUpsForSameCompany":{"type":"boolean"},"isEnabledStopFollowUpsOnReply":{"type":"boolean"},"maximumSendingLimitPerSenderEmail":{"type":"integer","maximum":10000,"minimum":1},"maximumSendingLimitPerSenderEmailVariation":{"type":"integer","maximum":100,"minimum":0},"maximumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"minimumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"name":{"type":"string","maxLength":255,"minLength":1},"timezone":{"type":"string"}}}}}}
```

## The models.CreateCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateCampaignResponse":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/models.CreatedCampaign"},"message":{"type":"string"}}},"models.CreatedCampaign":{"type":"object","properties":{"createdAt":{"type":"string"},"emoji":{"type":"string"},"flow":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string"},"timezone":{"type":"string"},"updatedAt":{"type":"string"}}}}}}
```

## The models.CreateDfyOrderRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateDfyOrderRequest":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/models.DfyDomainInput"}},"forwardingDomain":{"description":"ForwardingDomain is where the purchased domains redirect visitors.","type":"string"},"mailboxes":{"type":"array","items":{"$ref":"#/components/schemas/models.DfyMailboxInput"}}}},"models.DfyDomainInput":{"type":"object","required":["domainName"],"properties":{"domainName":{"type":"string"}}},"models.DfyMailboxInput":{"type":"object","required":["domainName","firstName","lastName","username"],"properties":{"domainName":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"profilePicture":{"type":"string"},"username":{"type":"string"}}}}}}
```

## The models.CreateEmailVerificationJobRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateEmailVerificationJobRequest":{"type":"object","required":["emails","name"],"properties":{"emails":{"description":"Emails are the addresses to verify. Duplicates are removed before\nanything is charged, and syntactically invalid entries are returned in\ninvalid_emails rather than billed.","type":"array","items":{"type":"string"}},"name":{"description":"Name is what the job is called in the app. Required.","type":"string"}}}}}}
```

## The models.CreateEmailVerificationJobResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateEmailVerificationJobResponse":{"type":"object","properties":{"duplicate_rows":{"description":"DuplicateRows is how many repeats were removed. Each one would have been\na second paid check for an answer already bought.","type":"integer"},"estimate_high_usd":{"description":"EstimateHighUsd assumes every address runs both providers. This is the\ncommon case and the number to plan against.","type":"number"},"estimate_low_usd":{"description":"EstimateLowUsd assumes every address settles on the first provider.","type":"number"},"id":{"description":"ID of the created job.","type":"string"},"invalid_emails":{"description":"InvalidEmails are the submitted entries that are not addresses at all.\nThey were not charged for and are not in the job.","type":"array","items":{"type":"string"}},"total":{"description":"Total is how many addresses were accepted, after removing duplicates\nand unparseable entries.","type":"integer"}}}}}}
```

## The models.CreateICPRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateICPRequest":{"type":"object","required":["name"],"properties":{"companySizes":{"type":"array","items":{"type":"string"}},"industries":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"makePrimary":{"description":"MakePrimary promotes this profile to the workspace's active one,\ndemoting any existing primary.","type":"boolean"},"name":{"type":"string"},"seniorities":{"type":"array","items":{"type":"string"}},"summary":{"description":"Summary is one to three sentences describing who the workspace sells to.","type":"string"},"titles":{"type":"array","items":{"type":"string"}}}}}}}
```

## The models.CreateLeadsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateLeadsResponse":{"type":"object","properties":{"count":{"type":"integer"},"leads":{"type":"array","items":{"$ref":"#/components/schemas/models.CreatedLead"}},"message":{"type":"string"}}},"models.CreatedLead":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"integer"}}}}}}
```

## The models.CreateOrUpdateLeadsRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateOrUpdateLeadsRequest":{"type":"object","required":["leads"],"properties":{"campaignId":{"type":"integer"},"leads":{"type":"array","maxItems":1000,"minItems":1,"items":{"$ref":"#/components/schemas/models.LeadInput"}}}},"models.LeadInput":{"type":"object","required":["email"],"properties":{"company":{"type":"string"},"customVariables":{"description":"CustomVariables holds any attribute the eight named fields do not cover,\nfor example the page a visitor landed on. Each key becomes a merge tag\nusable in email copy as {key}. Keys are matched case-insensitively with\nspaces treated as underscores, so \"Page Visited\" and \"page_visited\" are\nthe same tag. Values are stored as given; non-string values are rendered\nwith their JSON representation at send time.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"title":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.CreateWorkspaceApiKeyRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateWorkspaceApiKeyRequest":{"type":"object","properties":{"name":{"description":"Name shown in the app's API key list. Defaults to\n\"<workspace name> key\". Trimmed; up to 60 characters.","type":"string"},"readOnly":{"description":"ReadOnly mints a key that can call GET routes and four POSTs that buy\nand send nothing (/r/audience/size, /r/setup/ping,\n/r/dfy/domains/check and /r/lead-finder/searches), and nothing else.\nDefaults to false, which mints a read+write key.","type":"boolean"}}}}}}
```

## The models.CreateWorkspaceApiKeyResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateWorkspaceApiKeyResponse":{"type":"object","properties":{"apiKey":{"$ref":"#/components/schemas/models.CreatedApiKey"},"note":{"description":"Note reminds integrators that fullKey is not retrievable later.","type":"string"},"workspace":{"$ref":"#/components/schemas/models.WorkspaceItem"}}},"models.CreatedApiKey":{"type":"object","properties":{"expiresAt":{"description":"ExpiresAt is set when the key expires: it inherits the calling key's\nown expiry, so a temporary key never mints a permanent one. Null for\nkeys minted by a non-expiring key.","type":"string"},"fullKey":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}},"models.WorkspaceItem":{"type":"object","properties":{"createdAt":{"type":"string"},"iconUrl":{"description":"IconURL is where the workspace's icon image can be loaded from. Empty\nwhen the workspace has none. Icons are uploaded in the app.","type":"string"},"id":{"type":"integer"},"isCurrent":{"description":"IsCurrent is true for the workspace the calling API key is bound to.","type":"boolean"},"name":{"type":"string"}}}}}}
```

## The models.CreateWorkspaceRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateWorkspaceRequest":{"type":"object","required":["name"],"properties":{"generateApiKey":{"description":"GenerateApiKey mints a read+write API key bound to the new workspace.\nDefaults to true; pass false to create the workspace only.","type":"boolean"},"name":{"description":"Name of the new workspace. Trimmed; 1-60 characters.","type":"string"}}}}}}
```

## The models.CreateWorkspaceResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreateWorkspaceResponse":{"type":"object","properties":{"apiKey":{"description":"ApiKey is null when generateApiKey was false.","allOf":[{"$ref":"#/components/schemas/models.CreatedApiKey"}]},"note":{"description":"Note reminds integrators that fullKey is not retrievable later.","type":"string"},"workspace":{"$ref":"#/components/schemas/models.WorkspaceItem"}}},"models.CreatedApiKey":{"type":"object","properties":{"expiresAt":{"description":"ExpiresAt is set when the key expires: it inherits the calling key's\nown expiry, so a temporary key never mints a permanent one. Null for\nkeys minted by a non-expiring key.","type":"string"},"fullKey":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}},"models.WorkspaceItem":{"type":"object","properties":{"createdAt":{"type":"string"},"iconUrl":{"description":"IconURL is where the workspace's icon image can be loaded from. Empty\nwhen the workspace has none. Icons are uploaded in the app.","type":"string"},"id":{"type":"integer"},"isCurrent":{"description":"IsCurrent is true for the workspace the calling API key is bound to.","type":"boolean"},"name":{"type":"string"}}}}}}
```

## The models.CreatedApiKey object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreatedApiKey":{"type":"object","properties":{"expiresAt":{"description":"ExpiresAt is set when the key expires: it inherits the calling key's\nown expiry, so a temporary key never mints a permanent one. Null for\nkeys minted by a non-expiring key.","type":"string"},"fullKey":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}}}}}
```

## The models.CreatedCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreatedCampaign":{"type":"object","properties":{"createdAt":{"type":"string"},"emoji":{"type":"string"},"flow":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string"},"timezone":{"type":"string"},"updatedAt":{"type":"string"}}}}}}
```

## The models.CreatedLead object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreatedLead":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"integer"}}}}}}
```

## The models.CreditBalanceResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreditBalanceResponse":{"type":"object","properties":{"available":{"type":"integer"},"lifetimeGranted":{"type":"integer"},"lifetimeUsed":{"type":"integer"},"monthlyGrant":{"type":"integer"},"reserved":{"type":"integer"},"unlimited":{"description":"Unlimited is true when this workspace's credits are free: every credit\naction goes through without spending available, nothing is refused for\nlack of credits, and POST /credits/purchase is refused (code\ncredits_free) because there is nothing to buy.","type":"boolean"}}}}}}
```

## The models.CreditTransactionItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.CreditTransactionItem":{"type":"object","properties":{"amount":{"description":"Amount is the signed credit delta: negative for spend, positive for\ngrants and refunds.","type":"integer"},"balanceAfter":{"description":"BalanceAfter is the available balance immediately after this entry.","type":"integer"},"createdAt":{"type":"string"},"description":{"type":"string"},"free":{"description":"Free is true for an entry written while this workspace's credits were\nfree. Its amount is what the action would have cost, no credits moved,\nand balanceAfter is the balance it found.","type":"boolean"},"id":{"type":"integer"},"kind":{"description":"Kind is the movement type: grant, topup, reserve, commit, refund,\nexpire or adjustment.","type":"string"},"reason":{"description":"Reason is what the credits were spent on or granted for.","type":"string"},"reference":{"description":"Reference correlates the entry to what caused it, e.g. 'prospect_search:123'.","type":"string"}}}}}}
```

## The models.DeleteCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DeleteCampaignResponse":{"type":"object","properties":{"id":{"type":"integer"},"message":{"type":"string"}}}}}}
```

## The models.DeleteICPResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DeleteICPResponse":{"type":"object","properties":{"success":{"type":"boolean"}}}}}}
```

## The models.DeleteLeadResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DeleteLeadResponse":{"type":"object","properties":{"id":{"type":"integer"},"message":{"type":"string"}}}}}}
```

## The models.DeleteWebhookResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DeleteWebhookResponse":{"type":"object","properties":{"id":{"type":"integer"},"message":{"type":"string"}}}}}}
```

## The models.DetachCampaignSenderResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DetachCampaignSenderResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"detached":{"description":"Detached is false when the sender email was not attached to the\ncampaign (the call is idempotent and does nothing in that case).","type":"boolean"},"message":{"type":"string"},"senderEmailIds":{"description":"SenderEmailIDs lists every sender email still attached to the campaign\nafter this call.","type":"array","items":{"type":"integer"}}}}}}}
```

## The models.DfyDomainInput object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyDomainInput":{"type":"object","required":["domainName"],"properties":{"domainName":{"type":"string"}}}}}}
```

## The models.DfyDomainSuggestion object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyDomainSuggestion":{"type":"object","properties":{"available":{"type":"boolean"},"domain":{"type":"string"},"price":{"type":"number"},"tld":{"type":"string"}}}}}}
```

## The models.DfyMailboxInput object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyMailboxInput":{"type":"object","required":["domainName","firstName","lastName","username"],"properties":{"domainName":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"profilePicture":{"type":"string"},"username":{"type":"string"}}}}}}
```

## The models.DfyOrderConflictResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyOrderConflictResponse":{"type":"object","properties":{"error":{"type":"string"},"existingOrderId":{"type":"integer"}}}}}}
```

## The models.DfyOrderResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyOrderResponse":{"type":"object","properties":{"completedAt":{"description":"CompletedAt is when the order completed (RFC3339), or null.","type":"string"},"cost_breakdown":{},"createdAt":{"type":"string"},"domains":{},"externalOrderId":{"type":"string"},"failureReason":{"type":"string"},"forwardingDomain":{},"id":{"type":"integer"},"mailboxes":{},"processedAt":{"description":"ProcessedAt is when the order started processing (RFC3339), or null.","type":"string"},"status":{"description":"Status is one of: created, pending_approval, processing, completed,\nfailed, partially_completed, canceled.","type":"string"}}}}}}
```

## The models.DfyOrderResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DfyOrderResult":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/models.DfyOrderResponse"}}},"models.DfyOrderResponse":{"type":"object","properties":{"completedAt":{"description":"CompletedAt is when the order completed (RFC3339), or null.","type":"string"},"cost_breakdown":{},"createdAt":{"type":"string"},"domains":{},"externalOrderId":{"type":"string"},"failureReason":{"type":"string"},"forwardingDomain":{},"id":{"type":"integer"},"mailboxes":{},"processedAt":{"description":"ProcessedAt is when the order started processing (RFC3339), or null.","type":"string"},"status":{"description":"Status is one of: created, pending_approval, processing, completed,\nfailed, partially_completed, canceled.","type":"string"}}}}}}
```

## The models.DkimCheckResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DkimCheckResult":{"type":"object","properties":{"checkedSelectors":{"description":"CheckedSelectors is every selector name looked up, in the order tried.","type":"array","items":{"type":"string"}},"issues":{"type":"array","items":{"type":"string"}},"record":{"type":"string"},"selector":{"description":"Selector is the DKIM selector the record was found under, null when no\nrecord was found.","type":"string"},"selectorSource":{"description":"SelectorSource says where selector came from: SIGNATURE (read off the\nDKIM-Signature of this domain's warm-up mail), CUSTOMER (set in the app)\nor COMMON (a provider's default name). Null when none was found.","type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR. MISSING means no key was\nfound under the selectors in checkedSelectors: a provider that picks its\nown selector name can have DKIM working while this says MISSING. ERROR\nmeans a DNS lookup timed out; try again.","type":"string"}}}}}}
```

## The models.DmarcCheckResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.DmarcCheckResult":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"string"}},"policy":{"description":"Policy is the record's p= tag, null when no record was found.","type":"string"},"record":{"type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}}}}}
```

## The models.EmailVerificationErrorResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.EmailVerificationErrorResponse":{"type":"object","properties":{"available_usd":{"description":"AvailableUsd is set on insufficient_allowance: what is left this month.","type":"number"},"error":{"description":"Error is the machine-readable code: insufficient_allowance,\nsubscription_not_active, no_active_subscription or invalid_request.","type":"string"},"message":{"description":"Message is the human-readable explanation.","type":"string"},"needed_usd":{"description":"NeededUsd is set on insufficient_allowance: what the job would cost at\nthe ceiling.","type":"number"}}}}}}
```

## The models.EmailVerificationJobResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.EmailVerificationJobResponse":{"type":"object","properties":{"catchall":{"description":"Catchall accepts everything at the domain, so deliverability is likely\nbut not proven.","type":"integer"},"end_time":{"description":"EndTime in RFC3339, zero while the job is still running.","type":"string"},"error_code":{"description":"ErrorCode is empty on a healthy job. monthly_limit_reached means the\nallowance ran out and the remaining addresses came back unknown rather\nthan missing; they are still in the download, marked.","type":"string"},"id":{"type":"string"},"invalid":{"description":"Invalid will bounce.","type":"integer"},"meter_events":{"description":"MeterEvents is what the job has billed so far. Every check runs up to\ntwo providers and each one that answers is one event, so an address\ncosts one event or two.","type":"integer"},"name":{"description":"Name the job was created with.","type":"string"},"processed":{"description":"Processed is how many have a verdict yet.","type":"integer"},"spent_usd":{"description":"SpentUsd is MeterEvents priced at the meter rate: what this job adds to\nthe invoice, not an estimate.","type":"number"},"start_time":{"description":"StartTime in RFC3339.","type":"string"},"state":{"description":"State is pending, running, done, failed or canceled.","type":"string"},"total":{"description":"Total addresses in the job.","type":"integer"},"unknown":{"description":"Unknown got no verdict, so it was NOT billed. Usually a provider\nfailure or the workspace's monthly verification allowance running out\nmid-job, in which case error_code says which.","type":"integer"},"valid":{"description":"Valid is deliverable.","type":"integer"}}}}}}
```

## The models.EmailVerificationRatesResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.EmailVerificationRatesResponse":{"type":"object","properties":{"bounceban_usd":{"description":"BounceBanUsd is one first-provider check.","type":"number"},"onelookup_usd":{"description":"OneLookupUsd is one second-provider check.","type":"number"},"per_address_ceiling_usd":{"description":"PerAddressCeilingUsd is the most an address can cost: both providers\nanswering. This is the common case, so budget against this one.","type":"number"},"per_address_floor_usd":{"description":"PerAddressFloorUsd is the least an address can cost: the first provider\nalone, which happens when it rejects the address outright.","type":"number"}}}}}}
```

## The models.EmailVerificationRecordResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.EmailVerificationRecordResponse":{"type":"object","properties":{"bounceban_result":{"description":"BouncebanResult is what the first provider said.","type":"string"},"email":{"type":"string"},"error":{"description":"Error is set when the address could not be answered.","type":"string"},"id":{"type":"string"},"meter_events":{"description":"MeterEvents is what this address billed: 0, 1 or 2.","type":"integer"},"onelookup_result":{"description":"OnelookupResult is what the second provider said. unknown means it never\nran, which is what happens when the first provider rejected the address\noutright, and nothing was billed for it.","type":"string"},"result":{"description":"Result is valid, catchall_validated, invalid or unknown. The same four\nvalues a campaign's send-time gate uses, so an address checked here and\none checked inside a campaign answer the same.","type":"string"},"status":{"description":"Status is done, failed, skipped or pending.","type":"string"},"verified_at":{"description":"VerifiedAt in RFC3339.","type":"string"}}}}}}
```

## The models.ErrorBillingProfileNotFound object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorBillingProfileNotFound":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorCampaignNotFound object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorCampaignNotFound":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorCampaignValidation object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorCampaignValidation":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToCheckDNS object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToCheckDNS":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToConnectSenderEmail object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToConnectSenderEmail":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToCreateCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToCreateCampaign":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToCreateLeads object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToCreateLeads":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToDeleteCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToDeleteCampaign":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToDeleteLead object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToDeleteLead":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToDeleteWebhook object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToDeleteWebhook":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToGetWarmupSettings object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToGetWarmupSettings":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToLaunchCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToLaunchCampaign":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToMoveLead object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToMoveLead":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToPauseCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToPauseCampaign":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToRegisterWebhook object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToRegisterWebhook":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToReplaceSequence object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToReplaceSequence":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToRetrieveLeads object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToRetrieveLeads":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToRetrieveSequence object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToRetrieveSequence":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToUpdateCampaign object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToUpdateCampaign":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToUpdateLead object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToUpdateLead":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToUpdateSenderEmail object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToUpdateSenderEmail":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToUpdateWarmupSettings object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToUpdateWarmupSettings":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorFailedToUpdateWebhook object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorFailedToUpdateWebhook":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorForbidden object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorForbidden":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidCampaignID object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidCampaignID":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidCategory object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidCategory":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidLeadID object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidLeadID":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidRequest":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidSenderEmailAddress object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidSenderEmailAddress":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidSenderEmailID object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidSenderEmailID":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidSequence object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidSequence":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidWarmupSettings object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidWarmupSettings":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidWebhookID object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidWebhookID":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorInvalidWebhookType object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorInvalidWebhookType":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorNotFound object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorNotFound":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorSenderEmailAlreadyConnected object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorSenderEmailAlreadyConnected":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorSenderEmailNoDomain object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorSenderEmailNoDomain":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorSenderEmailNotConnected object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorSenderEmailNotConnected":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorSenderEmailNotFound object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorSenderEmailNotFound":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorSenderEmailPlanLimit object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorSenderEmailPlanLimit":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorUnauthorized object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorUnauthorized":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorUnsupportedCampaignFlow object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorUnsupportedCampaignFlow":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorWarmupSettingsConflict object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorWarmupSettingsConflict":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.ErrorWebhookNotFound object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ErrorWebhookNotFound":{"type":"object","properties":{"error":{"type":"string"}}}}}}
```

## The models.GetCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetCampaignResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"emails":{"$ref":"#/components/schemas/models.CampaignEmailCounts"},"emoji":{"type":"string"},"flow":{"type":"string"},"id":{"type":"integer"},"launchAt":{"type":"string"},"name":{"type":"string"},"schedule":{"$ref":"#/components/schemas/models.CampaignSchedule"},"sendAt":{"type":"string"},"settings":{"$ref":"#/components/schemas/models.CampaignSettings"},"stats":{"$ref":"#/components/schemas/models.CampaignStats"},"status":{"type":"string"},"timezone":{"type":"string"},"updatedAt":{"type":"string"}}},"models.CampaignEmailCounts":{"type":"object","properties":{"blocked":{"type":"integer"},"bounced":{"type":"integer"},"canceled":{"type":"integer"},"catchAll":{"type":"integer"},"deferred":{"type":"integer"},"delivered":{"type":"integer"},"draft":{"type":"integer"},"dropped":{"type":"integer"},"errorOnSent":{"type":"integer"},"followUp":{"type":"integer"},"followUpCanceled":{"type":"integer"},"followUpDraft":{"type":"integer"},"invalid":{"type":"integer"},"pending":{"type":"integer"},"replied":{"type":"integer"},"scheduled":{"type":"integer"},"sent":{"type":"integer"},"spamReport":{"type":"integer"},"total":{"type":"integer"},"waitingForReschedule":{"type":"integer"}}},"models.CampaignSchedule":{"type":"object","properties":{"cronSchedule":{"type":"string"},"daysSchedule":{"type":"array","items":{"type":"string"}},"endSchedule":{"type":"string"},"everySchedule":{"type":"integer"},"maximumTimeBetweenEmails":{"type":"integer"},"minimumTimeBetweenEmails":{"type":"integer"},"startSchedule":{"type":"string"}}},"models.CampaignSettings":{"type":"object","properties":{"allowNonBusinessEmails":{"type":"boolean"},"dailyLimit":{"description":"DailyLimit is the campaign-level cap on total emails scheduled per\ncalendar day (campaign timezone). null means no campaign-level cap.","type":"integer"},"ignoreOutOfOfficeReplies":{"type":"boolean"},"isEnabledCatchallValidated":{"type":"boolean"},"isEnabledEmailVerifier":{"type":"boolean"},"isEnabledIgnoreHardBouncedLeads":{"type":"boolean"},"isEnabledIgnoreLeadsWhoAlreadyResponded":{"type":"boolean"},"isEnabledLlm":{"type":"boolean"},"isEnabledSkipLeadIfAlreadyExists":{"type":"boolean"},"isEnabledStopFollowUpsAcrossCampaigns":{"type":"boolean"},"isEnabledStopFollowUpsForSameCompany":{"type":"boolean"},"isEnabledStopFollowUpsOnReply":{"type":"boolean"},"maximumSendingLimitPerSenderEmail":{"type":"integer"},"maximumSendingLimitPerSenderEmailVariation":{"type":"integer"}}},"models.CampaignStats":{"type":"object","properties":{"bouncedLeadsCount":{"type":"integer"},"contactedLeadsCount":{"type":"integer"},"emailsSentCount":{"type":"integer"},"leadsRespondedPositivelyCount":{"type":"integer"},"repliedLeadsCount":{"type":"integer"},"senderEmailsConnected":{"type":"integer"},"senderEmailsDisconnected":{"type":"integer"},"senderEmailsTotal":{"type":"integer"}}}}}}
```

## The models.GetCampaignStatsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetCampaignStatsResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"daily":{"type":"array","items":{"$ref":"#/components/schemas/models.CampaignStatsDay"}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/models.CampaignStatsStep"}},"totals":{"$ref":"#/components/schemas/models.CampaignStatsTotals"},"variants":{"type":"array","items":{"$ref":"#/components/schemas/models.CampaignStatsVariant"}}}},"models.CampaignStatsDay":{"type":"object","properties":{"date":{"type":"string"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}},"models.CampaignStatsStep":{"type":"object","properties":{"index":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}},"models.CampaignStatsTotals":{"type":"object","properties":{"bounced":{"type":"integer"},"meetings":{"type":"integer"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}},"models.CampaignStatsVariant":{"type":"object","properties":{"label":{"type":"string"},"positive":{"type":"integer"},"replied":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.GetLeadConversationResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetLeadConversationResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/models.ConversationItem"}},"leadId":{"type":"integer"},"total":{"type":"integer"}}},"models.ConversationItem":{"type":"object","properties":{"body":{"type":"string"},"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"direction":{"description":"Direction is \"inbound\" (received from the prospect) or \"outbound\"\n(sent, scheduled, or drafted by the workspace).","type":"string"},"fromAddress":{"type":"string"},"id":{"type":"integer"},"isDraft":{"description":"IsDraft marks unsent drafts (status draft or followup_draft), including\nAI-suggested replies awaiting human review. Drafts cannot be sent\nthrough the REST API.","type":"boolean"},"responseCategory":{"description":"ResponseCategory is set on categorized inbound emails and null\neverywhere else.","type":"string"},"sentAt":{"description":"SentAt is the scheduled or actual send time and null when the email has\nnone (e.g. an AI draft that was never scheduled).","type":"string"},"status":{"type":"string"},"subject":{"type":"string"},"threadId":{"type":"string"}}}}}}
```

## The models.GetLeadResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetLeadResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadResponse"}}},"models.LeadResponse":{"type":"object","properties":{"company":{"type":"string"},"createdAt":{"type":"string"},"customVariables":{"description":"CustomVariables are the lead's merge tags beyond the named fields.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"id":{"type":"integer"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"meetingBookedAt":{"description":"MeetingBookedAt is when a meeting was explicitly marked as booked with\nthis lead (see POST /leads/{id}/meeting) and null while no meeting is\nmarked.","type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"tag":{"description":"Tag is the lead's engagement category (interested, not_interested,\nbounced, out_of_office, delivery_incomplete, meeting_booked) and null\nwhile the lead has never been categorized.","type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.GetSenderEmailResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetSenderEmailResponse":{"type":"object","properties":{"senderEmail":{"$ref":"#/components/schemas/models.SenderEmailResponse"}}},"models.SenderEmailResponse":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"connectionHistory":{"type":"array","items":{"$ref":"#/components/schemas/models.ConnectionHistoryItem"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"lastDisconnectedAt":{"type":"string"},"lastReconnectedAt":{"type":"string"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"pictureUrl":{"type":"string"},"provider":{"type":"string"},"provisioningStatus":{"type":"string"},"signature":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}},"models.ConnectionHistoryItem":{"type":"object","properties":{"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"disconnectionReason":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"eventType":{"type":"string"},"id":{"type":"integer"},"userId":{"type":"integer"}}}}}}
```

## The models.GetSequenceResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.GetSequenceResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"signature":{"type":"string"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/models.SequenceStep"}},"total":{"type":"integer"}}},"models.SequenceStep":{"type":"object","properties":{"body":{"type":"string"},"contentType":{"type":"string"},"delayDays":{"type":"integer"},"order":{"type":"integer"},"subject":{"type":"string"},"useSameThread":{"type":"boolean"},"variants":{"type":"array","items":{"$ref":"#/components/schemas/models.SequenceVariant"}}}},"models.SequenceVariant":{"type":"object","properties":{"body":{"type":"string"},"label":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.ICPPersona object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ICPPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.ICPResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ICPResponse":{"type":"object","properties":{"audienceSizedAt":{"description":"AudienceSizedAt is when the audience size was last refreshed (RFC3339),\nor null when it has never been sized.","type":"string"},"companySizes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"estimatedAudienceSize":{"type":"integer"},"id":{"type":"integer"},"industries":{"type":"array","items":{"type":"string"}},"isGenerated":{"description":"IsGenerated is true while the profile is exactly what the AI proposed;\nany human edit clears it.","type":"boolean"},"isPrimary":{"description":"IsPrimary marks the workspace's active profile. At most one per space.","type":"boolean"},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.ICPPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"sourceWebsite":{"type":"string"},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.ICPPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.ICPResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ICPResult":{"type":"object","properties":{"icp":{"$ref":"#/components/schemas/models.ICPResponse"}}},"models.ICPResponse":{"type":"object","properties":{"audienceSizedAt":{"description":"AudienceSizedAt is when the audience size was last refreshed (RFC3339),\nor null when it has never been sized.","type":"string"},"companySizes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"estimatedAudienceSize":{"type":"integer"},"id":{"type":"integer"},"industries":{"type":"array","items":{"type":"string"}},"isGenerated":{"description":"IsGenerated is true while the profile is exactly what the AI proposed;\nany human edit clears it.","type":"boolean"},"isPrimary":{"description":"IsPrimary marks the workspace's active profile. At most one per space.","type":"boolean"},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.ICPPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"sourceWebsite":{"type":"string"},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.ICPPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.InboxPlacementDailyStatResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementDailyStatResponse":{"type":"object","properties":{"date":{"description":"Date is the UTC day.","type":"string"},"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"runs":{"type":"integer"},"spam":{"type":"integer"}}}}}}
```

## The models.InboxPlacementFindingResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementFindingResponse":{"type":"object","properties":{"action":{"description":"Action is what to do about it. Every finding has one: a report that only\nsays what is wrong makes the reader's day worse without improving their\ndelivery.","type":"string"},"detail":{"type":"string"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"severity":{"description":"Severity is critical, warning or info.","type":"string"},"title":{"type":"string"}}}}}}
```

## The models.InboxPlacementForbiddenResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementForbiddenResponse":{"type":"object","properties":{"code":{"description":"Code is inbox_placement_required or inbox_placement_hypergrowth_required.","type":"string"},"error":{"description":"Error is written for a person to read and can be shown as-is.","type":"string"},"tier":{"description":"Tier is the tier the workspace currently holds: none, growth or\nhypergrowth.","type":"string"}}}}}}
```

## The models.InboxPlacementInsightsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementInsightsResponse":{"type":"object","properties":{"findings":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementFindingResponse"}},"inboxRate":{"type":"integer"},"mailboxesAtRisk":{"type":"integer"},"mailboxesChecked":{"type":"integer"},"missingRate":{"type":"integer"},"providerBreakdown":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementProviderResponse"}},"runsInWindow":{"type":"integer"},"spamRate":{"type":"integer"},"windowDays":{"description":"WindowDays is how far back the rates below were computed over.","type":"integer"}}},"models.InboxPlacementFindingResponse":{"type":"object","properties":{"action":{"description":"Action is what to do about it. Every finding has one: a report that only\nsays what is wrong makes the reader's day worse without improving their\ndelivery.","type":"string"},"detail":{"type":"string"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"severity":{"description":"Severity is critical, warning or info.","type":"string"},"title":{"type":"string"}}},"models.InboxPlacementProviderResponse":{"type":"object","properties":{"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"label":{"type":"string"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"provider":{"type":"string"},"seeds":{"type":"integer"},"spam":{"type":"integer"}}}}}}
```

## The models.InboxPlacementListResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementListResponse":{"type":"object","properties":{"count":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementRunResponse"}}}},"models.InboxPlacementRunResponse":{"type":"object","properties":{"completedAt":{"type":"string"},"createdAt":{"type":"string"},"error":{"type":"string"},"failed":{"type":"integer"},"id":{"type":"integer"},"inbox":{"type":"integer"},"inboxRate":{"description":"InboxRate is the whole-percentage share of SCORED probes that reached the\nprimary inbox. -1 when nothing has been scored.","type":"integer"},"messagesExpected":{"type":"integer"},"messagesSent":{"type":"integer"},"missing":{"description":"Missing counts probes never found in any folder, which usually means a\nsilent block. Reported apart from spam because it is a worse problem with\na different fix.","type":"integer"},"promotions":{"description":"Promotions counts every Gmail category tab: promotions, social and\nupdates. Delivered, but filtered away from the reader.","type":"integer"},"seedsTargeted":{"type":"integer"},"sendersTargeted":{"type":"integer"},"spam":{"type":"integer"},"spamScore":{"description":"SpamScore is the content spam score in tenths of a point, so 47 is 4.7.\n-1 when not scored.","type":"integer"},"startedAt":{"type":"string"},"status":{"description":"Status is pending, sending, collecting, completed, failed or cancelled.\nCounters are only final once status is completed.","type":"string"},"testId":{"type":"integer"},"trigger":{"description":"Trigger is manual or scheduled.","type":"string"}}}}}}
```

## The models.InboxPlacementProviderResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementProviderResponse":{"type":"object","properties":{"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"label":{"type":"string"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"provider":{"type":"string"},"seeds":{"type":"integer"},"spam":{"type":"integer"}}}}}}
```

## The models.InboxPlacementResultListResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementResultListResponse":{"type":"object","properties":{"count":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementResultResponse"}},"runId":{"type":"integer"}}},"models.InboxPlacementResultResponse":{"type":"object","properties":{"deliverySeconds":{"description":"DeliverySeconds is how long the probe took to appear. -1 when never\ndetected. A slow delivery is itself a signal: greylisting and throttling\nboth show up here before they show up in a placement number.","type":"integer"},"detectedAt":{"type":"string"},"error":{"type":"string"},"id":{"type":"integer"},"placement":{"description":"Placement is pending, inbox, spam, promotions, social, updates, missing\nor failed.","type":"string"},"seedAddress":{"type":"string"},"seedProvider":{"type":"string"},"senderAddress":{"type":"string"},"sentAt":{"type":"string"}}}}}}
```

## The models.InboxPlacementResultResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementResultResponse":{"type":"object","properties":{"deliverySeconds":{"description":"DeliverySeconds is how long the probe took to appear. -1 when never\ndetected. A slow delivery is itself a signal: greylisting and throttling\nboth show up here before they show up in a placement number.","type":"integer"},"detectedAt":{"type":"string"},"error":{"type":"string"},"id":{"type":"integer"},"placement":{"description":"Placement is pending, inbox, spam, promotions, social, updates, missing\nor failed.","type":"string"},"seedAddress":{"type":"string"},"seedProvider":{"type":"string"},"senderAddress":{"type":"string"},"sentAt":{"type":"string"}}}}}}
```

## The models.InboxPlacementRunDetailResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementRunDetailResponse":{"type":"object","properties":{"completedAt":{"type":"string"},"createdAt":{"type":"string"},"error":{"type":"string"},"failed":{"type":"integer"},"id":{"type":"integer"},"inbox":{"type":"integer"},"inboxRate":{"description":"InboxRate is the whole-percentage share of SCORED probes that reached the\nprimary inbox. -1 when nothing has been scored.","type":"integer"},"messagesExpected":{"type":"integer"},"messagesSent":{"type":"integer"},"missing":{"description":"Missing counts probes never found in any folder, which usually means a\nsilent block. Reported apart from spam because it is a worse problem with\na different fix.","type":"integer"},"promotions":{"description":"Promotions counts every Gmail category tab: promotions, social and\nupdates. Delivered, but filtered away from the reader.","type":"integer"},"providerBreakdown":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementProviderResponse"}},"seedsTargeted":{"type":"integer"},"senderBreakdown":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementSenderResponse"}},"sendersTargeted":{"type":"integer"},"spam":{"type":"integer"},"spamScore":{"description":"SpamScore is the content spam score in tenths of a point, so 47 is 4.7.\n-1 when not scored.","type":"integer"},"spamScoreRules":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementSpamRuleResponse"}},"startedAt":{"type":"string"},"status":{"description":"Status is pending, sending, collecting, completed, failed or cancelled.\nCounters are only final once status is completed.","type":"string"},"testId":{"type":"integer"},"trigger":{"description":"Trigger is manual or scheduled.","type":"string"}}},"models.InboxPlacementProviderResponse":{"type":"object","properties":{"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"label":{"type":"string"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"provider":{"type":"string"},"seeds":{"type":"integer"},"spam":{"type":"integer"}}},"models.InboxPlacementSenderResponse":{"type":"object","properties":{"failed":{"type":"integer"},"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"sent":{"type":"integer"},"spam":{"type":"integer"}}},"models.InboxPlacementSpamRuleResponse":{"type":"object","properties":{"advice":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"points":{"description":"Points is the rule's cost in tenths of a point, so 15 is 1.5 points.","type":"integer"}}}}}}
```

## The models.InboxPlacementRunResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementRunResponse":{"type":"object","properties":{"completedAt":{"type":"string"},"createdAt":{"type":"string"},"error":{"type":"string"},"failed":{"type":"integer"},"id":{"type":"integer"},"inbox":{"type":"integer"},"inboxRate":{"description":"InboxRate is the whole-percentage share of SCORED probes that reached the\nprimary inbox. -1 when nothing has been scored.","type":"integer"},"messagesExpected":{"type":"integer"},"messagesSent":{"type":"integer"},"missing":{"description":"Missing counts probes never found in any folder, which usually means a\nsilent block. Reported apart from spam because it is a worse problem with\na different fix.","type":"integer"},"promotions":{"description":"Promotions counts every Gmail category tab: promotions, social and\nupdates. Delivered, but filtered away from the reader.","type":"integer"},"seedsTargeted":{"type":"integer"},"sendersTargeted":{"type":"integer"},"spam":{"type":"integer"},"spamScore":{"description":"SpamScore is the content spam score in tenths of a point, so 47 is 4.7.\n-1 when not scored.","type":"integer"},"startedAt":{"type":"string"},"status":{"description":"Status is pending, sending, collecting, completed, failed or cancelled.\nCounters are only final once status is completed.","type":"string"},"testId":{"type":"integer"},"trigger":{"description":"Trigger is manual or scheduled.","type":"string"}}}}}}
```

## The models.InboxPlacementSenderResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementSenderResponse":{"type":"object","properties":{"failed":{"type":"integer"},"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"sent":{"type":"integer"},"spam":{"type":"integer"}}}}}}
```

## The models.InboxPlacementSpamRuleResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementSpamRuleResponse":{"type":"object","properties":{"advice":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"points":{"description":"Points is the rule's cost in tenths of a point, so 15 is 1.5 points.","type":"integer"}}}}}}
```

## The models.InboxPlacementStatsByDateResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementStatsByDateResponse":{"type":"object","properties":{"days":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementDailyStatResponse"}},"from":{"type":"string"},"to":{"type":"string"}}},"models.InboxPlacementDailyStatResponse":{"type":"object","properties":{"date":{"description":"Date is the UTC day.","type":"string"},"inbox":{"type":"integer"},"inboxRate":{"type":"integer"},"missing":{"type":"integer"},"promotions":{"type":"integer"},"runs":{"type":"integer"},"spam":{"type":"integer"}}}}}}
```

## The models.InboxPlacementTestListResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementTestListResponse":{"type":"object","properties":{"count":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/models.InboxPlacementTestResponse"}}}},"models.InboxPlacementTestResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"intervalHours":{"description":"IntervalHours is how often a recurring test repeats. Null for one-time.","type":"integer"},"isPaused":{"type":"boolean"},"kind":{"description":"Kind is one_time or recurring.","type":"string"},"lastRunAt":{"type":"string"},"name":{"type":"string"},"nextRunAt":{"type":"string"},"seedProviders":{"description":"SeedProviders restricts the seed panel. Empty means every provider.","type":"array","items":{"type":"string"}},"senderEmailIds":{"description":"SenderEmailIDs are the mailboxes the test sends from.","type":"array","items":{"type":"integer"}},"subject":{"type":"string"}}}}}}
```

## The models.InboxPlacementTestResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InboxPlacementTestResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"intervalHours":{"description":"IntervalHours is how often a recurring test repeats. Null for one-time.","type":"integer"},"isPaused":{"type":"boolean"},"kind":{"description":"Kind is one_time or recurring.","type":"string"},"lastRunAt":{"type":"string"},"name":{"type":"string"},"nextRunAt":{"type":"string"},"seedProviders":{"description":"SeedProviders restricts the seed panel. Empty means every provider.","type":"array","items":{"type":"string"}},"senderEmailIds":{"description":"SenderEmailIDs are the mailboxes the test sends from.","type":"array","items":{"type":"integer"}},"subject":{"type":"string"}}}}}}
```

## The models.InstantlyAccount object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InstantlyAccount":{"type":"object","properties":{"dailyLimit":{"type":"integer"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"provider":{"description":"google | microsoft | other","type":"string"},"status":{"type":"integer"}}}}}}
```

## The models.InstantlyAccountsRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InstantlyAccountsRequest":{"type":"object","required":["apiKey"],"properties":{"apiKey":{"description":"APIKey is the caller's Instantly.ai API key.","type":"string"}}}}}}
```

## The models.InstantlyAccountsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InstantlyAccountsResponse":{"type":"object","properties":{"accounts":{"type":"array","items":{"$ref":"#/components/schemas/models.InstantlyAccount"}},"imapCsvTemplate":{"description":"ImapCsvTemplate is a ready-to-fill CSV (one row per account, password\ncolumn empty) for the bulk IMAP/SMTP connection flow.","type":"string"}}},"models.InstantlyAccount":{"type":"object","properties":{"dailyLimit":{"type":"integer"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"provider":{"description":"google | microsoft | other","type":"string"},"status":{"type":"integer"}}}}}}
```

## The models.InstantlyImportRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InstantlyImportRequest":{"type":"object","required":["apiKey"],"properties":{"apiKey":{"description":"APIKey is the caller's Instantly.ai API key. It is validated with a\nlightweight call to Instantly before the import job is enqueued.","type":"string"}}}}}}
```

## The models.InstantlyImportResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InstantlyImportResponse":{"type":"object","properties":{"jobId":{"type":"string"},"message":{"type":"string"},"status":{"type":"string"}}}}}}
```

## The models.InsufficientCreditsErrorResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.InsufficientCreditsErrorResponse":{"type":"object","properties":{"code":{"type":"string"},"error":{"type":"string"},"have":{"type":"integer"},"need":{"type":"integer"}}}}}}
```

## The models.KillAutopilotRunRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.KillAutopilotRunRequest":{"type":"object","properties":{"reason":{"description":"Reason is recorded in the run's audit trail. Trimmed and capped at 200\ncharacters.","type":"string"}}}}}}
```

## The models.LaunchCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LaunchCampaignResponse":{"type":"object","properties":{"campaign":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string"}}},"message":{"type":"string"}}}}}}
```

## The models.LeadCategoryState object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadCategoryState":{"type":"object","properties":{"id":{"type":"integer"},"meetingBookedAt":{"description":"MeetingBookedAt is when the meeting was marked as booked and null while\nno meeting is marked.","type":"string"},"tag":{"description":"Tag is the lead's engagement category and null while the lead has never\nbeen categorized.","type":"string"}}}}}}
```

## The models.LeadFinderError object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderError":{"type":"object","properties":{"available":{"type":"integer"},"cap":{"type":"integer"},"count":{"type":"integer"},"error":{"description":"Error is the machine code: invalid_filters or invalid_request (400),\ninsufficient_credits (402), plan_required (403), not_found or\ncampaign_not_found (404), provider_unavailable (409), results_expired\n(410), contact_cap_reached (422), rate_limited or budget_exhausted\n(429), internal (500).","type":"string"},"field":{"type":"string"},"message":{"type":"string"},"needed":{"type":"integer"},"reason":{"description":"Reason details the code. invalid_filters: unknown_value,\ntoo_many_values, value_too_long, invalid_domain, mixed_geo_levels,\nlocation_needs_country, no_filters, unknown_field or malformed. 429:\nsearches_per_minute, empty_searches, daily_preview_limit,\nrunning_imports, daily_import_limit, daily_budget, monthly_budget or\nfair_use_floor.","type":"string"},"retryAfterSeconds":{"type":"integer"},"value":{"type":"string"}}}}}}
```

## The models.LeadFinderFilterSet object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderFilterSet":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"companyKeywords":{"description":"CompanyKeywords is one phrase matched against what the employer does.","type":"string"},"companyName":{"description":"CompanyName is one phrase matched against the employer's name.","type":"string"},"companySizes":{"description":"CompanySizes are headcount bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"continents":{"type":"array","items":{"type":"string"}},"countries":{"description":"Countries, Regions and Continents are values from GET /lead-finder/filters,\nwhere the person is. Use one of the three at a time.","type":"array","items":{"type":"string"}},"domains":{"description":"Domains and ExcludeDomains are company domains, up to 1,000 each.","type":"array","items":{"type":"string"}},"excludeCountries":{"type":"array","items":{"type":"string"}},"excludeDomains":{"type":"array","items":{"type":"string"}},"excludeHeadquartersCountries":{"type":"array","items":{"type":"string"}},"excludeIndustries":{"type":"array","items":{"type":"string"}},"excludeJobTitles":{"type":"array","items":{"type":"string"}},"headquartersCountries":{"description":"HeadquartersCountries are where the employer is headquartered.","type":"array","items":{"type":"string"}},"industries":{"description":"Industries are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobFunctions":{"description":"JobFunctions are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobTitles":{"description":"JobTitles are free text, matched as OR terms.","type":"array","items":{"type":"string"}},"regions":{"type":"array","items":{"type":"string"}},"revenue":{"description":"Revenue is revenue bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"seniorities":{"description":"Seniorities are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"states":{"description":"States and Cities are free text, matched inside the person's location.","type":"array","items":{"type":"string"}},"technologies":{"description":"Technologies are free text: tools the employer uses.","type":"array","items":{"type":"string"}}}}}}}
```

## The models.LeadFinderFilters object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderFilters":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"continents":{"type":"array","items":{"type":"string"}},"countries":{"type":"array","items":{"type":"string"}},"creditsPerProspect":{"description":"CreditsPerProspect is what adding one person to a campaign costs, read\nfrom the pricing table at request time.","type":"integer"},"headquartersCountries":{"type":"array","items":{"type":"string"}},"industries":{"type":"array","items":{"type":"string"}},"jobFunctions":{"type":"array","items":{"type":"string"}},"limits":{"$ref":"#/components/schemas/models.LeadFinderLimits"},"regions":{"type":"array","items":{"type":"string"}},"revenue":{"type":"array","items":{"type":"string"}},"seniorities":{"type":"array","items":{"type":"string"}}}},"models.LeadFinderLimits":{"type":"object","properties":{"defaultPageSize":{"type":"integer"},"maxChipsPerField":{"type":"integer"},"maxDomainsPerField":{"type":"integer"},"maxFirstN":{"type":"integer"},"maxPage":{"type":"integer"},"maxRefsPerImport":{"type":"integer"},"maxRunningImports":{"type":"integer"},"maxValueLength":{"type":"integer"},"pageSizes":{"type":"array","items":{"type":"integer"}},"rowsLeftToday":{"description":"RowsLeftToday is what is left of it this UTC day.","type":"integer"},"rowsPerDay":{"description":"RowsPerDay is the account's daily browsing allowance in result rows.","type":"integer"}}}}}}
```

## The models.LeadFinderImport object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderImport":{"type":"object","properties":{"added":{"type":"integer"},"campaignId":{"type":"integer"},"campaignName":{"type":"string"},"createdAt":{"type":"string"},"creditsPerProspect":{"type":"integer"},"creditsSpent":{"description":"CreditsSpent is what the import has charged so far. People added while\nthe workspace's credits were free add nothing to it.","type":"integer"},"endReason":{"description":"EndReason says how an import ended: all_selected or requested_reached\n(finished), audience_exhausted or fetch_limit (a first_n import stopped\nearly), or canceled. A failed import has none; see LastError.","type":"string"},"expired":{"type":"integer"},"finishedAt":{"type":"string"},"importId":{"type":"integer"},"lastError":{"description":"LastError says why a failed import stopped: insufficient_credits,\ncontact_cap_reached, results_expired, budget_exhausted,\nprovider_blocked, invalid_filters, campaign_not_found or internal. A\nfailed import can still have added and charged people.","type":"string"},"mode":{"type":"string"},"requested":{"type":"integer"},"skipReasons":{"description":"SkipReasons counts skipped people by reason: already_in_workspace,\nblocklisted, reveal_returned_no_address, consumer_mailbox,\ninvalid_email or contact_cap_reached.","type":"object","additionalProperties":{"type":"integer"}},"skipped":{"type":"integer"},"status":{"description":"Status is running, completed, failed or canceled. Added, CreditsSpent\nand Status can still change until FinishedAt is set.","type":"string"},"verification":{"$ref":"#/components/schemas/models.LeadFinderVerification"},"verifyEmails":{"type":"boolean"}}},"models.LeadFinderVerification":{"type":"object","properties":{"catchAll":{"type":"integer"},"invalid":{"type":"integer"},"limitReached":{"type":"integer"},"unknown":{"type":"integer"},"valid":{"type":"integer"}}}}}}
```

## The models.LeadFinderImportCreated object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderImportCreated":{"type":"object","properties":{"available":{"description":"Available is the wallet's spendable balance when the import started.\nWhile the workspace's credits are free (unlimited on GET\n/credits/balance) it is the workspace's own balance, which the import\ndoes not use.","type":"integer"},"creditsPerProspect":{"type":"integer"},"estimatedCredits":{"description":"EstimatedCredits is Requested x CreditsPerProspect, the most this\nimport can cost in credits. Skipped people cost no credits; metered\nverification is billed separately.","type":"integer"},"expired":{"description":"Expired counts refs that were no longer stored and were dropped.","type":"integer"},"importId":{"type":"integer"},"requested":{"description":"Requested is how many people the import will try to add.","type":"integer"},"status":{"type":"string"}}}}}}
```

## The models.LeadFinderImportRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderImportRequest":{"type":"object","properties":{"campaignId":{"description":"CampaignID is the campaign the people are added to.","type":"integer"},"count":{"description":"Count is how many people to add, for mode first_n: 1 to 5,000.","type":"integer"},"filters":{"description":"Filters are the filters to add from, for mode first_n. At least one\ninclude filter is required; the rules are those of a search.","allOf":[{"$ref":"#/components/schemas/models.LeadFinderFilterSet"}]},"mode":{"description":"Mode is \"selected\" (add the people named in Refs) or \"first_n\" (add up\nto Count people matching Filters who are not in the workspace yet,\nstarting from the top of the results every time).","type":"string","enum":["selected","first_n"]},"refs":{"description":"Refs are result refs from searches, for mode selected: 1 to 1,000.","type":"array","items":{"type":"string"}},"verifyEmails":{"description":"VerifyEmails checks each address with the paid verification waterfall\nbefore it is added: one or two metered checks per address, billed on the\nnext invoice (GET /email-verification/rates), including addresses that\nturn out invalid. Invalid addresses are skipped and cost no credits;\ncatch-all and unconfirmed ones are added and charged, and so is every\naddress once the monthly verification allowance is used up. Defaults to\ntrue.","type":"boolean"}}},"models.LeadFinderFilterSet":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"companyKeywords":{"description":"CompanyKeywords is one phrase matched against what the employer does.","type":"string"},"companyName":{"description":"CompanyName is one phrase matched against the employer's name.","type":"string"},"companySizes":{"description":"CompanySizes are headcount bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"continents":{"type":"array","items":{"type":"string"}},"countries":{"description":"Countries, Regions and Continents are values from GET /lead-finder/filters,\nwhere the person is. Use one of the three at a time.","type":"array","items":{"type":"string"}},"domains":{"description":"Domains and ExcludeDomains are company domains, up to 1,000 each.","type":"array","items":{"type":"string"}},"excludeCountries":{"type":"array","items":{"type":"string"}},"excludeDomains":{"type":"array","items":{"type":"string"}},"excludeHeadquartersCountries":{"type":"array","items":{"type":"string"}},"excludeIndustries":{"type":"array","items":{"type":"string"}},"excludeJobTitles":{"type":"array","items":{"type":"string"}},"headquartersCountries":{"description":"HeadquartersCountries are where the employer is headquartered.","type":"array","items":{"type":"string"}},"industries":{"description":"Industries are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobFunctions":{"description":"JobFunctions are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobTitles":{"description":"JobTitles are free text, matched as OR terms.","type":"array","items":{"type":"string"}},"regions":{"type":"array","items":{"type":"string"}},"revenue":{"description":"Revenue is revenue bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"seniorities":{"description":"Seniorities are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"states":{"description":"States and Cities are free text, matched inside the person's location.","type":"array","items":{"type":"string"}},"technologies":{"description":"Technologies are free text: tools the employer uses.","type":"array","items":{"type":"string"}}}}}}}
```

## The models.LeadFinderImports object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderImports":{"type":"object","properties":{"imports":{"type":"array","items":{"$ref":"#/components/schemas/models.LeadFinderImport"}}}},"models.LeadFinderImport":{"type":"object","properties":{"added":{"type":"integer"},"campaignId":{"type":"integer"},"campaignName":{"type":"string"},"createdAt":{"type":"string"},"creditsPerProspect":{"type":"integer"},"creditsSpent":{"description":"CreditsSpent is what the import has charged so far. People added while\nthe workspace's credits were free add nothing to it.","type":"integer"},"endReason":{"description":"EndReason says how an import ended: all_selected or requested_reached\n(finished), audience_exhausted or fetch_limit (a first_n import stopped\nearly), or canceled. A failed import has none; see LastError.","type":"string"},"expired":{"type":"integer"},"finishedAt":{"type":"string"},"importId":{"type":"integer"},"lastError":{"description":"LastError says why a failed import stopped: insufficient_credits,\ncontact_cap_reached, results_expired, budget_exhausted,\nprovider_blocked, invalid_filters, campaign_not_found or internal. A\nfailed import can still have added and charged people.","type":"string"},"mode":{"type":"string"},"requested":{"type":"integer"},"skipReasons":{"description":"SkipReasons counts skipped people by reason: already_in_workspace,\nblocklisted, reveal_returned_no_address, consumer_mailbox,\ninvalid_email or contact_cap_reached.","type":"object","additionalProperties":{"type":"integer"}},"skipped":{"type":"integer"},"status":{"description":"Status is running, completed, failed or canceled. Added, CreditsSpent\nand Status can still change until FinishedAt is set.","type":"string"},"verification":{"$ref":"#/components/schemas/models.LeadFinderVerification"},"verifyEmails":{"type":"boolean"}}},"models.LeadFinderVerification":{"type":"object","properties":{"catchAll":{"type":"integer"},"invalid":{"type":"integer"},"limitReached":{"type":"integer"},"unknown":{"type":"integer"},"valid":{"type":"integer"}}}}}}
```

## The models.LeadFinderLimits object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderLimits":{"type":"object","properties":{"defaultPageSize":{"type":"integer"},"maxChipsPerField":{"type":"integer"},"maxDomainsPerField":{"type":"integer"},"maxFirstN":{"type":"integer"},"maxPage":{"type":"integer"},"maxRefsPerImport":{"type":"integer"},"maxRunningImports":{"type":"integer"},"maxValueLength":{"type":"integer"},"pageSizes":{"type":"array","items":{"type":"integer"}},"rowsLeftToday":{"description":"RowsLeftToday is what is left of it this UTC day.","type":"integer"},"rowsPerDay":{"description":"RowsPerDay is the account's daily browsing allowance in result rows.","type":"integer"}}}}}}
```

## The models.LeadFinderPerson object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderPerson":{"type":"object","properties":{"company":{"$ref":"#/components/schemas/models.LeadFinderPersonCompany"},"firstName":{"type":"string"},"inWorkspace":{"description":"InWorkspace is true for someone Lead Finder added to this workspace\nwhose lead is still there, so adding them again is skipped for free. A\nperson who is a lead from another source shows false; adding them is\nstill skipped and costs nothing.","type":"boolean"},"jobFunction":{"type":"string"},"lastInitial":{"type":"string"},"location":{"$ref":"#/components/schemas/models.LeadFinderPersonLocation"},"ref":{"description":"Ref identifies the person for POST /lead-finder/imports. It stays\nvalid for 60 minutes after the page it came on was last shown.","type":"string"},"seniority":{"type":"string"},"title":{"type":"string"}}},"models.LeadFinderPersonCompany":{"type":"object","properties":{"industry":{"type":"string"},"logoUrl":{"description":"LogoURL is the company's icon, an image of at most 64 pixels served by\nthis API with no key needed. The URL does not contain the company's\ndomain. It is left out when the company has no website on record, and\nanswers 404 when the website has no icon.","type":"string"},"name":{"type":"string"},"revenueBand":{"type":"string"},"sizeBand":{"type":"string"}}},"models.LeadFinderPersonLocation":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"state":{"type":"string"}}}}}}
```

## The models.LeadFinderPersonCompany object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderPersonCompany":{"type":"object","properties":{"industry":{"type":"string"},"logoUrl":{"description":"LogoURL is the company's icon, an image of at most 64 pixels served by\nthis API with no key needed. The URL does not contain the company's\ndomain. It is left out when the company has no website on record, and\nanswers 404 when the website has no icon.","type":"string"},"name":{"type":"string"},"revenueBand":{"type":"string"},"sizeBand":{"type":"string"}}}}}}
```

## The models.LeadFinderPersonLocation object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderPersonLocation":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"state":{"type":"string"}}}}}}
```

## The models.LeadFinderSearch object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderSearch":{"type":"object","properties":{"creditsPerProspect":{"type":"integer"},"error":{"description":"Error is set on a failed search: rate_limited, provider_blocked,\ntimeout, invalid_filters, budget_exhausted, expired or internal.","type":"string"},"hasMore":{"type":"boolean"},"maxPage":{"type":"integer"},"message":{"type":"string"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"results":{"description":"Results are the people on this page, masked.","type":"array","items":{"$ref":"#/components/schemas/models.LeadFinderPerson"}},"rowsLeftToday":{"description":"RowsLeftToday is the account's browsing allowance left this UTC day.","type":"integer"},"searchId":{"type":"string"},"status":{"description":"Status is running, done or failed.","type":"string"},"total":{"description":"Total is how many people match; TotalIsExact says whether it is a\ncount or a lower bound, and TotalStatus whether the count has landed\n(pending, done or failed).","type":"integer"},"totalIsExact":{"type":"boolean"},"totalStatus":{"type":"string"}}},"models.LeadFinderPerson":{"type":"object","properties":{"company":{"$ref":"#/components/schemas/models.LeadFinderPersonCompany"},"firstName":{"type":"string"},"inWorkspace":{"description":"InWorkspace is true for someone Lead Finder added to this workspace\nwhose lead is still there, so adding them again is skipped for free. A\nperson who is a lead from another source shows false; adding them is\nstill skipped and costs nothing.","type":"boolean"},"jobFunction":{"type":"string"},"lastInitial":{"type":"string"},"location":{"$ref":"#/components/schemas/models.LeadFinderPersonLocation"},"ref":{"description":"Ref identifies the person for POST /lead-finder/imports. It stays\nvalid for 60 minutes after the page it came on was last shown.","type":"string"},"seniority":{"type":"string"},"title":{"type":"string"}}},"models.LeadFinderPersonCompany":{"type":"object","properties":{"industry":{"type":"string"},"logoUrl":{"description":"LogoURL is the company's icon, an image of at most 64 pixels served by\nthis API with no key needed. The URL does not contain the company's\ndomain. It is left out when the company has no website on record, and\nanswers 404 when the website has no icon.","type":"string"},"name":{"type":"string"},"revenueBand":{"type":"string"},"sizeBand":{"type":"string"}}},"models.LeadFinderPersonLocation":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"state":{"type":"string"}}}}}}
```

## The models.LeadFinderSearchRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderSearchRequest":{"type":"object","properties":{"filters":{"description":"Filters: at least one include filter is required. Enum fields take\nvalues from GET /lead-finder/filters. Free-text fields take up to 50\nvalues of up to 100 characters each, and a value holding commas is\nsplit into one term per comma. Use only one of countries, regions and\ncontinents; states and cities go with countries or on their own. A\nbroken rule is a 400 invalid_filters naming the field, value and reason.","allOf":[{"$ref":"#/components/schemas/models.LeadFinderFilterSet"}]},"page":{"description":"Page is 1-based, up to limits.maxPage. Defaults to 1.","type":"integer"},"pageSize":{"description":"PageSize is 25 (the default) or 50.","type":"integer"}}},"models.LeadFinderFilterSet":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"companyKeywords":{"description":"CompanyKeywords is one phrase matched against what the employer does.","type":"string"},"companyName":{"description":"CompanyName is one phrase matched against the employer's name.","type":"string"},"companySizes":{"description":"CompanySizes are headcount bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"continents":{"type":"array","items":{"type":"string"}},"countries":{"description":"Countries, Regions and Continents are values from GET /lead-finder/filters,\nwhere the person is. Use one of the three at a time.","type":"array","items":{"type":"string"}},"domains":{"description":"Domains and ExcludeDomains are company domains, up to 1,000 each.","type":"array","items":{"type":"string"}},"excludeCountries":{"type":"array","items":{"type":"string"}},"excludeDomains":{"type":"array","items":{"type":"string"}},"excludeHeadquartersCountries":{"type":"array","items":{"type":"string"}},"excludeIndustries":{"type":"array","items":{"type":"string"}},"excludeJobTitles":{"type":"array","items":{"type":"string"}},"headquartersCountries":{"description":"HeadquartersCountries are where the employer is headquartered.","type":"array","items":{"type":"string"}},"industries":{"description":"Industries are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobFunctions":{"description":"JobFunctions are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"jobTitles":{"description":"JobTitles are free text, matched as OR terms.","type":"array","items":{"type":"string"}},"regions":{"type":"array","items":{"type":"string"}},"revenue":{"description":"Revenue is revenue bands from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"seniorities":{"description":"Seniorities are values from GET /lead-finder/filters.","type":"array","items":{"type":"string"}},"states":{"description":"States and Cities are free text, matched inside the person's location.","type":"array","items":{"type":"string"}},"technologies":{"description":"Technologies are free text: tools the employer uses.","type":"array","items":{"type":"string"}}}}}}}
```

## The models.LeadFinderVerification object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadFinderVerification":{"type":"object","properties":{"catchAll":{"type":"integer"},"invalid":{"type":"integer"},"limitReached":{"type":"integer"},"unknown":{"type":"integer"},"valid":{"type":"integer"}}}}}}
```

## The models.LeadInput object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadInput":{"type":"object","required":["email"],"properties":{"company":{"type":"string"},"customVariables":{"description":"CustomVariables holds any attribute the eight named fields do not cover,\nfor example the page a visitor landed on. Each key becomes a merge tag\nusable in email copy as {key}. Keys are matched case-insensitively with\nspaces treated as underscores, so \"Page Visited\" and \"page_visited\" are\nthe same tag. Values are stored as given; non-string values are rendered\nwith their JSON representation at send time.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"title":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.LeadMeetingResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadMeetingResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadCategoryState"},"message":{"type":"string"}}},"models.LeadCategoryState":{"type":"object","properties":{"id":{"type":"integer"},"meetingBookedAt":{"description":"MeetingBookedAt is when the meeting was marked as booked and null while\nno meeting is marked.","type":"string"},"tag":{"description":"Tag is the lead's engagement category and null while the lead has never\nbeen categorized.","type":"string"}}}}}}
```

## The models.LeadResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.LeadResponse":{"type":"object","properties":{"company":{"type":"string"},"createdAt":{"type":"string"},"customVariables":{"description":"CustomVariables are the lead's merge tags beyond the named fields.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"id":{"type":"integer"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"meetingBookedAt":{"description":"MeetingBookedAt is when a meeting was explicitly marked as booked with\nthis lead (see POST /leads/{id}/meeting) and null while no meeting is\nmarked.","type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"tag":{"description":"Tag is the lead's engagement category (interested, not_interested,\nbounced, out_of_office, delivery_incomplete, meeting_booked) and null\nwhile the lead has never been categorized.","type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.ListAutopilotRunsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListAutopilotRunsResponse":{"type":"object","properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/models.AutopilotRunResponse"}},"total":{"type":"integer"}}},"models.AutopilotRunResponse":{"type":"object","properties":{"approvedAt":{"description":"ApprovedAt is when a human approved the run (RFC3339), or null.","type":"string"},"approvedByUserId":{"description":"ApprovedByUserID is who approved the run, or null.","type":"integer"},"audit":{"type":"array","items":{"$ref":"#/components/schemas/models.AutopilotAuditEvent"}},"autoOptimizeVariants":{"type":"boolean"},"autoTopupProspects":{"type":"boolean"},"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"icpId":{"type":"integer"},"id":{"type":"integer"},"killSwitch":{"description":"KillSwitch reports whether the run has been permanently halted.","type":"boolean"},"lastAdvancedAt":{"description":"LastAdvancedAt is when the run last made progress (RFC3339), or null.","type":"string"},"lastError":{"type":"string"},"prospectSearchId":{"type":"integer"},"replyMode":{"type":"string"},"status":{"description":"Status is one of: pending, building_icp, writing_sequence,\nsourcing_prospects, awaiting_approval, provisioning_infrastructure,\nrunning, paused, completed, failed. A run is at sourcing_prospects twice:\nbefore approval it checks for free that prospects match, after approval\n(approvedAt set) it reveals the first batch, which spends credits.","type":"string"},"targetProspectCount":{"type":"integer"},"website":{"type":"string"}}},"models.AutopilotAuditEvent":{"type":"object","properties":{"actor":{"type":"string"},"at":{"type":"string"},"message":{"type":"string"},"stage":{"type":"string"}}}}}}
```

## The models.ListCampaignsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListCampaignsResponse":{"type":"object","properties":{"campaigns":{"type":"array","items":{"$ref":"#/components/schemas/models.CampaignListItem"}},"hasMore":{"type":"boolean"},"limit":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}},"models.CampaignListItem":{"type":"object","properties":{"createdAt":{"type":"string"},"emoji":{"type":"string"},"flow":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"stats":{"$ref":"#/components/schemas/models.CampaignStats"},"status":{"type":"string"},"updatedAt":{"type":"string"}}},"models.CampaignStats":{"type":"object","properties":{"bouncedLeadsCount":{"type":"integer"},"contactedLeadsCount":{"type":"integer"},"emailsSentCount":{"type":"integer"},"leadsRespondedPositivelyCount":{"type":"integer"},"repliedLeadsCount":{"type":"integer"},"senderEmailsConnected":{"type":"integer"},"senderEmailsDisconnected":{"type":"integer"},"senderEmailsTotal":{"type":"integer"}}}}}}
```

## The models.ListCreditTransactionsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListCreditTransactionsResponse":{"type":"object","properties":{"total":{"type":"integer"},"transactions":{"type":"array","items":{"$ref":"#/components/schemas/models.CreditTransactionItem"}}}},"models.CreditTransactionItem":{"type":"object","properties":{"amount":{"description":"Amount is the signed credit delta: negative for spend, positive for\ngrants and refunds.","type":"integer"},"balanceAfter":{"description":"BalanceAfter is the available balance immediately after this entry.","type":"integer"},"createdAt":{"type":"string"},"description":{"type":"string"},"free":{"description":"Free is true for an entry written while this workspace's credits were\nfree. Its amount is what the action would have cost, no credits moved,\nand balanceAfter is the balance it found.","type":"boolean"},"id":{"type":"integer"},"kind":{"description":"Kind is the movement type: grant, topup, reserve, commit, refund,\nexpire or adjustment.","type":"string"},"reason":{"description":"Reason is what the credits were spent on or granted for.","type":"string"},"reference":{"description":"Reference correlates the entry to what caused it, e.g. 'prospect_search:123'.","type":"string"}}}}}}
```

## The models.ListDfyOrdersResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListDfyOrdersResponse":{"type":"object","properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/models.DfyOrderResponse"}},"total":{"type":"integer"}}},"models.DfyOrderResponse":{"type":"object","properties":{"completedAt":{"description":"CompletedAt is when the order completed (RFC3339), or null.","type":"string"},"cost_breakdown":{},"createdAt":{"type":"string"},"domains":{},"externalOrderId":{"type":"string"},"failureReason":{"type":"string"},"forwardingDomain":{},"id":{"type":"integer"},"mailboxes":{},"processedAt":{"description":"ProcessedAt is when the order started processing (RFC3339), or null.","type":"string"},"status":{"description":"Status is one of: created, pending_approval, processing, completed,\nfailed, partially_completed, canceled.","type":"string"}}}}}}
```

## The models.ListEmailVerificationJobsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListEmailVerificationJobsResponse":{"type":"object","properties":{"count":{"type":"integer"},"next":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/models.EmailVerificationJobResponse"}}}},"models.EmailVerificationJobResponse":{"type":"object","properties":{"catchall":{"description":"Catchall accepts everything at the domain, so deliverability is likely\nbut not proven.","type":"integer"},"end_time":{"description":"EndTime in RFC3339, zero while the job is still running.","type":"string"},"error_code":{"description":"ErrorCode is empty on a healthy job. monthly_limit_reached means the\nallowance ran out and the remaining addresses came back unknown rather\nthan missing; they are still in the download, marked.","type":"string"},"id":{"type":"string"},"invalid":{"description":"Invalid will bounce.","type":"integer"},"meter_events":{"description":"MeterEvents is what the job has billed so far. Every check runs up to\ntwo providers and each one that answers is one event, so an address\ncosts one event or two.","type":"integer"},"name":{"description":"Name the job was created with.","type":"string"},"processed":{"description":"Processed is how many have a verdict yet.","type":"integer"},"spent_usd":{"description":"SpentUsd is MeterEvents priced at the meter rate: what this job adds to\nthe invoice, not an estimate.","type":"number"},"start_time":{"description":"StartTime in RFC3339.","type":"string"},"state":{"description":"State is pending, running, done, failed or canceled.","type":"string"},"total":{"description":"Total addresses in the job.","type":"integer"},"unknown":{"description":"Unknown got no verdict, so it was NOT billed. Usually a provider\nfailure or the workspace's monthly verification allowance running out\nmid-job, in which case error_code says which.","type":"integer"},"valid":{"description":"Valid is deliverable.","type":"integer"}}}}}}
```

## The models.ListEmailVerificationRecordsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListEmailVerificationRecordsResponse":{"type":"object","properties":{"count":{"type":"integer"},"next":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/models.EmailVerificationRecordResponse"}}}},"models.EmailVerificationRecordResponse":{"type":"object","properties":{"bounceban_result":{"description":"BouncebanResult is what the first provider said.","type":"string"},"email":{"type":"string"},"error":{"description":"Error is set when the address could not be answered.","type":"string"},"id":{"type":"string"},"meter_events":{"description":"MeterEvents is what this address billed: 0, 1 or 2.","type":"integer"},"onelookup_result":{"description":"OnelookupResult is what the second provider said. unknown means it never\nran, which is what happens when the first provider rejected the address\noutright, and nothing was billed for it.","type":"string"},"result":{"description":"Result is valid, catchall_validated, invalid or unknown. The same four\nvalues a campaign's send-time gate uses, so an address checked here and\none checked inside a campaign answer the same.","type":"string"},"status":{"description":"Status is done, failed, skipped or pending.","type":"string"},"verified_at":{"description":"VerifiedAt in RFC3339.","type":"string"}}}}}}
```

## The models.ListICPsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListICPsResponse":{"type":"object","properties":{"icps":{"type":"array","items":{"$ref":"#/components/schemas/models.ICPResponse"}},"total":{"type":"integer"}}},"models.ICPResponse":{"type":"object","properties":{"audienceSizedAt":{"description":"AudienceSizedAt is when the audience size was last refreshed (RFC3339),\nor null when it has never been sized.","type":"string"},"companySizes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"estimatedAudienceSize":{"type":"integer"},"id":{"type":"integer"},"industries":{"type":"array","items":{"type":"string"}},"isGenerated":{"description":"IsGenerated is true while the profile is exactly what the AI proposed;\nany human edit clears it.","type":"boolean"},"isPrimary":{"description":"IsPrimary marks the workspace's active profile. At most one per space.","type":"boolean"},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"personas":{"type":"array","items":{"$ref":"#/components/schemas/models.ICPPersona"}},"seniorities":{"type":"array","items":{"type":"string"}},"sourceWebsite":{"type":"string"},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}},"models.ICPPersona":{"type":"object","properties":{"seniority":{"type":"string"},"title":{"type":"string"}}}}}}
```

## The models.ListLeadsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListLeadsResponse":{"type":"object","properties":{"hasMore":{"type":"boolean"},"leads":{"type":"array","items":{"$ref":"#/components/schemas/models.LeadResponse"}},"limit":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}},"models.LeadResponse":{"type":"object","properties":{"company":{"type":"string"},"createdAt":{"type":"string"},"customVariables":{"description":"CustomVariables are the lead's merge tags beyond the named fields.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"id":{"type":"integer"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"meetingBookedAt":{"description":"MeetingBookedAt is when a meeting was explicitly marked as booked with\nthis lead (see POST /leads/{id}/meeting) and null while no meeting is\nmarked.","type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"tag":{"description":"Tag is the lead's engagement category (interested, not_interested,\nbounced, out_of_office, delivery_incomplete, meeting_booked) and null\nwhile the lead has never been categorized.","type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.ListRepliesResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListRepliesResponse":{"type":"object","properties":{"hasMore":{"type":"boolean"},"limit":{"type":"integer"},"page":{"type":"integer"},"replies":{"type":"array","items":{"$ref":"#/components/schemas/models.ReplyItem"}},"total":{"type":"integer"}}},"models.ReplyItem":{"type":"object","properties":{"body":{"type":"string"},"campaignId":{"description":"CampaignID is null for standalone replies that could not be attributed\nto a campaign.","type":"integer"},"fromAddress":{"type":"string"},"id":{"type":"integer"},"leadId":{"type":"integer"},"receivedAt":{"type":"string"},"responseCategory":{"description":"ResponseCategory is null while AI categorization is still pending.","type":"string"},"subject":{"type":"string"},"threadId":{"type":"string"}}}}}}
```

## The models.ListReplyDraftsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListReplyDraftsResponse":{"type":"object","properties":{"drafts":{"type":"array","items":{"$ref":"#/components/schemas/models.ReplyDraftItem"}},"hasMore":{"type":"boolean"},"limit":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}}},"models.ReplyDraftItem":{"type":"object","properties":{"body":{"type":"string"},"createdAt":{"type":"string"},"id":{"type":"integer"},"inReplyToEmailId":{"description":"InReplyToEmailID is the inbound reply this draft answers. It is null in\nthe rare case the draft's conversation can no longer be resolved (e.g.\nthe inbound email was deleted).","type":"integer"},"leadId":{"type":"integer"},"subject":{"type":"string"}}}}}}
```

## The models.ListSenderEmailsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListSenderEmailsResponse":{"type":"object","properties":{"hasMore":{"type":"boolean"},"limit":{"type":"integer"},"page":{"type":"integer"},"senderEmails":{"type":"array","items":{"$ref":"#/components/schemas/models.SenderEmailListItem"}},"total":{"type":"integer"}}},"models.SenderEmailListItem":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"provider":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}}}}}
```

## The models.ListWebhooksResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListWebhooksResponse":{"type":"object","properties":{"total":{"type":"integer"},"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/models.WebhookResponse"}}}},"models.WebhookResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"isEnabled":{"type":"boolean"},"name":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.ListWorkspacesResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ListWorkspacesResponse":{"type":"object","properties":{"total":{"type":"integer"},"workspaces":{"type":"array","items":{"$ref":"#/components/schemas/models.WorkspaceItem"}}}},"models.WorkspaceItem":{"type":"object","properties":{"createdAt":{"type":"string"},"iconUrl":{"description":"IconURL is where the workspace's icon image can be loaded from. Empty\nwhen the workspace has none. Icons are uploaded in the app.","type":"string"},"id":{"type":"integer"},"isCurrent":{"description":"IsCurrent is true for the workspace the calling API key is bound to.","type":"boolean"},"name":{"type":"string"}}}}}}
```

## The models.MemberInfo object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.MemberInfo":{"type":"object","properties":{"created_at":{"type":"string"},"email_address":{"type":"string"},"name":{"type":"string"}}}}}}
```

## The models.MoveLeadRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.MoveLeadRequest":{"type":"object","required":["targetCampaignId"],"properties":{"targetCampaignId":{"type":"integer"}}}}}}
```

## The models.MoveLeadResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.MoveLeadResponse":{"type":"object","properties":{"leadId":{"type":"integer"},"message":{"type":"string"},"sourceCampaignId":{"type":"integer"},"targetCampaignId":{"type":"integer"}}}}}}
```

## The models.MxCheckResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.MxCheckResult":{"type":"object","properties":{"hosts":{"description":"Hosts are the domain's mail servers as \"preference host\", lowest\npreference (highest priority) first.","type":"array","items":{"type":"string"}},"issues":{"type":"array","items":{"type":"string"}},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}}}}}
```

## The models.OutcomesReportCreditReason object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.OutcomesReportCreditReason":{"type":"object","properties":{"credits":{"type":"integer"},"reason":{"type":"string"}}}}}}
```

## The models.OutcomesReportOutcomes object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.OutcomesReportOutcomes":{"type":"object","properties":{"meetings":{"description":"Meetings counts leads marked as having booked a meeting in the window.","type":"integer"},"positiveReplies":{"description":"PositiveReplies counts leads whose reply was categorized as interested.","type":"integer"},"replies":{"type":"integer"},"sent":{"type":"integer"}}}}}}
```

## The models.OutcomesReportResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.OutcomesReportResponse":{"type":"object","properties":{"campaignId":{"description":"CampaignID echoes the campaign filter when one was given. Only the\noutcome side is narrowed by it; spend stays workspace-level.","type":"integer"},"costPerMeeting":{"description":"CostPerMeeting is total spend divided by meetings, null when there are\nnone.","type":"number"},"costPerPositive":{"description":"CostPerPositive is total spend divided by positive replies, null when\nthere are none.","type":"number"},"costPerReply":{"description":"CostPerReply is total spend divided by replies, null when there are none.","type":"number"},"outcomes":{"$ref":"#/components/schemas/models.OutcomesReportOutcomes"},"since":{"description":"Since echoes the window start, or null when the window is open-ended.","type":"string"},"spend":{"$ref":"#/components/schemas/models.OutcomesReportSpend"},"until":{"description":"Until echoes the window end, or null when the window is open-ended.","type":"string"}}},"models.OutcomesReportOutcomes":{"type":"object","properties":{"meetings":{"description":"Meetings counts leads marked as having booked a meeting in the window.","type":"integer"},"positiveReplies":{"description":"PositiveReplies counts leads whose reply was categorized as interested.","type":"integer"},"replies":{"type":"integer"},"sent":{"type":"integer"}}},"models.OutcomesReportSpend":{"type":"object","properties":{"credits":{"description":"Credits is the total of settled credit debits in the window. In-flight\nreservations are excluded until they settle.","type":"integer"},"creditsByReason":{"type":"array","items":{"$ref":"#/components/schemas/models.OutcomesReportCreditReason"}},"creditsUsd":{"description":"CreditsUsd values the spent credits at the list price per credit.","type":"number"},"dfyOrders":{"description":"DfyOrders is how many done-for-you orders were placed in the window\n(failed and canceled orders are excluded).","type":"integer"},"dfyOrdersUsd":{"type":"number"},"totalUsd":{"type":"number"}}},"models.OutcomesReportCreditReason":{"type":"object","properties":{"credits":{"type":"integer"},"reason":{"type":"string"}}}}}}
```

## The models.OutcomesReportSpend object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.OutcomesReportSpend":{"type":"object","properties":{"credits":{"description":"Credits is the total of settled credit debits in the window. In-flight\nreservations are excluded until they settle.","type":"integer"},"creditsByReason":{"type":"array","items":{"$ref":"#/components/schemas/models.OutcomesReportCreditReason"}},"creditsUsd":{"description":"CreditsUsd values the spent credits at the list price per credit.","type":"number"},"dfyOrders":{"description":"DfyOrders is how many done-for-you orders were placed in the window\n(failed and canceled orders are excluded).","type":"integer"},"dfyOrdersUsd":{"type":"number"},"totalUsd":{"type":"number"}}},"models.OutcomesReportCreditReason":{"type":"object","properties":{"credits":{"type":"integer"},"reason":{"type":"string"}}}}}}
```

## The models.PauseCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.PauseCampaignResponse":{"type":"object","properties":{"campaign":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string"}}},"message":{"type":"string"}}}}}}
```

## The models.PurchaseCreditsErrorResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.PurchaseCreditsErrorResponse":{"type":"object","properties":{"code":{"description":"Code is machine-readable:\n  - invalid_request: malformed body or credits outside 1000..10000; fix the request. No charge was made.\n  - billing_required: the workspace has no active subscription with a saved default card; fix billing in the Emailchaser app, then retry. No charge was made.\n  - payment_failed: the charge was attempted and refused (declined, expired, insufficient funds); fix the card, then retry. No money moved.\n  - credits_free: this workspace's credits are free, so there is nothing to buy. No charge was made.\n  - temporarily_unavailable: the purchase stopped before any charge because a check could not be read. No charge was made; retry shortly.\n  - purchase_incomplete: the card WAS charged but crediting failed; support is already notified. Do NOT retry - a retry charges again.\n  - purchase_unconfirmed: the outcome is unknown, or the purchase completed but the new balance could not be read; check /credits/transactions for a stripe_topup entry before retrying.","type":"string"},"error":{"type":"string"}}}}}}
```

## The models.PurchaseCreditsRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.PurchaseCreditsRequest":{"type":"object","required":["credits"],"properties":{"credits":{"description":"Credits is how many prospect credits to buy. Minimum 1000, maximum\n10000 per call.","type":"integer"}}}}}}
```

## The models.PurchaseCreditsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.PurchaseCreditsResponse":{"type":"object","properties":{"amountUsd":{"description":"AmountUsd is what the saved default payment method was charged, in\nUS dollars.","type":"number"},"creditsPurchased":{"description":"CreditsPurchased is how many credits were bought and granted.","type":"integer"},"newBalance":{"description":"NewBalance is the available credit balance after the grant.","type":"integer"}}}}}}
```

## The models.RegisterWebhookRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.RegisterWebhookRequest":{"type":"object","required":["type","url"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.RegisterWebhookResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.RegisterWebhookResponse":{"type":"object","properties":{"message":{"type":"string"},"webhook":{"$ref":"#/components/schemas/models.WebhookResponse"}}},"models.WebhookResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"isEnabled":{"type":"boolean"},"name":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.ReplaceSequenceRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ReplaceSequenceRequest":{"type":"object","required":["steps"],"properties":{"signature":{"description":"Signature omitted keeps the campaign's current signature; pass an empty\nstring to clear it. Editing one body should not silently drop a\nsignature the caller never asked about.","type":"string"},"steps":{"type":"array","maxItems":20,"minItems":1,"items":{"$ref":"#/components/schemas/models.SequenceStepInput"}}}},"models.SequenceStepInput":{"type":"object","required":["body","subject"],"properties":{"body":{"type":"string","minLength":1},"contentType":{"type":"string","enum":["html","text"]},"delayDays":{"type":"integer","maximum":365,"minimum":0},"order":{"type":"integer","minimum":1},"subject":{"type":"string","maxLength":998,"minLength":1},"useSameThread":{"type":"boolean"},"variants":{"type":"array","maxItems":25,"items":{"$ref":"#/components/schemas/models.SequenceVariantInput"}}}},"models.SequenceVariantInput":{"type":"object","required":["label","subject"],"properties":{"body":{"type":"string"},"label":{"type":"string","maxLength":2,"minLength":1},"subject":{"type":"string","maxLength":998,"minLength":1}}}}}}
```

## The models.ReplaceSequenceResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ReplaceSequenceResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"message":{"type":"string"},"signature":{"type":"string"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/models.SequenceStep"}},"total":{"type":"integer"}}},"models.SequenceStep":{"type":"object","properties":{"body":{"type":"string"},"contentType":{"type":"string"},"delayDays":{"type":"integer"},"order":{"type":"integer"},"subject":{"type":"string"},"useSameThread":{"type":"boolean"},"variants":{"type":"array","items":{"$ref":"#/components/schemas/models.SequenceVariant"}}}},"models.SequenceVariant":{"type":"object","properties":{"body":{"type":"string"},"label":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.ReplyDraftItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ReplyDraftItem":{"type":"object","properties":{"body":{"type":"string"},"createdAt":{"type":"string"},"id":{"type":"integer"},"inReplyToEmailId":{"description":"InReplyToEmailID is the inbound reply this draft answers. It is null in\nthe rare case the draft's conversation can no longer be resolved (e.g.\nthe inbound email was deleted).","type":"integer"},"leadId":{"type":"integer"},"subject":{"type":"string"}}}}}}
```

## The models.ReplyItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.ReplyItem":{"type":"object","properties":{"body":{"type":"string"},"campaignId":{"description":"CampaignID is null for standalone replies that could not be attributed\nto a campaign.","type":"integer"},"fromAddress":{"type":"string"},"id":{"type":"integer"},"leadId":{"type":"integer"},"receivedAt":{"type":"string"},"responseCategory":{"description":"ResponseCategory is null while AI categorization is still pending.","type":"string"},"subject":{"type":"string"},"threadId":{"type":"string"}}}}}}
```

## The models.SearchDfyDomainsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SearchDfyDomainsResponse":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/models.DfyDomainSuggestion"}},"totalAvailable":{"type":"integer"},"totalChecked":{"type":"integer"}}},"models.DfyDomainSuggestion":{"type":"object","properties":{"available":{"type":"boolean"},"domain":{"type":"string"},"price":{"type":"number"},"tld":{"type":"string"}}}}}}
```

## The models.SendReplyDraftResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SendReplyDraftResponse":{"type":"object","properties":{"body":{"type":"string"},"id":{"type":"integer"},"leadId":{"type":"integer"},"recipient":{"type":"string"},"status":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.SenderEmailDNSResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderEmailDNSResponse":{"type":"object","properties":{"checkedAt":{"description":"CheckedAt is when the live DNS lookups ran (this request).","type":"string"},"dkim":{"$ref":"#/components/schemas/models.DkimCheckResult"},"dmarc":{"$ref":"#/components/schemas/models.DmarcCheckResult"},"domain":{"type":"string"},"mx":{"$ref":"#/components/schemas/models.MxCheckResult"},"senderEmailId":{"type":"integer"},"spf":{"$ref":"#/components/schemas/models.SpfCheckResult"},"warmup":{"$ref":"#/components/schemas/models.SenderEmailWarmupStatus"}}},"models.DkimCheckResult":{"type":"object","properties":{"checkedSelectors":{"description":"CheckedSelectors is every selector name looked up, in the order tried.","type":"array","items":{"type":"string"}},"issues":{"type":"array","items":{"type":"string"}},"record":{"type":"string"},"selector":{"description":"Selector is the DKIM selector the record was found under, null when no\nrecord was found.","type":"string"},"selectorSource":{"description":"SelectorSource says where selector came from: SIGNATURE (read off the\nDKIM-Signature of this domain's warm-up mail), CUSTOMER (set in the app)\nor COMMON (a provider's default name). Null when none was found.","type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR. MISSING means no key was\nfound under the selectors in checkedSelectors: a provider that picks its\nown selector name can have DKIM working while this says MISSING. ERROR\nmeans a DNS lookup timed out; try again.","type":"string"}}},"models.DmarcCheckResult":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"string"}},"policy":{"description":"Policy is the record's p= tag, null when no record was found.","type":"string"},"record":{"type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}},"models.MxCheckResult":{"type":"object","properties":{"hosts":{"description":"Hosts are the domain's mail servers as \"preference host\", lowest\npreference (highest priority) first.","type":"array","items":{"type":"string"}},"issues":{"type":"array","items":{"type":"string"}},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}},"models.SpfCheckResult":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"string"}},"record":{"type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}},"models.SenderEmailWarmupStatus":{"type":"object","properties":{"cap":{"description":"Cap is the configured maximum warm-up emails per day; the ramp stops\nthere. 0 while the mailbox has never been enrolled.","type":"integer"},"currentPerDay":{"description":"CurrentPerDay is today's warm-up ramp target (warm-up emails per day),\n0 while not enrolled. On weekends of a weekdays-only account the ramp\nvalue still shows even though no warm-up emails send that day.","type":"integer"},"enrolled":{"description":"Enrolled is true while the mailbox has warm-up enabled.","type":"boolean"}}}}}}
```

## The models.SenderEmailListItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderEmailListItem":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"provider":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}}}}}
```

## The models.SenderEmailResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderEmailResponse":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"connectionHistory":{"type":"array","items":{"$ref":"#/components/schemas/models.ConnectionHistoryItem"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"lastDisconnectedAt":{"type":"string"},"lastReconnectedAt":{"type":"string"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"pictureUrl":{"type":"string"},"provider":{"type":"string"},"provisioningStatus":{"type":"string"},"signature":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}},"models.ConnectionHistoryItem":{"type":"object","properties":{"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"disconnectionReason":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"eventType":{"type":"string"},"id":{"type":"integer"},"userId":{"type":"integer"}}}}}}
```

## The models.SenderEmailWarmupSettingsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderEmailWarmupSettingsResponse":{"type":"object","properties":{"activatedAt":{"description":"ActivatedAt is when warm-up was first switched on; the ramp counts days\nfrom here. Null until then.","type":"string"},"capLimit":{"description":"CapLimit is the most warm-up emails a day; the ramp stops here.","type":"integer"},"configured":{"description":"Configured is true once the mailbox has warm-up settings of its own.\nWhile false the mailbox has never been enrolled, and the values below\nare the defaults that switching warm-up on would use.","type":"boolean"},"currentPerDay":{"description":"CurrentPerDay is today's ramp target, 0 while warm-up is off. On a\nweekend a weekdays-only mailbox still shows its ramp value, although no\nwarm-up emails send that day.","type":"integer"},"enableReplies":{"description":"EnableReplies lets warm-up recipients reply, adding reply signals.","type":"boolean"},"enabled":{"description":"Enabled is true while the mailbox is warming.","type":"boolean"},"increaseBy":{"description":"IncreaseBy is how many warm-up emails are added each day until CapLimit.","type":"integer"},"senderEmailId":{"type":"integer"},"startLimit":{"description":"StartLimit is how many warm-up emails go out on the first day.","type":"integer"},"timezone":{"description":"Timezone is the IANA timezone the warm-up send window runs in.","type":"string"},"weekdaysOnly":{"description":"WeekdaysOnly limits warm-up sending to Monday through Friday.","type":"boolean"}}}}}}
```

## The models.SenderEmailWarmupStatus object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderEmailWarmupStatus":{"type":"object","properties":{"cap":{"description":"Cap is the configured maximum warm-up emails per day; the ramp stops\nthere. 0 while the mailbox has never been enrolled.","type":"integer"},"currentPerDay":{"description":"CurrentPerDay is today's warm-up ramp target (warm-up emails per day),\n0 while not enrolled. On weekends of a weekdays-only account the ramp\nvalue still shows even though no warm-up emails send that day.","type":"integer"},"enrolled":{"description":"Enrolled is true while the mailbox has warm-up enabled.","type":"boolean"}}}}}}
```

## The models.SenderReputationListResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderReputationListResponse":{"type":"object","properties":{"count":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/models.SenderReputationResponse"}}}},"models.SenderReputationResponse":{"type":"object","properties":{"blacklistListings":{"type":"array","items":{"$ref":"#/components/schemas/models.BlacklistListingResponse"}},"blacklistsChecked":{"description":"BlacklistsChecked is how many zones were queried, reported next to the\nlisting count so the number can never be read as a total.","type":"integer"},"blacklistsListed":{"type":"integer"},"checkedAt":{"type":"string"},"dkimStatus":{"type":"string"},"dmarcPolicy":{"type":"string"},"dmarcStatus":{"type":"string"},"dnsIssues":{"type":"array","items":{"type":"string"}},"domain":{"type":"string"},"healthScore":{"description":"HealthScore is 0-100 combining placement, authentication and blacklist\nstanding. -1 when it cannot be computed.","type":"integer"},"mxStatus":{"type":"string"},"placementScore":{"description":"PlacementScore is the inbox rate over recent completed runs. -1 when the\nmailbox has never been tested.","type":"integer"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"sendingIp":{"description":"SendingIP is empty for mailboxes on a shared provider (Gmail, Microsoft),\nwhich have no dedicated IP of their own to check.","type":"string"},"spfStatus":{"description":"Each status is OK, WARNING, MISSING or ERROR.","type":"string"}}},"models.BlacklistListingResponse":{"type":"object","properties":{"answer":{"type":"string"},"delistUrl":{"description":"DelistURL is where to request removal. Always present: a listing you\ncannot act on is trivia.","type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"reason":{"type":"string"},"txt":{"type":"string"},"value":{"type":"string"},"zone":{"type":"string"}}}}}}
```

## The models.SenderReputationResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SenderReputationResponse":{"type":"object","properties":{"blacklistListings":{"type":"array","items":{"$ref":"#/components/schemas/models.BlacklistListingResponse"}},"blacklistsChecked":{"description":"BlacklistsChecked is how many zones were queried, reported next to the\nlisting count so the number can never be read as a total.","type":"integer"},"blacklistsListed":{"type":"integer"},"checkedAt":{"type":"string"},"dkimStatus":{"type":"string"},"dmarcPolicy":{"type":"string"},"dmarcStatus":{"type":"string"},"dnsIssues":{"type":"array","items":{"type":"string"}},"domain":{"type":"string"},"healthScore":{"description":"HealthScore is 0-100 combining placement, authentication and blacklist\nstanding. -1 when it cannot be computed.","type":"integer"},"mxStatus":{"type":"string"},"placementScore":{"description":"PlacementScore is the inbox rate over recent completed runs. -1 when the\nmailbox has never been tested.","type":"integer"},"senderAddress":{"type":"string"},"senderEmailId":{"type":"integer"},"sendingIp":{"description":"SendingIP is empty for mailboxes on a shared provider (Gmail, Microsoft),\nwhich have no dedicated IP of their own to check.","type":"string"},"spfStatus":{"description":"Each status is OK, WARNING, MISSING or ERROR.","type":"string"}}},"models.BlacklistListingResponse":{"type":"object","properties":{"answer":{"type":"string"},"delistUrl":{"description":"DelistURL is where to request removal. Always present: a listing you\ncannot act on is trivia.","type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"reason":{"type":"string"},"txt":{"type":"string"},"value":{"type":"string"},"zone":{"type":"string"}}}}}}
```

## The models.SequenceStep object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SequenceStep":{"type":"object","properties":{"body":{"type":"string"},"contentType":{"type":"string"},"delayDays":{"type":"integer"},"order":{"type":"integer"},"subject":{"type":"string"},"useSameThread":{"type":"boolean"},"variants":{"type":"array","items":{"$ref":"#/components/schemas/models.SequenceVariant"}}}},"models.SequenceVariant":{"type":"object","properties":{"body":{"type":"string"},"label":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.SequenceStepInput object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SequenceStepInput":{"type":"object","required":["body","subject"],"properties":{"body":{"type":"string","minLength":1},"contentType":{"type":"string","enum":["html","text"]},"delayDays":{"type":"integer","maximum":365,"minimum":0},"order":{"type":"integer","minimum":1},"subject":{"type":"string","maxLength":998,"minLength":1},"useSameThread":{"type":"boolean"},"variants":{"type":"array","maxItems":25,"items":{"$ref":"#/components/schemas/models.SequenceVariantInput"}}}},"models.SequenceVariantInput":{"type":"object","required":["label","subject"],"properties":{"body":{"type":"string"},"label":{"type":"string","maxLength":2,"minLength":1},"subject":{"type":"string","maxLength":998,"minLength":1}}}}}}
```

## The models.SequenceVariant object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SequenceVariant":{"type":"object","properties":{"body":{"type":"string"},"label":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.SequenceVariantInput object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SequenceVariantInput":{"type":"object","required":["label","subject"],"properties":{"body":{"type":"string"},"label":{"type":"string","maxLength":2,"minLength":1},"subject":{"type":"string","maxLength":998,"minLength":1}}}}}}
```

## The models.SetupPingRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SetupPingRequest":{"type":"object","properties":{"agent":{"description":"Agent is the assistant's self-reported name, in any form; the backend\nnormalizes it to a short lowercase identifier.","type":"string"}}}}}}
```

## The models.SetupPingResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SetupPingResponse":{"type":"object","properties":{"agent":{"type":"string"},"ok":{"type":"boolean"}}}}}}
```

## The models.SourceProspectsRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SourceProspectsRequest":{"type":"object","required":["campaignId"],"properties":{"campaignId":{"description":"CampaignID is the campaign the sourced prospects are added to.","type":"integer"},"count":{"description":"Count is how many prospects to add in this request. Defaults to 50,\ncapped at 500. A stored prospect costs the reveal price in credits (1\nat the time of writing); the response states the price it charged and\nthe total the batch is expected to cost, so nothing has to trust this\ncomment to stay current.","type":"integer"},"icpId":{"description":"IcpID names the Ideal Customer Profile whose targeting criteria drive\nthe search. Omitted, the workspace's primary profile is used.","type":"integer"}}}}}}
```

## The models.SourceProspectsResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SourceProspectsResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"creditsPerProspect":{"description":"CreditsPerProspect is what one stored prospect debits, read from the\npricing table at request time. It is reported because the price has\nchanged twice (1 to 5 in August 2026, back to 1 in September 2026 when\nthe contact data moved to a flat monthly plan) and every caller that\nbudgets from a hardcoded number budgets wrong the day it changes again.","type":"integer"},"estimatedCredits":{"description":"EstimatedCredits is Requested x CreditsPerProspect: the ceiling this\nbatch can cost. The run settles against prospects actually stored, so\nthe real debit is this or less.","type":"integer"},"icpId":{"description":"IcpID is the profile that was used, echoed back so callers relying on\nthe primary-profile default can see which one it resolved to.","type":"integer"},"prospectSearchId":{"description":"ProspectSearchID identifies the search being advanced. Repeated requests\nfor the same campaign and profile return the same id: the search resumes\nfrom its provider cursor instead of re-revealing the same people.","type":"integer"},"requested":{"type":"integer"},"status":{"type":"string"}}}}}}
```

## The models.SpaceDetails object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SpaceDetails":{"type":"object","properties":{"completed_campaigns":{"type":"integer"},"draft_campaigns":{"type":"integer"},"members":{"type":"array","items":{"$ref":"#/components/schemas/models.MemberInfo"}},"not_started_campaigns":{"type":"integer"},"paused_campaigns":{"type":"integer"},"running_campaigns":{"type":"integer"},"space_id":{"type":"integer"},"total_campaigns":{"type":"integer"},"total_members":{"type":"integer"}}},"models.MemberInfo":{"type":"object","properties":{"created_at":{"type":"string"},"email_address":{"type":"string"},"name":{"type":"string"}}}}}}
```

## The models.SpfCheckResult object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.SpfCheckResult":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"string"}},"record":{"type":"string"},"status":{"description":"Status is one of OK, WARNING, MISSING, ERROR.","type":"string"}}}}}}
```

## The models.StartAutopilotRunRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.StartAutopilotRunRequest":{"type":"object","required":["website"],"properties":{"budgetUsd":{"description":"BudgetUsd, when given, sizes a budget plan that is snapshotted on the\nrun. The plan's domain and mailbox counts are a ceiling for what the run\nbuys after approval (one order holds at most 10 domains and can place\nfewer mailboxes), and its dollar figures are an estimate.","type":"number"},"maxMailboxes":{"description":"MaxMailboxes caps the budget plan's infrastructure. 0 means no cap.","type":"integer"},"replyMode":{"description":"ReplyMode is how inbound replies are handled: off, draft (default),\napprove, or auto. Auto sends AI reply drafts for interested replies\nwithout review - opt in deliberately.","type":"string"},"targetProspects":{"description":"TargetProspects is how many prospects the run reveals per sourcing\nbatch: the first batch once the run is approved, then each top-up. No\nprospect is revealed and no credit is spent before approval. When\nomitted and a budget is given, it is derived from the budget plan; when\n0 or omitted without a budget, the runner default batch applies.","type":"integer"},"website":{"description":"Website is the company website the run is seeded from.","type":"string"}}}}}}
```

## The models.UpdateBillingProfileRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateBillingProfileRequest":{"type":"object","required":["addressLineOne","city","company","country","firstName","lastName","phone","phoneCc","postalCode","state"],"properties":{"addressLineOne":{"type":"string"},"addressLineTwo":{"type":"string"},"city":{"type":"string"},"company":{"type":"string"},"country":{"description":"Country is an ISO 3166-1 alpha-2 code, e.g. US. Case-insensitive on input.","type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"phoneCc":{"description":"PhoneCc is the telephone country calling code without the plus, e.g. 1.","type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"}}}}}}
```

## The models.UpdateCampaignRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateCampaignRequest":{"type":"object","properties":{"allowNonBusinessEmails":{"type":"boolean"},"dailyLimit":{"description":"DailyLimit caps the total emails (initial + follow-ups) this campaign may\nschedule per calendar day in the campaign timezone. Omit to leave the cap\nunchanged; it cannot be cleared through this endpoint.","type":"integer","maximum":10000,"minimum":1},"emoji":{"type":"string","maxLength":10,"minLength":1},"ignoreOutOfOfficeReplies":{"type":"boolean"},"isEnabledCatchallValidated":{"type":"boolean"},"isEnabledEmailVerifier":{"type":"boolean"},"isEnabledIgnoreHardBouncedLeads":{"type":"boolean"},"isEnabledIgnoreLeadsWhoAlreadyResponded":{"type":"boolean"},"isEnabledLlm":{"description":"Settings - all optional boolean flags","type":"boolean"},"isEnabledSkipLeadIfAlreadyExists":{"type":"boolean"},"isEnabledStopFollowUpsAcrossCampaigns":{"type":"boolean"},"isEnabledStopFollowUpsForSameCompany":{"type":"boolean"},"isEnabledStopFollowUpsOnReply":{"type":"boolean"},"maximumSendingLimitPerSenderEmail":{"type":"integer","maximum":10000,"minimum":1},"maximumSendingLimitPerSenderEmailVariation":{"type":"integer","maximum":100,"minimum":0},"maximumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"minimumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"name":{"type":"string","maxLength":255,"minLength":1},"timezone":{"type":"string"}}}}}}
```

## The models.UpdateCampaignResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateCampaignResponse":{"type":"object","properties":{"campaign":{"type":"object","properties":{"emoji":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"}}},"message":{"type":"string"}}}}}}
```

## The models.UpdateCampaignScheduleRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateCampaignScheduleRequest":{"type":"object","required":["timezone"],"properties":{"daysSchedule":{"description":"DaysSchedule is the set of weekdays the campaign may send on. Accepts\nweekday numbers as strings, where Sunday is 0 (\"1\" is Monday), or weekday\nnames such as \"monday\". Names are matched case-insensitively and common\nshort forms (\"mon\", \"tues\") work. Values are stored and returned as\nnumbers, so a request sending names reads back as [\"1\",\"2\",\"3\",\"4\",\"5\"].\n\nFor multiple leads scheduled campaigns (flow 3) and API campaigns.","type":"array","items":{"type":"string"}},"endSchedule":{"type":"string"},"everySchedule":{"type":"integer","minimum":1},"maximumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"minimumTimeBetweenEmails":{"type":"integer","maximum":30,"minimum":2},"sendAt":{"description":"For single lead scheduled campaigns (flow 2)","type":"string"},"startSchedule":{"type":"string"},"timezone":{"description":"Common field for all flows","type":"string"}}}}}}
```

## The models.UpdateCampaignScheduleResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateCampaignScheduleResponse":{"type":"object","properties":{"campaign":{"type":"object","properties":{"daysSchedule":{"type":"array","items":{"type":"string"}},"endSchedule":{"type":"string"},"everySchedule":{"type":"integer"},"id":{"type":"integer"},"maximumTimeBetweenEmails":{"type":"integer"},"minimumTimeBetweenEmails":{"type":"integer"},"name":{"type":"string"},"startSchedule":{"type":"string"},"timezone":{"type":"string"}}},"message":{"type":"string"}}}}}}
```

## The models.UpdateICPRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateICPRequest":{"type":"object","properties":{"companySizes":{"type":"array","items":{"type":"string"}},"industries":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}},"locations":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"seniorities":{"type":"array","items":{"type":"string"}},"summary":{"type":"string"},"titles":{"type":"array","items":{"type":"string"}}}}}}}
```

## The models.UpdateLeadCategoryRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateLeadCategoryRequest":{"type":"object","required":["category"],"properties":{"category":{"description":"Category must be one of the lead category values: interested,\nnot_interested, bounced, out_of_office, delivery_incomplete,\nmeeting_booked.","type":"string"}}}}}}
```

## The models.UpdateLeadCategoryResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateLeadCategoryResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadCategoryState"},"message":{"type":"string"}}},"models.LeadCategoryState":{"type":"object","properties":{"id":{"type":"integer"},"meetingBookedAt":{"description":"MeetingBookedAt is when the meeting was marked as booked and null while\nno meeting is marked.","type":"string"},"tag":{"description":"Tag is the lead's engagement category and null while the lead has never\nbeen categorized.","type":"string"}}}}}}
```

## The models.UpdateLeadRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateLeadRequest":{"type":"object","properties":{"company":{"type":"string"},"customVariables":{"description":"CustomVariables replaces the lead's whole custom variable map when\nprovided. Omit it to leave the existing variables untouched.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"title":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.UpdateLeadResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateLeadResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadResponse"},"message":{"type":"string"}}},"models.LeadResponse":{"type":"object","properties":{"company":{"type":"string"},"createdAt":{"type":"string"},"customVariables":{"description":"CustomVariables are the lead's merge tags beyond the named fields.","type":"object","additionalProperties":true},"email":{"type":"string"},"firstName":{"type":"string"},"id":{"type":"integer"},"lastName":{"type":"string"},"linkedin":{"type":"string"},"meetingBookedAt":{"description":"MeetingBookedAt is when a meeting was explicitly marked as booked with\nthis lead (see POST /leads/{id}/meeting) and null while no meeting is\nmarked.","type":"string"},"middleName":{"type":"string"},"phone":{"type":"string"},"tag":{"description":"Tag is the lead's engagement category (interested, not_interested,\nbounced, out_of_office, delivery_incomplete, meeting_booked) and null\nwhile the lead has never been categorized.","type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"website":{"type":"string"}}}}}}
```

## The models.UpdateReplyDraftRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateReplyDraftRequest":{"type":"object","properties":{"body":{"type":"string"},"subject":{"type":"string"}}}}}}
```

## The models.UpdateSenderEmailRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateSenderEmailRequest":{"type":"object","properties":{"currentDailyLimit":{"type":"integer","maximum":1000,"minimum":0},"familyName":{"type":"string","maxLength":255},"givenName":{"type":"string","maxLength":255,"minLength":1},"maximumSendingsLimitPerDay":{"description":"Daily sending limits","type":"integer","maximum":1000,"minimum":1},"minimumSendingsLimitPerDay":{"type":"integer","maximum":1000,"minimum":1},"signature":{"type":"string"},"toggleGradualBuildUp":{"description":"Gradual build-up toggle. While on, daily sending is capped at min(5 x weeks since the account was connected, 50, maximumSendingsLimitPerDay); turn it off to send above 50 a day.","type":"boolean"}}}}}}
```

## The models.UpdateSenderEmailResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateSenderEmailResponse":{"type":"object","properties":{"message":{"type":"string"},"senderEmail":{"$ref":"#/components/schemas/models.SenderEmailResponse"}}},"models.SenderEmailResponse":{"type":"object","properties":{"address":{"type":"string"},"campaignIds":{"type":"array","items":{"type":"integer"}},"connectionHistory":{"type":"array","items":{"$ref":"#/components/schemas/models.ConnectionHistoryItem"}},"createdAt":{"type":"string"},"currentDailyLimit":{"type":"integer"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"familyName":{"type":"string"},"givenName":{"type":"string"},"id":{"type":"integer"},"isConnected":{"type":"boolean"},"lastDisconnectedAt":{"type":"string"},"lastReconnectedAt":{"type":"string"},"manuallyDisconnected":{"type":"boolean"},"maximumSendingsLimitPerDay":{"type":"integer"},"minimumSendingsLimitPerDay":{"type":"integer"},"pictureUrl":{"type":"string"},"provider":{"type":"string"},"provisioningStatus":{"type":"string"},"signature":{"type":"string"},"toggleGradualBuildUp":{"type":"boolean"},"updatedAt":{"type":"string"}}},"models.ConnectionHistoryItem":{"type":"object","properties":{"campaignId":{"type":"integer"},"createdAt":{"type":"string"},"disconnectionReason":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"},"eventType":{"type":"string"},"id":{"type":"integer"},"userId":{"type":"integer"}}}}}}
```

## The models.UpdateSenderEmailWarmupRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateSenderEmailWarmupRequest":{"type":"object","properties":{"capLimit":{"description":"CapLimit is the most warm-up emails a day; the ramp stops here.","type":"integer","maximum":200,"minimum":1},"enableReplies":{"description":"EnableReplies lets warm-up recipients reply, adding reply signals.","type":"boolean"},"enabled":{"description":"Enabled switches warm-up on (true) or off (false). A mailbox that has\nnever been enrolled needs enabled: true to take any other setting.","type":"boolean"},"increaseBy":{"description":"IncreaseBy is how many warm-up emails are added each day until CapLimit.","type":"integer","maximum":50,"minimum":1},"startLimit":{"description":"StartLimit is how many warm-up emails go out on the first day.","type":"integer","maximum":200,"minimum":1},"timezone":{"description":"Timezone is the IANA timezone the warm-up send window runs in.","type":"string"},"weekdaysOnly":{"description":"WeekdaysOnly limits warm-up sending to Monday through Friday.","type":"boolean"}}}}}}
```

## The models.UpdateWebhookRequest object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateWebhookRequest":{"type":"object","properties":{"isEnabled":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.UpdateWebhookResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.UpdateWebhookResponse":{"type":"object","properties":{"message":{"type":"string"},"webhook":{"$ref":"#/components/schemas/models.WebhookResponse"}}},"models.WebhookResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"isEnabled":{"type":"boolean"},"name":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.WebhookResponse object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.WebhookResponse":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"integer"},"isEnabled":{"type":"boolean"},"name":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"}}}}}}
```

## The models.WorkspaceItem object

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"components":{"schemas":{"models.WorkspaceItem":{"type":"object","properties":{"createdAt":{"type":"string"},"iconUrl":{"description":"IconURL is where the workspace's icon image can be loaded from. Empty\nwhen the workspace has none. Icons are uploaded in the app.","type":"string"},"id":{"type":"integer"},"isCurrent":{"description":"IsCurrent is true for the workspace the calling API key is bound to.","type":"boolean"},"name":{"type":"string"}}}}}}
```
