@marlinjai/mail-contract 0.15.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -2962,6 +2962,10 @@ var AUDIT_ACTIONS = [
2962
2962
  "provider.events_secret_set",
2963
2963
  "provider.bounces_halted",
2964
2964
  "provider.anomaly_cleared",
2965
+ "sending_domain.created",
2966
+ "sending_domain.updated",
2967
+ "sending_domain.checked",
2968
+ "sending_domain.deleted",
2965
2969
  "topic.created",
2966
2970
  "topic.updated",
2967
2971
  "topic.deleted",
@@ -3793,7 +3797,7 @@ var ProviderRejections = z13.object({
3793
3797
  });
3794
3798
  var ProviderEvents = z13.object({
3795
3799
  status: z13.enum(["active", "needs_secret"]),
3796
- source: z13.enum(["automatic", "manual"]).nullable(),
3800
+ source: z13.enum(["automatic", "manual", "managed"]).nullable(),
3797
3801
  url: z13.string().url(),
3798
3802
  error: z13.string().nullable(),
3799
3803
  /**
@@ -3880,36 +3884,86 @@ var ProviderVerifyResult = z13.object({
3880
3884
  error: z13.string().nullable()
3881
3885
  });
3882
3886
 
3883
- // src/contacts.ts
3887
+ // src/sending-domains.ts
3884
3888
  import { z as z14 } from "zod";
3885
- var Topic = z14.object({
3889
+ var SENDING_DOMAIN_STATUSES = ["pending_dns", "verifying", "verified", "failed", "temporary_failure"];
3890
+ var SendingDomainStatus = z14.enum(SENDING_DOMAIN_STATUSES);
3891
+ var SENDING_DOMAIN_DNS_MODES = ["manual", "managed"];
3892
+ var SendingDomainDnsMode = z14.enum(SENDING_DOMAIN_DNS_MODES);
3893
+ var SENDING_DOMAIN_REGION = "eu-west-1";
3894
+ var SendingDomainName = z14.string().trim().toLowerCase().max(253).regex(
3895
+ /^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?<!-)(\.(?!-)[a-z0-9-]{1,63}(?<!-))*\.[a-z]{2,63}$/,
3896
+ "must be a domain such as example.com, without https:// or an @"
3897
+ );
3898
+ var SendingDomainRecord = z14.object({
3899
+ record: z14.string().max(40),
3900
+ name: z14.string().max(253),
3901
+ type: z14.string().max(10),
3902
+ value: z14.string().max(4096),
3903
+ ttl: z14.string().max(20),
3904
+ status: z14.string().max(40),
3905
+ priority: z14.number().int().min(0).max(65535).optional()
3906
+ });
3907
+ var SendingDomain = z14.object({
3908
+ id: Id,
3909
+ domain: z14.string(),
3910
+ from_name: z14.string(),
3911
+ from_email: Email,
3912
+ reply_to: Email.nullable(),
3913
+ status: SendingDomainStatus,
3914
+ dns_mode: SendingDomainDnsMode,
3915
+ records: z14.array(SendingDomainRecord),
3916
+ provider_id: Id.nullable(),
3917
+ checked_at: Timestamp.nullable(),
3918
+ verified_at: Timestamp.nullable(),
3919
+ last_error: z14.string().nullable(),
3920
+ created_at: Timestamp,
3921
+ updated_at: Timestamp
3922
+ });
3923
+ var SenderFields = {
3924
+ from_name: z14.string().trim().min(1).max(120),
3925
+ from_email: Email,
3926
+ reply_to: Email.nullable().optional()
3927
+ };
3928
+ function senderOnDomain(input, ctx) {
3929
+ const at = input.from_email.lastIndexOf("@");
3930
+ if (at < 0 || input.from_email.slice(at + 1).toLowerCase() !== input.domain) {
3931
+ ctx.addIssue({ code: z14.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
3932
+ }
3933
+ }
3934
+ var SendingDomainCreate = z14.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3935
+ var SendingDomainUpdate = z14.object({ from_name: SenderFields.from_name.optional(), from_email: Email.optional(), reply_to: Email.nullable().optional() }).refine((v) => Object.keys(v).length > 0, "nothing to change");
3936
+
3937
+ // src/contacts.ts
3938
+ import { z as z15 } from "zod";
3939
+ var Topic = z15.object({
3886
3940
  id: Id,
3887
3941
  slug: Slug,
3888
- name: z14.string().min(1).max(120),
3942
+ name: z15.string().min(1).max(120),
3889
3943
  /** Shown on the hosted preference page. */
3890
- description: z14.string().max(1e3).nullable(),
3944
+ description: z15.string().max(1e3).nullable(),
3891
3945
  /** Translations of `name` and `description` per locale, for the hosted page. */
3892
- translations: z14.record(
3893
- z14.object({ name: z14.string().min(1).max(120), description: z14.string().max(1e3).nullable() })
3946
+ translations: z15.record(
3947
+ z15.object({ name: z15.string().min(1).max(120), description: z15.string().max(1e3).nullable() })
3894
3948
  ),
3895
3949
  created_at: Timestamp,
3896
3950
  updated_at: Timestamp
3897
3951
  });
3898
- var TopicCreate = z14.object({
3952
+ var TopicCreate = z15.object({
3899
3953
  slug: Slug,
3900
- name: z14.string().min(1).max(120),
3901
- description: z14.string().max(1e3).optional(),
3954
+ name: z15.string().min(1).max(120),
3955
+ description: z15.string().max(1e3).optional(),
3902
3956
  translations: Topic.shape.translations.optional()
3903
3957
  });
3904
3958
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
3905
- var Contact = z14.object({
3959
+ var Contact = z15.object({
3906
3960
  id: Id,
3907
- external_id: z14.string().min(1).max(255).nullable(),
3961
+ external_id: z15.string().min(1).max(255).nullable(),
3908
3962
  /** Stored lowercased, unique per workspace. */
3909
3963
  email: Email,
3910
- first_name: z14.string().max(200).nullable(),
3911
- last_name: z14.string().max(200).nullable(),
3912
- locale: z14.string().min(2).max(35).nullable(),
3964
+ first_name: z15.string().max(200).nullable(),
3965
+ last_name: z15.string().max(200).nullable(),
3966
+ locale: z15.string().min(2).max(35).nullable(),
3913
3967
  /**
3914
3968
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
3915
3969
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -3917,65 +3971,65 @@ var Contact = z14.object({
3917
3971
  */
3918
3972
  timezone: TimezoneName.nullable(),
3919
3973
  properties: Properties,
3920
- topics: z14.array(Slug),
3974
+ topics: z15.array(Slug),
3921
3975
  /** The slugs of the contact's tags (S4). */
3922
- tags: z14.array(Slug),
3976
+ tags: z15.array(Slug),
3923
3977
  created_at: Timestamp,
3924
3978
  updated_at: Timestamp
3925
3979
  });
3926
- var ContactUpsert = z14.object({
3927
- external_id: z14.string().min(1).max(255).optional(),
3980
+ var ContactUpsert = z15.object({
3981
+ external_id: z15.string().min(1).max(255).optional(),
3928
3982
  email: Email.optional(),
3929
- first_name: z14.string().max(200).nullable().optional(),
3930
- last_name: z14.string().max(200).nullable().optional(),
3931
- locale: z14.string().min(2).max(35).nullable().optional(),
3983
+ first_name: z15.string().max(200).nullable().optional(),
3984
+ last_name: z15.string().max(200).nullable().optional(),
3985
+ locale: z15.string().min(2).max(35).nullable().optional(),
3932
3986
  timezone: TimezoneName.nullable().optional(),
3933
3987
  properties: Properties.optional(),
3934
- topics: z14.array(Slug).max(100).optional()
3988
+ topics: z15.array(Slug).max(100).optional()
3935
3989
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
3936
3990
  message: "external_id or email is required",
3937
3991
  path: ["email"]
3938
3992
  });
3939
- var ContactUpsertResult = z14.object({
3993
+ var ContactUpsertResult = z15.object({
3940
3994
  contact: Contact,
3941
- created: z14.boolean()
3995
+ created: z15.boolean()
3942
3996
  });
3943
3997
  var ContactListQuery = PageQuery.extend({
3944
- email: z14.string().min(1).max(254).optional(),
3945
- external_id: z14.string().min(1).max(255).optional(),
3998
+ email: z15.string().min(1).max(254).optional(),
3999
+ external_id: z15.string().min(1).max(255).optional(),
3946
4000
  topic: Slug.optional()
3947
4001
  });
3948
- var ContactErased = z14.object({
3949
- ok: z14.literal(true),
3950
- erased_messages: z14.number().int().min(0),
3951
- erased_recipients: z14.number().int().min(0),
3952
- suppressions_kept: z14.number().int().min(0)
4002
+ var ContactErased = z15.object({
4003
+ ok: z15.literal(true),
4004
+ erased_messages: z15.number().int().min(0),
4005
+ erased_recipients: z15.number().int().min(0),
4006
+ suppressions_kept: z15.number().int().min(0)
3953
4007
  });
3954
4008
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
3955
- var SuppressionReason = z14.enum(SUPPRESSION_REASONS);
3956
- var Suppression = z14.object({
4009
+ var SuppressionReason = z15.enum(SUPPRESSION_REASONS);
4010
+ var Suppression = z15.object({
3957
4011
  id: Id,
3958
4012
  email: Email,
3959
4013
  reason: SuppressionReason,
3960
4014
  topic: Slug.nullable(),
3961
4015
  source_message_id: Id.nullable(),
3962
- note: z14.string().max(1e3).nullable(),
4016
+ note: z15.string().max(1e3).nullable(),
3963
4017
  created_at: Timestamp
3964
4018
  });
3965
- var SuppressionCreate = z14.object({
4019
+ var SuppressionCreate = z15.object({
3966
4020
  email: Email,
3967
- reason: z14.enum(["manual", "unsubscribed"]),
4021
+ reason: z15.enum(["manual", "unsubscribed"]),
3968
4022
  topic: Slug.nullable().optional(),
3969
- note: z14.string().max(1e3).optional()
4023
+ note: z15.string().max(1e3).optional()
3970
4024
  });
3971
4025
  var SuppressionListQuery = PageQuery.extend({
3972
- email: z14.string().min(1).max(254).optional(),
4026
+ email: z15.string().min(1).max(254).optional(),
3973
4027
  reason: SuppressionReason.optional(),
3974
4028
  topic: Slug.optional()
3975
4029
  });
3976
4030
 
3977
4031
  // src/webhooks.ts
3978
- import { z as z15 } from "zod";
4032
+ import { z as z16 } from "zod";
3979
4033
  var WEBHOOK_EVENT_TYPES = [
3980
4034
  "message.sent",
3981
4035
  "message.failed",
@@ -4019,23 +4073,23 @@ var WEBHOOK_EVENT_TYPES = [
4019
4073
  "template.updated",
4020
4074
  "template.deleted"
4021
4075
  ];
4022
- var WebhookEventType = z15.enum(WEBHOOK_EVENT_TYPES);
4023
- var MessageEventBase = z15.object({
4076
+ var WebhookEventType = z16.enum(WEBHOOK_EVENT_TYPES);
4077
+ var MessageEventBase = z16.object({
4024
4078
  message_id: Id,
4025
4079
  mailing_id: Id.nullable(),
4026
4080
  mailing_metadata: MailingMetadata.nullable(),
4027
4081
  recipient_id: Id.nullable(),
4028
4082
  contact_id: Id.nullable(),
4029
- external_id: z15.string().nullable(),
4083
+ external_id: z16.string().nullable(),
4030
4084
  email: Email,
4031
- subject: z15.string(),
4085
+ subject: z16.string(),
4032
4086
  topic: Slug.nullable(),
4033
- provider_message_id: z15.string().nullable(),
4034
- is_test: z15.boolean()
4087
+ provider_message_id: z16.string().nullable(),
4088
+ is_test: z16.boolean()
4035
4089
  });
4036
4090
  var MessageSentData = MessageEventBase.extend({
4037
4091
  /** The final HTML as sent, so the client can archive it beside its own records. */
4038
- html: z15.string(),
4092
+ html: z16.string(),
4039
4093
  sent_at: Timestamp,
4040
4094
  /**
4041
4095
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4046,20 +4100,20 @@ var MessageSentData = MessageEventBase.extend({
4046
4100
  insertions: InsertionChoices.nullish()
4047
4101
  });
4048
4102
  var MessageFailedData = MessageEventBase.extend({
4049
- error: z15.string(),
4103
+ error: z16.string(),
4050
4104
  /** False when the provider rejected permanently; the recipient will not be retried. */
4051
- retryable: z15.boolean(),
4105
+ retryable: z16.boolean(),
4052
4106
  failed_at: Timestamp
4053
4107
  });
4054
4108
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4055
- var ContactUnsubscribedData = z15.object({
4109
+ var ContactUnsubscribedData = z16.object({
4056
4110
  contact_id: Id.nullable(),
4057
- external_id: z15.string().nullable(),
4111
+ external_id: z16.string().nullable(),
4058
4112
  email: Email,
4059
4113
  /** The topic unsubscribed from; null means every topic. */
4060
4114
  topic: Slug.nullable(),
4061
4115
  mailing_id: Id.nullable(),
4062
- source: z15.enum(UNSUBSCRIBE_SOURCES),
4116
+ source: z16.enum(UNSUBSCRIBE_SOURCES),
4063
4117
  unsubscribed_at: Timestamp
4064
4118
  });
4065
4119
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4068,142 +4122,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4068
4122
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4069
4123
  * same address and mailing went out before); `topic` is null.
4070
4124
  */
4071
- source: z15.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4125
+ source: z16.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4072
4126
  resubscribed_at: Timestamp
4073
4127
  });
4074
- var ContactBouncedData = z15.object({
4128
+ var ContactBouncedData = z16.object({
4075
4129
  contact_id: Id.nullable(),
4076
- external_id: z15.string().nullable(),
4130
+ external_id: z16.string().nullable(),
4077
4131
  email: Email,
4078
4132
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4079
- reason: z15.enum(["bounced", "complained"]),
4133
+ reason: z16.enum(["bounced", "complained"]),
4080
4134
  message_id: Id.nullable(),
4081
- diagnostic: z15.string().nullable(),
4135
+ diagnostic: z16.string().nullable(),
4082
4136
  bounced_at: Timestamp
4083
4137
  });
4084
- var MailingFinishedData = z15.object({
4138
+ var MailingFinishedData = z16.object({
4085
4139
  mailing_id: Id,
4086
4140
  mailing_metadata: MailingMetadata,
4087
- status: z15.enum(["sent", "partially_failed", "cancelled"]),
4141
+ status: z16.enum(["sent", "partially_failed", "cancelled"]),
4088
4142
  counts: MailingCounts,
4089
4143
  finished_at: Timestamp
4090
4144
  });
4091
- var ContactSubscribedData = z15.object({
4145
+ var ContactSubscribedData = z16.object({
4092
4146
  contact_id: Id,
4093
- external_id: z15.string().nullable(),
4147
+ external_id: z16.string().nullable(),
4094
4148
  email: Email,
4095
- topics: z15.array(Slug),
4096
- source: z15.enum(["signup_form", "api", "dashboard", "automation"]),
4149
+ topics: z16.array(Slug),
4150
+ source: z16.enum(["signup_form", "api", "dashboard", "automation"]),
4097
4151
  signup_form_id: Id.nullable(),
4098
- signup_form_version: z15.number().int().min(1).nullable(),
4152
+ signup_form_version: z16.number().int().min(1).nullable(),
4099
4153
  subscribed_at: Timestamp
4100
4154
  });
4101
- var ImportFinishedData = z15.object({
4155
+ var ImportFinishedData = z16.object({
4102
4156
  import_id: Id,
4103
- status: z15.enum(["completed", "cancelled", "failed"]),
4157
+ status: z16.enum(["completed", "cancelled", "failed"]),
4104
4158
  result: ImportReport.nullable(),
4105
- error: z15.string().nullable(),
4159
+ error: z16.string().nullable(),
4106
4160
  finished_at: Timestamp
4107
4161
  });
4108
- var MailingScheduledData = z15.object({
4162
+ var MailingScheduledData = z16.object({
4109
4163
  mailing_id: Id,
4110
4164
  mailing_metadata: MailingMetadata,
4111
4165
  scheduled_at: Timestamp.nullable()
4112
4166
  });
4113
- var MailingStartedData = z15.object({
4167
+ var MailingStartedData = z16.object({
4114
4168
  mailing_id: Id,
4115
4169
  mailing_metadata: MailingMetadata,
4116
- trigger: z15.enum(["send", "schedule"]),
4117
- recipients: z15.number().int().min(0),
4170
+ trigger: z16.enum(["send", "schedule"]),
4171
+ recipients: z16.number().int().min(0),
4118
4172
  started_at: Timestamp
4119
4173
  });
4120
- var MailingScheduleFailedData = z15.object({
4174
+ var MailingScheduleFailedData = z16.object({
4121
4175
  mailing_id: Id,
4122
4176
  mailing_metadata: MailingMetadata,
4123
- code: z15.string(),
4124
- message: z15.string(),
4177
+ code: z16.string(),
4178
+ message: z16.string(),
4125
4179
  failed_at: Timestamp
4126
4180
  });
4127
- var MailingAbWinnerSelectedData = z15.object({
4181
+ var MailingAbWinnerSelectedData = z16.object({
4128
4182
  mailing_id: Id,
4129
4183
  mailing_metadata: MailingMetadata,
4130
- winner: z15.string(),
4131
- decided_by: z15.enum(["metric", "manual"]),
4132
- variants: z15.array(VariantAnalytics),
4184
+ winner: z16.string(),
4185
+ decided_by: z16.enum(["metric", "manual"]),
4186
+ variants: z16.array(VariantAnalytics),
4133
4187
  decided_at: Timestamp
4134
4188
  });
4135
- var ContactTaggedData = z15.object({
4189
+ var ContactTaggedData = z16.object({
4136
4190
  contact_id: Id,
4137
- external_id: z15.string().nullable(),
4191
+ external_id: z16.string().nullable(),
4138
4192
  email: Email,
4139
4193
  /** Only the tags the contact did not already have. */
4140
- tags: z15.array(Slug).min(1),
4141
- source: z15.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4194
+ tags: z16.array(Slug).min(1),
4195
+ source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4142
4196
  tagged_at: Timestamp
4143
4197
  });
4144
- var ContactUpdatedData = z15.object({
4198
+ var ContactUpdatedData = z16.object({
4145
4199
  contact_id: Id,
4146
- external_id: z15.string().nullable(),
4200
+ external_id: z16.string().nullable(),
4147
4201
  email: Email,
4148
- changed: z15.array(z15.string()).min(1),
4202
+ changed: z16.array(z16.string()).min(1),
4149
4203
  properties: Properties,
4150
- source: z15.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4204
+ source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4151
4205
  updated_at: Timestamp
4152
4206
  });
4153
- var AutomationRunEventBase = z15.object({
4207
+ var AutomationRunEventBase = z16.object({
4154
4208
  automation_id: Id,
4155
- automation_name: z15.string(),
4209
+ automation_name: z16.string(),
4156
4210
  run_id: Id,
4157
- version: z15.number().int().min(1),
4211
+ version: z16.number().int().min(1),
4158
4212
  contact_id: Id,
4159
- external_id: z15.string().nullable(),
4213
+ external_id: z16.string().nullable(),
4160
4214
  email: Email
4161
4215
  });
4162
4216
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4163
4217
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4164
- trigger_kind: z15.string(),
4218
+ trigger_kind: z16.string(),
4165
4219
  entered_at: Timestamp
4166
4220
  });
4167
4221
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4168
- last_step_id: z15.string().nullable(),
4222
+ last_step_id: z16.string().nullable(),
4169
4223
  completed_at: Timestamp
4170
4224
  });
4171
4225
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4172
4226
  reason: AutomationEndReason,
4173
- step_id: z15.string().nullable(),
4227
+ step_id: z16.string().nullable(),
4174
4228
  exited_at: Timestamp
4175
4229
  });
4176
4230
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4177
- reason: z15.string(),
4178
- step_id: z15.string().nullable(),
4231
+ reason: z16.string(),
4232
+ step_id: z16.string().nullable(),
4179
4233
  failed_at: Timestamp
4180
4234
  });
4181
4235
  var AutomationWebhookData = AutomationRunEventBase.extend({
4182
- step_id: z15.string(),
4236
+ step_id: z16.string(),
4183
4237
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4184
- step_label: z15.string().nullable(),
4238
+ step_label: z16.string().nullable(),
4185
4239
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4186
4240
  payload: JsonValue.nullable(),
4187
4241
  fired_at: Timestamp
4188
4242
  });
4189
- var TemplateEventBase = z15.object({
4243
+ var TemplateEventBase = z16.object({
4190
4244
  template_id: Id,
4191
- name: z15.string().min(1).max(200),
4192
- version: z15.number().int().min(1),
4193
- source: z15.enum(["api", "dashboard", "mjml_import"])
4245
+ name: z16.string().min(1).max(200),
4246
+ version: z16.number().int().min(1),
4247
+ source: z16.enum(["api", "dashboard", "mjml_import"])
4194
4248
  });
4195
4249
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4196
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z15.boolean(), updated_at: Timestamp });
4250
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z16.boolean(), updated_at: Timestamp });
4197
4251
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4198
- var envelope = (type, data) => z15.object({
4252
+ var envelope = (type, data) => z16.object({
4199
4253
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4200
4254
  id: Id,
4201
- type: z15.literal(type),
4255
+ type: z16.literal(type),
4202
4256
  created_at: Timestamp,
4203
4257
  workspace_id: Id,
4204
4258
  data
4205
4259
  });
4206
- var WebhookEvent = z15.discriminatedUnion("type", [
4260
+ var WebhookEvent = z16.discriminatedUnion("type", [
4207
4261
  envelope("message.sent", MessageSentData),
4208
4262
  envelope("message.failed", MessageFailedData),
4209
4263
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4227,16 +4281,16 @@ var WebhookEvent = z15.discriminatedUnion("type", [
4227
4281
  envelope("template.updated", TemplateUpdatedData),
4228
4282
  envelope("template.deleted", TemplateDeletedData)
4229
4283
  ]);
4230
- var WebhookEndpoint = z15.object({
4284
+ var WebhookEndpoint = z16.object({
4231
4285
  id: Id,
4232
- url: z15.string().url(),
4233
- description: z15.string().max(500).nullable(),
4234
- events: z15.array(WebhookEventType).min(1),
4235
- enabled: z15.boolean(),
4286
+ url: z16.string().url(),
4287
+ description: z16.string().max(500).nullable(),
4288
+ events: z16.array(WebhookEventType).min(1),
4289
+ enabled: z16.boolean(),
4236
4290
  created_at: Timestamp,
4237
4291
  updated_at: Timestamp
4238
4292
  });
4239
- var WebhookUrl = z15.string().url().refine((u) => {
4293
+ var WebhookUrl = z16.string().url().refine((u) => {
4240
4294
  try {
4241
4295
  const url = new URL(u);
4242
4296
  if (url.protocol === "https:") return true;
@@ -4245,35 +4299,35 @@ var WebhookUrl = z15.string().url().refine((u) => {
4245
4299
  return false;
4246
4300
  }
4247
4301
  }, "must be https (http only for localhost)");
4248
- var WebhookEndpointCreate = z15.object({
4302
+ var WebhookEndpointCreate = z16.object({
4249
4303
  url: WebhookUrl,
4250
- description: z15.string().max(500).optional(),
4251
- events: z15.array(WebhookEventType).min(1),
4252
- enabled: z15.boolean().optional()
4304
+ description: z16.string().max(500).optional(),
4305
+ events: z16.array(WebhookEventType).min(1),
4306
+ enabled: z16.boolean().optional()
4253
4307
  });
4254
- var WebhookEndpointUpdate = z15.object({
4308
+ var WebhookEndpointUpdate = z16.object({
4255
4309
  url: WebhookUrl,
4256
- description: z15.string().max(500).nullable(),
4257
- events: z15.array(WebhookEventType).min(1),
4258
- enabled: z15.boolean()
4310
+ description: z16.string().max(500).nullable(),
4311
+ events: z16.array(WebhookEventType).min(1),
4312
+ enabled: z16.boolean()
4259
4313
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4260
- var WebhookEndpointWithSecret = z15.object({
4314
+ var WebhookEndpointWithSecret = z16.object({
4261
4315
  endpoint: WebhookEndpoint,
4262
- secret: z15.string().min(32)
4316
+ secret: z16.string().min(32)
4263
4317
  });
4264
4318
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4265
- var WebhookDeliveryStatus = z15.enum(WEBHOOK_DELIVERY_STATUSES);
4319
+ var WebhookDeliveryStatus = z16.enum(WEBHOOK_DELIVERY_STATUSES);
4266
4320
  var WEBHOOK_MAX_ATTEMPTS = 8;
4267
4321
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4268
- var WebhookDelivery = z15.object({
4322
+ var WebhookDelivery = z16.object({
4269
4323
  id: Id,
4270
4324
  endpoint_id: Id,
4271
4325
  event_id: Id,
4272
4326
  event_type: WebhookEventType,
4273
4327
  status: WebhookDeliveryStatus,
4274
- attempts: z15.number().int().min(0),
4275
- last_status_code: z15.number().int().min(100).max(599).nullable(),
4276
- last_error: z15.string().nullable(),
4328
+ attempts: z16.number().int().min(0),
4329
+ last_status_code: z16.number().int().min(100).max(599).nullable(),
4330
+ last_error: z16.string().nullable(),
4277
4331
  next_attempt_at: Timestamp.nullable(),
4278
4332
  delivered_at: Timestamp.nullable(),
4279
4333
  created_at: Timestamp
@@ -4282,7 +4336,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4282
4336
  status: WebhookDeliveryStatus.optional(),
4283
4337
  event_type: WebhookEventType.optional()
4284
4338
  });
4285
- var WebhookDeliveryParams = z15.object({ id: Id, delivery_id: Id });
4339
+ var WebhookDeliveryParams = z16.object({ id: Id, delivery_id: Id });
4286
4340
 
4287
4341
  // src/webhook-signing.ts
4288
4342
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4349,79 +4403,79 @@ async function verifyWebhook(input) {
4349
4403
  }
4350
4404
 
4351
4405
  // src/billing.ts
4352
- import { z as z16 } from "zod";
4406
+ import { z as z17 } from "zod";
4353
4407
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4354
- var PlanId = z16.enum(PLAN_IDS);
4355
- var PlanLimits = z16.object({
4356
- monthly_messages: z16.number().int().min(0).nullable(),
4357
- contacts: z16.number().int().min(0).nullable(),
4358
- members: z16.number().int().min(1).nullable(),
4359
- providers: z16.number().int().min(1).nullable(),
4360
- webhook_endpoints: z16.number().int().min(0).nullable(),
4408
+ var PlanId = z17.enum(PLAN_IDS);
4409
+ var PlanLimits = z17.object({
4410
+ monthly_messages: z17.number().int().min(0).nullable(),
4411
+ contacts: z17.number().int().min(0).nullable(),
4412
+ members: z17.number().int().min(1).nullable(),
4413
+ providers: z17.number().int().min(1).nullable(),
4414
+ webhook_endpoints: z17.number().int().min(0).nullable(),
4361
4415
  /** Automations that may be live (active or paused) at once (A1). */
4362
- active_automations: z16.number().int().min(0).nullable(),
4416
+ active_automations: z17.number().int().min(0).nullable(),
4363
4417
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4364
- automation_steps: z16.number().int().min(1).nullable()
4418
+ automation_steps: z17.number().int().min(1).nullable(),
4419
+ /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4420
+ sending_domains: z17.number().int().min(0).nullable()
4365
4421
  });
4366
- var PlanFeatures = z16.object({
4422
+ var PlanFeatures = z17.object({
4367
4423
  /** A/B tests of subject and content on a mailing (S4). */
4368
- ab_testing: z16.boolean(),
4424
+ ab_testing: z17.boolean(),
4369
4425
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4370
- tracking: z16.boolean(),
4371
- /** Sending and hosting pages on the workspace's own domain (a later phase). */
4372
- custom_domains: z16.boolean(),
4426
+ tracking: z17.boolean(),
4373
4427
  /** Automations: flows a person walks through step by step (A1). */
4374
- automations: z16.boolean()
4428
+ automations: z17.boolean()
4375
4429
  });
4376
- var PLAN_FEATURES = ["ab_testing", "tracking", "custom_domains", "automations"];
4377
- var Plan = z16.object({
4430
+ var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4431
+ var Plan = z17.object({
4378
4432
  id: PlanId,
4379
- name: z16.string().min(1),
4433
+ name: z17.string().min(1),
4380
4434
  /** Price in the smallest currency unit per month; null for plans not sold. */
4381
- monthly_price_cents: z16.number().int().min(0).nullable(),
4382
- currency: z16.string().length(3),
4435
+ monthly_price_cents: z17.number().int().min(0).nullable(),
4436
+ currency: z17.string().length(3),
4383
4437
  limits: PlanLimits,
4384
4438
  features: PlanFeatures
4385
4439
  });
4386
- var CatalogPlan = Plan.extend({ sellable: z16.boolean() });
4387
- var Subscription = z16.object({
4440
+ var CatalogPlan = Plan.extend({ sellable: z17.boolean() });
4441
+ var Subscription = z17.object({
4388
4442
  workspace_id: Id,
4389
4443
  plan: PlanId,
4390
- status: z16.enum(["active", "trialing", "past_due", "cancelled"]),
4444
+ status: z17.enum(["active", "trialing", "past_due", "cancelled"]),
4391
4445
  current_period_start: Timestamp,
4392
4446
  current_period_end: Timestamp,
4393
- cancel_at_period_end: z16.boolean(),
4447
+ cancel_at_period_end: z17.boolean(),
4394
4448
  /**
4395
4449
  * A design partner outside billing (plan `design_partner`, no limits, no
4396
4450
  * checkout). Set only by an operator, never through the API.
4397
4451
  */
4398
- billing_exempt: z16.boolean()
4452
+ billing_exempt: z17.boolean()
4399
4453
  });
4400
- var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations"];
4401
- var UsageMetric = z16.enum(USAGE_METRICS);
4454
+ var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4455
+ var UsageMetric = z17.enum(USAGE_METRICS);
4402
4456
  var USAGE_WARNING_RATIO = 0.8;
4403
- var UsageWarning = z16.object({
4457
+ var UsageWarning = z17.object({
4404
4458
  metric: UsageMetric,
4405
- used: z16.number().int().min(0),
4406
- limit: z16.number().int().min(0),
4459
+ used: z17.number().int().min(0),
4460
+ limit: z17.number().int().min(0),
4407
4461
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4408
- level: z16.enum(["approaching", "reached"])
4462
+ level: z17.enum(["approaching", "reached"])
4409
4463
  });
4410
- var Usage = z16.object({
4464
+ var Usage = z17.object({
4411
4465
  plan: PlanId,
4412
4466
  period_start: Timestamp,
4413
4467
  period_end: Timestamp,
4414
- metrics: z16.record(UsageMetric, z16.object({ used: z16.number().int().min(0), limit: z16.number().int().min(0).nullable() })),
4415
- warnings: z16.array(UsageWarning)
4468
+ metrics: z17.record(UsageMetric, z17.object({ used: z17.number().int().min(0), limit: z17.number().int().min(0).nullable() })),
4469
+ warnings: z17.array(UsageWarning)
4416
4470
  });
4417
- var CheckoutRequest = z16.object({
4418
- plan: z16.enum(["starter", "growth"]),
4419
- success_url: z16.string().url(),
4420
- cancel_url: z16.string().url()
4471
+ var CheckoutRequest = z17.object({
4472
+ plan: z17.enum(["starter", "growth"]),
4473
+ success_url: z17.string().url(),
4474
+ cancel_url: z17.string().url()
4421
4475
  });
4422
- var CheckoutSession = z16.object({ url: z16.string().url() });
4423
- var PortalRequest = z16.object({ return_url: z16.string().url() });
4424
- var PortalSession = z16.object({ url: z16.string().url() });
4476
+ var CheckoutSession = z17.object({ url: z17.string().url() });
4477
+ var PortalRequest = z17.object({ return_url: z17.string().url() });
4478
+ var PortalSession = z17.object({ url: z17.string().url() });
4425
4479
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4426
4480
  function formatUsageWarningHeader(warnings) {
4427
4481
  if (warnings.length === 0) return null;
@@ -4441,7 +4495,7 @@ function parseUsageWarningHeader(value) {
4441
4495
  }
4442
4496
 
4443
4497
  // src/routes.ts
4444
- import { z as z17 } from "zod";
4498
+ import { z as z18 } from "zod";
4445
4499
  var list = (item) => page(item);
4446
4500
  var foundationRoutes = {
4447
4501
  "workspaces.create": {
@@ -4687,7 +4741,7 @@ var templateRoutes = {
4687
4741
  path: "/v1/templates/:id/export",
4688
4742
  params: IdParams,
4689
4743
  query: TemplateExportQuery,
4690
- response: z17.string(),
4744
+ response: z18.string(),
4691
4745
  responseType: "text",
4692
4746
  status: 200,
4693
4747
  access: "read",
@@ -4868,6 +4922,62 @@ var sendingRoutes = {
4868
4922
  access: "read",
4869
4923
  phase: "S2"
4870
4924
  },
4925
+ // Managed sending domains (docs/plans/2026-10-18-managed-sending-domains.md).
4926
+ "sendingDomains.list": {
4927
+ method: "GET",
4928
+ path: "/v1/sending-domains",
4929
+ query: PageQuery,
4930
+ response: list(SendingDomain),
4931
+ status: 200,
4932
+ access: "read",
4933
+ phase: "S2"
4934
+ },
4935
+ "sendingDomains.create": {
4936
+ method: "POST",
4937
+ path: "/v1/sending-domains",
4938
+ body: SendingDomainCreate,
4939
+ response: SendingDomain,
4940
+ status: 201,
4941
+ access: "admin",
4942
+ phase: "S2"
4943
+ },
4944
+ "sendingDomains.get": {
4945
+ method: "GET",
4946
+ path: "/v1/sending-domains/:id",
4947
+ params: IdParams,
4948
+ response: SendingDomain,
4949
+ status: 200,
4950
+ access: "read",
4951
+ phase: "S2"
4952
+ },
4953
+ "sendingDomains.update": {
4954
+ method: "PATCH",
4955
+ path: "/v1/sending-domains/:id",
4956
+ params: IdParams,
4957
+ body: SendingDomainUpdate,
4958
+ response: SendingDomain,
4959
+ status: 200,
4960
+ access: "admin",
4961
+ phase: "S2"
4962
+ },
4963
+ "sendingDomains.check": {
4964
+ method: "POST",
4965
+ path: "/v1/sending-domains/:id/check",
4966
+ params: IdParams,
4967
+ response: SendingDomain,
4968
+ status: 200,
4969
+ access: "admin",
4970
+ phase: "S2"
4971
+ },
4972
+ "sendingDomains.delete": {
4973
+ method: "DELETE",
4974
+ path: "/v1/sending-domains/:id",
4975
+ params: IdParams,
4976
+ response: Ok,
4977
+ status: 200,
4978
+ access: "admin",
4979
+ phase: "S2"
4980
+ },
4871
4981
  "topics.list": {
4872
4982
  method: "GET",
4873
4983
  path: "/v1/topics",
@@ -5011,7 +5121,7 @@ var sendingRoutes = {
5011
5121
  path: "/v1/mailings/:id/export",
5012
5122
  params: IdParams,
5013
5123
  query: MailingExportQuery,
5014
- response: z17.string(),
5124
+ response: z18.string(),
5015
5125
  responseType: "text",
5016
5126
  status: 200,
5017
5127
  access: "read",
@@ -5278,7 +5388,7 @@ var platformRoutes = {
5278
5388
  "contactProperties.list": {
5279
5389
  method: "GET",
5280
5390
  path: "/v1/contact-properties",
5281
- response: z17.object({ data: z17.array(ContactPropertyDefinition) }),
5391
+ response: z18.object({ data: z18.array(ContactPropertyDefinition) }),
5282
5392
  status: 200,
5283
5393
  access: "read",
5284
5394
  phase: "S4"
@@ -5577,7 +5687,7 @@ var billingRoutes = {
5577
5687
  "billing.plans": {
5578
5688
  method: "GET",
5579
5689
  path: "/v1/billing/plans",
5580
- response: z17.object({ data: z17.array(CatalogPlan) }),
5690
+ response: z18.object({ data: z18.array(CatalogPlan) }),
5581
5691
  status: 200,
5582
5692
  access: "read",
5583
5693
  phase: "S5"
@@ -5719,7 +5829,7 @@ var automationRoutes = {
5719
5829
  method: "POST",
5720
5830
  path: "/v1/automations/:id/pause",
5721
5831
  params: IdParams,
5722
- body: z17.object({}).strict(),
5832
+ body: z18.object({}).strict(),
5723
5833
  response: Automation,
5724
5834
  status: 200,
5725
5835
  access: "write",
@@ -5729,7 +5839,7 @@ var automationRoutes = {
5729
5839
  method: "POST",
5730
5840
  path: "/v1/automations/:id/resume",
5731
5841
  params: IdParams,
5732
- body: z17.object({}).strict(),
5842
+ body: z18.object({}).strict(),
5733
5843
  response: Automation,
5734
5844
  status: 200,
5735
5845
  access: "write",
@@ -5739,7 +5849,7 @@ var automationRoutes = {
5739
5849
  method: "POST",
5740
5850
  path: "/v1/automations/:id/archive",
5741
5851
  params: IdParams,
5742
- body: z17.object({}).strict(),
5852
+ body: z18.object({}).strict(),
5743
5853
  response: Automation,
5744
5854
  status: 200,
5745
5855
  access: "write",
@@ -5857,7 +5967,7 @@ var routes = {
5857
5967
  ...automationRoutes
5858
5968
  };
5859
5969
  var TRUSTED_APP_OPERATIONS = {
5860
- booking: ["workspaces.list", "workspace.update", "providers.list", "apiKeys.create", "apiKeys.revoke"]
5970
+ booking: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"]
5861
5971
  };
5862
5972
  function trustedAppMayCall(app, id) {
5863
5973
  return TRUSTED_APP_OPERATIONS[app].includes(id);
@@ -6244,6 +6354,9 @@ export {
6244
6354
  ResolveProblem,
6245
6355
  ResolvedRecipient,
6246
6356
  ResolvedValue,
6357
+ SENDING_DOMAIN_DNS_MODES,
6358
+ SENDING_DOMAIN_REGION,
6359
+ SENDING_DOMAIN_STATUSES,
6247
6360
  SERVICE_FILLED_MERGE_FIELDS,
6248
6361
  SIGNUP_FORM_FIELDS,
6249
6362
  SKIP_REASONS,
@@ -6259,6 +6372,13 @@ export {
6259
6372
  SegmentFilter,
6260
6373
  SegmentPreview,
6261
6374
  SegmentPreviewRequest,
6375
+ SendingDomain,
6376
+ SendingDomainCreate,
6377
+ SendingDomainDnsMode,
6378
+ SendingDomainName,
6379
+ SendingDomainRecord,
6380
+ SendingDomainStatus,
6381
+ SendingDomainUpdate,
6262
6382
  SignupForm,
6263
6383
  SignupFormCreate,
6264
6384
  SignupFormEmbed,