@marlinjai/mail-contract 0.20.0 → 0.21.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
@@ -131,8 +131,11 @@ var RETRYABLE_ERRORS = [
131
131
  "service_unavailable"
132
132
  ];
133
133
  var BILLING_NOT_CONFIGURED_REASON = "billing_not_configured";
134
+ var DOMAIN_BUYING_NOT_CONFIGURED_REASON = "domain_buying_not_configured";
135
+ var DOMAIN_PRICE_CHANGED_REASON = "price_changed";
136
+ var LASTING_REASONS = [BILLING_NOT_CONFIGURED_REASON, DOMAIN_BUYING_NOT_CONFIGURED_REASON];
134
137
  function isRetryableError(code, details) {
135
- return RETRYABLE_ERRORS.includes(code) && details?.reason !== BILLING_NOT_CONFIGURED_REASON;
138
+ return RETRYABLE_ERRORS.includes(code) && !LASTING_REASONS.includes(details?.reason);
136
139
  }
137
140
 
138
141
  // src/headers.ts
@@ -2785,7 +2788,7 @@ var EventListQuery = PageQuery.extend({
2785
2788
 
2786
2789
  // src/legal.ts
2787
2790
  import { z as z11 } from "zod";
2788
- var LEGAL_TERMS_VERSION = "2026-10-23";
2791
+ var LEGAL_TERMS_VERSION = "2026-10-28";
2789
2792
  var AcceptTerms = z11.literal(LEGAL_TERMS_VERSION, {
2790
2793
  errorMap: () => ({ message: `must be "${LEGAL_TERMS_VERSION}": accept the current terms of service and processing agreement` })
2791
2794
  });
@@ -3038,6 +3041,14 @@ var AUDIT_ACTIONS = [
3038
3041
  "billing.exemption_changed",
3039
3042
  "billing.extra_sending_domains_changed",
3040
3043
  "billing.terms_accepted",
3044
+ // Domains bought inside Lumitra Mail
3045
+ "domain_order.created",
3046
+ "domain_order.paid",
3047
+ "domain_order.registered",
3048
+ "domain_order.ready",
3049
+ "domain_order.needs_attention",
3050
+ "domain_order.refunded",
3051
+ "domain_order.cancelled",
3041
3052
  // A1: automations
3042
3053
  "automation.created",
3043
3054
  "automation.updated",
@@ -3052,7 +3063,7 @@ var AUDIT_ACTIONS = [
3052
3063
  "event.recorded"
3053
3064
  ];
3054
3065
  var AuditAction = z12.enum(AUDIT_ACTIONS);
3055
- var TRUSTED_APPS = ["booking"];
3066
+ var TRUSTED_APPS = ["booking", "sites"];
3056
3067
  var TrustedApp = z12.enum(TRUSTED_APPS);
3057
3068
  var AuditActor = z12.discriminatedUnion("type", [
3058
3069
  z12.object({
@@ -3961,36 +3972,119 @@ function senderOnDomain(input, ctx) {
3961
3972
  var SendingDomainCreate = z15.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3962
3973
  var SendingDomainUpdate = z15.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");
3963
3974
 
3964
- // src/contacts.ts
3975
+ // src/domains.ts
3965
3976
  import { z as z16 } from "zod";
3966
- var Topic = z16.object({
3977
+ var DomainSearchQuery = z16.object({ q: z16.string().trim().min(1).max(63) });
3978
+ var DOMAIN_UNAVAILABLE_REASONS = ["taken", "extension_not_supported", "premium", "not_registrable"];
3979
+ var DomainUnavailableReason = z16.enum(DOMAIN_UNAVAILABLE_REASONS);
3980
+ var DomainOffer = z16.object({
3981
+ domain: z16.string(),
3982
+ available: z16.boolean(),
3983
+ reason: DomainUnavailableReason.nullable(),
3984
+ price_cents: z16.number().int().min(0).nullable(),
3985
+ renewal_price_cents: z16.number().int().min(0).nullable(),
3986
+ currency: z16.literal("EUR")
3987
+ });
3988
+ var DOMAIN_BUYING_BLOCKS = ["not_configured", "paid_plan_required", "no_company"];
3989
+ var DomainBuyingBlock = z16.enum(DOMAIN_BUYING_BLOCKS);
3990
+ var DomainSearchResult = z16.object({
3991
+ data: z16.array(DomainOffer),
3992
+ blocked: DomainBuyingBlock.nullable()
3993
+ });
3994
+ var DomainRegistrant = z16.object({
3995
+ name: z16.string().trim().min(3).max(120).regex(/\S+\s+\S+/, "must be a first and a last name"),
3996
+ organization: z16.string().trim().min(1).max(120).nullable().optional(),
3997
+ email: Email,
3998
+ phone: z16.string().trim().regex(/^\+\d{1,3}\.\d{4,14}$/, "must be +<country code>.<number>, such as +49.3012345678"),
3999
+ street: z16.string().trim().min(3).max(200),
4000
+ city: z16.string().trim().min(1).max(100),
4001
+ state: z16.string().trim().min(1).max(100),
4002
+ postal_code: z16.string().trim().min(2).max(20),
4003
+ country_code: z16.string().trim().toUpperCase().regex(/^[A-Z]{2}$/, "must be a two-letter country code such as DE")
4004
+ });
4005
+ var MAX_DOMAIN_ORDERS_PER_DAY = 2;
4006
+ var DomainOrderCreate = z16.object({
4007
+ domain: SendingDomainName,
4008
+ price_cents: z16.number().int().min(0),
4009
+ registrant: DomainRegistrant,
4010
+ from_name: z16.string().trim().min(1).max(120),
4011
+ from_local_part: z16.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello"),
4012
+ /**
4013
+ * Where Stripe returns to after paying, and after leaving the payment. The
4014
+ * service adds `domain_order=<order id>` to both, so the page coming back
4015
+ * knows which order to show (and read: `domainOrders.get` confirms a
4016
+ * payment at once, before Stripe's webhook arrives).
4017
+ */
4018
+ success_url: z16.string().url(),
4019
+ cancel_url: z16.string().url(),
4020
+ /** The buyer accepted the terms of service (which cover bought domains) of this version. */
4021
+ accept_terms: AcceptTerms
4022
+ });
4023
+ var DOMAIN_ORDER_STATES = [
4024
+ "awaiting_payment",
4025
+ "paid",
4026
+ "registering",
4027
+ "setting_up",
4028
+ "ready",
4029
+ "needs_attention",
4030
+ "refunded",
4031
+ "cancelled"
4032
+ ];
4033
+ var DomainOrderState = z16.enum(DOMAIN_ORDER_STATES);
4034
+ var DomainOrder = z16.object({
4035
+ id: Id,
4036
+ domain: z16.string(),
4037
+ state: DomainOrderState,
4038
+ price_cents: z16.number().int().min(0),
4039
+ renewal_price_cents: z16.number().int().min(0),
4040
+ currency: z16.literal("EUR"),
4041
+ /** Stripe's payment page while `awaiting_payment`; null otherwise. */
4042
+ checkout_url: z16.string().url().nullable(),
4043
+ registrant_name: z16.string(),
4044
+ from_name: z16.string(),
4045
+ from_email: Email,
4046
+ /** The sending domain once `ready`. */
4047
+ sending_domain_id: Id.nullable(),
4048
+ /** When the paid year ends, once registered. */
4049
+ expires_at: Timestamp.nullable(),
4050
+ /** What went wrong, for `needs_attention` and `refunded`; null otherwise. */
4051
+ last_error: z16.string().nullable(),
4052
+ paid_at: Timestamp.nullable(),
4053
+ registered_at: Timestamp.nullable(),
4054
+ created_at: Timestamp,
4055
+ updated_at: Timestamp
4056
+ });
4057
+
4058
+ // src/contacts.ts
4059
+ import { z as z17 } from "zod";
4060
+ var Topic = z17.object({
3967
4061
  id: Id,
3968
4062
  slug: Slug,
3969
- name: z16.string().min(1).max(120),
4063
+ name: z17.string().min(1).max(120),
3970
4064
  /** Shown on the hosted preference page. */
3971
- description: z16.string().max(1e3).nullable(),
4065
+ description: z17.string().max(1e3).nullable(),
3972
4066
  /** Translations of `name` and `description` per locale, for the hosted page. */
3973
- translations: z16.record(
3974
- z16.object({ name: z16.string().min(1).max(120), description: z16.string().max(1e3).nullable() })
4067
+ translations: z17.record(
4068
+ z17.object({ name: z17.string().min(1).max(120), description: z17.string().max(1e3).nullable() })
3975
4069
  ),
3976
4070
  created_at: Timestamp,
3977
4071
  updated_at: Timestamp
3978
4072
  });
3979
- var TopicCreate = z16.object({
4073
+ var TopicCreate = z17.object({
3980
4074
  slug: Slug,
3981
- name: z16.string().min(1).max(120),
3982
- description: z16.string().max(1e3).optional(),
4075
+ name: z17.string().min(1).max(120),
4076
+ description: z17.string().max(1e3).optional(),
3983
4077
  translations: Topic.shape.translations.optional()
3984
4078
  });
3985
4079
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
3986
- var Contact = z16.object({
4080
+ var Contact = z17.object({
3987
4081
  id: Id,
3988
- external_id: z16.string().min(1).max(255).nullable(),
4082
+ external_id: z17.string().min(1).max(255).nullable(),
3989
4083
  /** Stored lowercased, unique per workspace. */
3990
4084
  email: Email,
3991
- first_name: z16.string().max(200).nullable(),
3992
- last_name: z16.string().max(200).nullable(),
3993
- locale: z16.string().min(2).max(35).nullable(),
4085
+ first_name: z17.string().max(200).nullable(),
4086
+ last_name: z17.string().max(200).nullable(),
4087
+ locale: z17.string().min(2).max(35).nullable(),
3994
4088
  /**
3995
4089
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
3996
4090
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -3998,65 +4092,65 @@ var Contact = z16.object({
3998
4092
  */
3999
4093
  timezone: TimezoneName.nullable(),
4000
4094
  properties: Properties,
4001
- topics: z16.array(Slug),
4095
+ topics: z17.array(Slug),
4002
4096
  /** The slugs of the contact's tags (S4). */
4003
- tags: z16.array(Slug),
4097
+ tags: z17.array(Slug),
4004
4098
  created_at: Timestamp,
4005
4099
  updated_at: Timestamp
4006
4100
  });
4007
- var ContactUpsert = z16.object({
4008
- external_id: z16.string().min(1).max(255).optional(),
4101
+ var ContactUpsert = z17.object({
4102
+ external_id: z17.string().min(1).max(255).optional(),
4009
4103
  email: Email.optional(),
4010
- first_name: z16.string().max(200).nullable().optional(),
4011
- last_name: z16.string().max(200).nullable().optional(),
4012
- locale: z16.string().min(2).max(35).nullable().optional(),
4104
+ first_name: z17.string().max(200).nullable().optional(),
4105
+ last_name: z17.string().max(200).nullable().optional(),
4106
+ locale: z17.string().min(2).max(35).nullable().optional(),
4013
4107
  timezone: TimezoneName.nullable().optional(),
4014
4108
  properties: Properties.optional(),
4015
- topics: z16.array(Slug).max(100).optional()
4109
+ topics: z17.array(Slug).max(100).optional()
4016
4110
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
4017
4111
  message: "external_id or email is required",
4018
4112
  path: ["email"]
4019
4113
  });
4020
- var ContactUpsertResult = z16.object({
4114
+ var ContactUpsertResult = z17.object({
4021
4115
  contact: Contact,
4022
- created: z16.boolean()
4116
+ created: z17.boolean()
4023
4117
  });
4024
4118
  var ContactListQuery = PageQuery.extend({
4025
- email: z16.string().min(1).max(254).optional(),
4026
- external_id: z16.string().min(1).max(255).optional(),
4119
+ email: z17.string().min(1).max(254).optional(),
4120
+ external_id: z17.string().min(1).max(255).optional(),
4027
4121
  topic: Slug.optional()
4028
4122
  });
4029
- var ContactErased = z16.object({
4030
- ok: z16.literal(true),
4031
- erased_messages: z16.number().int().min(0),
4032
- erased_recipients: z16.number().int().min(0),
4033
- suppressions_kept: z16.number().int().min(0)
4123
+ var ContactErased = z17.object({
4124
+ ok: z17.literal(true),
4125
+ erased_messages: z17.number().int().min(0),
4126
+ erased_recipients: z17.number().int().min(0),
4127
+ suppressions_kept: z17.number().int().min(0)
4034
4128
  });
4035
4129
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
4036
- var SuppressionReason = z16.enum(SUPPRESSION_REASONS);
4037
- var Suppression = z16.object({
4130
+ var SuppressionReason = z17.enum(SUPPRESSION_REASONS);
4131
+ var Suppression = z17.object({
4038
4132
  id: Id,
4039
4133
  email: Email,
4040
4134
  reason: SuppressionReason,
4041
4135
  topic: Slug.nullable(),
4042
4136
  source_message_id: Id.nullable(),
4043
- note: z16.string().max(1e3).nullable(),
4137
+ note: z17.string().max(1e3).nullable(),
4044
4138
  created_at: Timestamp
4045
4139
  });
4046
- var SuppressionCreate = z16.object({
4140
+ var SuppressionCreate = z17.object({
4047
4141
  email: Email,
4048
- reason: z16.enum(["manual", "unsubscribed"]),
4142
+ reason: z17.enum(["manual", "unsubscribed"]),
4049
4143
  topic: Slug.nullable().optional(),
4050
- note: z16.string().max(1e3).optional()
4144
+ note: z17.string().max(1e3).optional()
4051
4145
  });
4052
4146
  var SuppressionListQuery = PageQuery.extend({
4053
- email: z16.string().min(1).max(254).optional(),
4147
+ email: z17.string().min(1).max(254).optional(),
4054
4148
  reason: SuppressionReason.optional(),
4055
4149
  topic: Slug.optional()
4056
4150
  });
4057
4151
 
4058
4152
  // src/webhooks.ts
4059
- import { z as z17 } from "zod";
4153
+ import { z as z18 } from "zod";
4060
4154
  var WEBHOOK_EVENT_TYPES = [
4061
4155
  "message.sent",
4062
4156
  "message.failed",
@@ -4100,23 +4194,23 @@ var WEBHOOK_EVENT_TYPES = [
4100
4194
  "template.updated",
4101
4195
  "template.deleted"
4102
4196
  ];
4103
- var WebhookEventType = z17.enum(WEBHOOK_EVENT_TYPES);
4104
- var MessageEventBase = z17.object({
4197
+ var WebhookEventType = z18.enum(WEBHOOK_EVENT_TYPES);
4198
+ var MessageEventBase = z18.object({
4105
4199
  message_id: Id,
4106
4200
  mailing_id: Id.nullable(),
4107
4201
  mailing_metadata: MailingMetadata.nullable(),
4108
4202
  recipient_id: Id.nullable(),
4109
4203
  contact_id: Id.nullable(),
4110
- external_id: z17.string().nullable(),
4204
+ external_id: z18.string().nullable(),
4111
4205
  email: Email,
4112
- subject: z17.string(),
4206
+ subject: z18.string(),
4113
4207
  topic: Slug.nullable(),
4114
- provider_message_id: z17.string().nullable(),
4115
- is_test: z17.boolean()
4208
+ provider_message_id: z18.string().nullable(),
4209
+ is_test: z18.boolean()
4116
4210
  });
4117
4211
  var MessageSentData = MessageEventBase.extend({
4118
4212
  /** The final HTML as sent, so the client can archive it beside its own records. */
4119
- html: z17.string(),
4213
+ html: z18.string(),
4120
4214
  sent_at: Timestamp,
4121
4215
  /**
4122
4216
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4127,20 +4221,20 @@ var MessageSentData = MessageEventBase.extend({
4127
4221
  insertions: InsertionChoices.nullish()
4128
4222
  });
4129
4223
  var MessageFailedData = MessageEventBase.extend({
4130
- error: z17.string(),
4224
+ error: z18.string(),
4131
4225
  /** False when the provider rejected permanently; the recipient will not be retried. */
4132
- retryable: z17.boolean(),
4226
+ retryable: z18.boolean(),
4133
4227
  failed_at: Timestamp
4134
4228
  });
4135
4229
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4136
- var ContactUnsubscribedData = z17.object({
4230
+ var ContactUnsubscribedData = z18.object({
4137
4231
  contact_id: Id.nullable(),
4138
- external_id: z17.string().nullable(),
4232
+ external_id: z18.string().nullable(),
4139
4233
  email: Email,
4140
4234
  /** The topic unsubscribed from; null means every topic. */
4141
4235
  topic: Slug.nullable(),
4142
4236
  mailing_id: Id.nullable(),
4143
- source: z17.enum(UNSUBSCRIBE_SOURCES),
4237
+ source: z18.enum(UNSUBSCRIBE_SOURCES),
4144
4238
  unsubscribed_at: Timestamp
4145
4239
  });
4146
4240
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4149,142 +4243,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4149
4243
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4150
4244
  * same address and mailing went out before); `topic` is null.
4151
4245
  */
4152
- source: z17.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4246
+ source: z18.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4153
4247
  resubscribed_at: Timestamp
4154
4248
  });
4155
- var ContactBouncedData = z17.object({
4249
+ var ContactBouncedData = z18.object({
4156
4250
  contact_id: Id.nullable(),
4157
- external_id: z17.string().nullable(),
4251
+ external_id: z18.string().nullable(),
4158
4252
  email: Email,
4159
4253
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4160
- reason: z17.enum(["bounced", "complained"]),
4254
+ reason: z18.enum(["bounced", "complained"]),
4161
4255
  message_id: Id.nullable(),
4162
- diagnostic: z17.string().nullable(),
4256
+ diagnostic: z18.string().nullable(),
4163
4257
  bounced_at: Timestamp
4164
4258
  });
4165
- var MailingFinishedData = z17.object({
4259
+ var MailingFinishedData = z18.object({
4166
4260
  mailing_id: Id,
4167
4261
  mailing_metadata: MailingMetadata,
4168
- status: z17.enum(["sent", "partially_failed", "cancelled"]),
4262
+ status: z18.enum(["sent", "partially_failed", "cancelled"]),
4169
4263
  counts: MailingCounts,
4170
4264
  finished_at: Timestamp
4171
4265
  });
4172
- var ContactSubscribedData = z17.object({
4266
+ var ContactSubscribedData = z18.object({
4173
4267
  contact_id: Id,
4174
- external_id: z17.string().nullable(),
4268
+ external_id: z18.string().nullable(),
4175
4269
  email: Email,
4176
- topics: z17.array(Slug),
4177
- source: z17.enum(["signup_form", "api", "dashboard", "automation"]),
4270
+ topics: z18.array(Slug),
4271
+ source: z18.enum(["signup_form", "api", "dashboard", "automation"]),
4178
4272
  signup_form_id: Id.nullable(),
4179
- signup_form_version: z17.number().int().min(1).nullable(),
4273
+ signup_form_version: z18.number().int().min(1).nullable(),
4180
4274
  subscribed_at: Timestamp
4181
4275
  });
4182
- var ImportFinishedData = z17.object({
4276
+ var ImportFinishedData = z18.object({
4183
4277
  import_id: Id,
4184
- status: z17.enum(["completed", "cancelled", "failed"]),
4278
+ status: z18.enum(["completed", "cancelled", "failed"]),
4185
4279
  result: ImportReport.nullable(),
4186
- error: z17.string().nullable(),
4280
+ error: z18.string().nullable(),
4187
4281
  finished_at: Timestamp
4188
4282
  });
4189
- var MailingScheduledData = z17.object({
4283
+ var MailingScheduledData = z18.object({
4190
4284
  mailing_id: Id,
4191
4285
  mailing_metadata: MailingMetadata,
4192
4286
  scheduled_at: Timestamp.nullable()
4193
4287
  });
4194
- var MailingStartedData = z17.object({
4288
+ var MailingStartedData = z18.object({
4195
4289
  mailing_id: Id,
4196
4290
  mailing_metadata: MailingMetadata,
4197
- trigger: z17.enum(["send", "schedule"]),
4198
- recipients: z17.number().int().min(0),
4291
+ trigger: z18.enum(["send", "schedule"]),
4292
+ recipients: z18.number().int().min(0),
4199
4293
  started_at: Timestamp
4200
4294
  });
4201
- var MailingScheduleFailedData = z17.object({
4295
+ var MailingScheduleFailedData = z18.object({
4202
4296
  mailing_id: Id,
4203
4297
  mailing_metadata: MailingMetadata,
4204
- code: z17.string(),
4205
- message: z17.string(),
4298
+ code: z18.string(),
4299
+ message: z18.string(),
4206
4300
  failed_at: Timestamp
4207
4301
  });
4208
- var MailingAbWinnerSelectedData = z17.object({
4302
+ var MailingAbWinnerSelectedData = z18.object({
4209
4303
  mailing_id: Id,
4210
4304
  mailing_metadata: MailingMetadata,
4211
- winner: z17.string(),
4212
- decided_by: z17.enum(["metric", "manual"]),
4213
- variants: z17.array(VariantAnalytics),
4305
+ winner: z18.string(),
4306
+ decided_by: z18.enum(["metric", "manual"]),
4307
+ variants: z18.array(VariantAnalytics),
4214
4308
  decided_at: Timestamp
4215
4309
  });
4216
- var ContactTaggedData = z17.object({
4310
+ var ContactTaggedData = z18.object({
4217
4311
  contact_id: Id,
4218
- external_id: z17.string().nullable(),
4312
+ external_id: z18.string().nullable(),
4219
4313
  email: Email,
4220
4314
  /** Only the tags the contact did not already have. */
4221
- tags: z17.array(Slug).min(1),
4222
- source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4315
+ tags: z18.array(Slug).min(1),
4316
+ source: z18.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4223
4317
  tagged_at: Timestamp
4224
4318
  });
4225
- var ContactUpdatedData = z17.object({
4319
+ var ContactUpdatedData = z18.object({
4226
4320
  contact_id: Id,
4227
- external_id: z17.string().nullable(),
4321
+ external_id: z18.string().nullable(),
4228
4322
  email: Email,
4229
- changed: z17.array(z17.string()).min(1),
4323
+ changed: z18.array(z18.string()).min(1),
4230
4324
  properties: Properties,
4231
- source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4325
+ source: z18.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4232
4326
  updated_at: Timestamp
4233
4327
  });
4234
- var AutomationRunEventBase = z17.object({
4328
+ var AutomationRunEventBase = z18.object({
4235
4329
  automation_id: Id,
4236
- automation_name: z17.string(),
4330
+ automation_name: z18.string(),
4237
4331
  run_id: Id,
4238
- version: z17.number().int().min(1),
4332
+ version: z18.number().int().min(1),
4239
4333
  contact_id: Id,
4240
- external_id: z17.string().nullable(),
4334
+ external_id: z18.string().nullable(),
4241
4335
  email: Email
4242
4336
  });
4243
4337
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4244
4338
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4245
- trigger_kind: z17.string(),
4339
+ trigger_kind: z18.string(),
4246
4340
  entered_at: Timestamp
4247
4341
  });
4248
4342
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4249
- last_step_id: z17.string().nullable(),
4343
+ last_step_id: z18.string().nullable(),
4250
4344
  completed_at: Timestamp
4251
4345
  });
4252
4346
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4253
4347
  reason: AutomationEndReason,
4254
- step_id: z17.string().nullable(),
4348
+ step_id: z18.string().nullable(),
4255
4349
  exited_at: Timestamp
4256
4350
  });
4257
4351
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4258
- reason: z17.string(),
4259
- step_id: z17.string().nullable(),
4352
+ reason: z18.string(),
4353
+ step_id: z18.string().nullable(),
4260
4354
  failed_at: Timestamp
4261
4355
  });
4262
4356
  var AutomationWebhookData = AutomationRunEventBase.extend({
4263
- step_id: z17.string(),
4357
+ step_id: z18.string(),
4264
4358
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4265
- step_label: z17.string().nullable(),
4359
+ step_label: z18.string().nullable(),
4266
4360
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4267
4361
  payload: JsonValue.nullable(),
4268
4362
  fired_at: Timestamp
4269
4363
  });
4270
- var TemplateEventBase = z17.object({
4364
+ var TemplateEventBase = z18.object({
4271
4365
  template_id: Id,
4272
- name: z17.string().min(1).max(200),
4273
- version: z17.number().int().min(1),
4274
- source: z17.enum(["api", "dashboard", "mjml_import"])
4366
+ name: z18.string().min(1).max(200),
4367
+ version: z18.number().int().min(1),
4368
+ source: z18.enum(["api", "dashboard", "mjml_import"])
4275
4369
  });
4276
4370
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4277
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z17.boolean(), updated_at: Timestamp });
4371
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z18.boolean(), updated_at: Timestamp });
4278
4372
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4279
- var envelope = (type, data) => z17.object({
4373
+ var envelope = (type, data) => z18.object({
4280
4374
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4281
4375
  id: Id,
4282
- type: z17.literal(type),
4376
+ type: z18.literal(type),
4283
4377
  created_at: Timestamp,
4284
4378
  workspace_id: Id,
4285
4379
  data
4286
4380
  });
4287
- var WebhookEvent = z17.discriminatedUnion("type", [
4381
+ var WebhookEvent = z18.discriminatedUnion("type", [
4288
4382
  envelope("message.sent", MessageSentData),
4289
4383
  envelope("message.failed", MessageFailedData),
4290
4384
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4308,16 +4402,16 @@ var WebhookEvent = z17.discriminatedUnion("type", [
4308
4402
  envelope("template.updated", TemplateUpdatedData),
4309
4403
  envelope("template.deleted", TemplateDeletedData)
4310
4404
  ]);
4311
- var WebhookEndpoint = z17.object({
4405
+ var WebhookEndpoint = z18.object({
4312
4406
  id: Id,
4313
- url: z17.string().url(),
4314
- description: z17.string().max(500).nullable(),
4315
- events: z17.array(WebhookEventType).min(1),
4316
- enabled: z17.boolean(),
4407
+ url: z18.string().url(),
4408
+ description: z18.string().max(500).nullable(),
4409
+ events: z18.array(WebhookEventType).min(1),
4410
+ enabled: z18.boolean(),
4317
4411
  created_at: Timestamp,
4318
4412
  updated_at: Timestamp
4319
4413
  });
4320
- var WebhookUrl = z17.string().url().refine((u) => {
4414
+ var WebhookUrl = z18.string().url().refine((u) => {
4321
4415
  try {
4322
4416
  const url = new URL(u);
4323
4417
  if (url.protocol === "https:") return true;
@@ -4326,35 +4420,35 @@ var WebhookUrl = z17.string().url().refine((u) => {
4326
4420
  return false;
4327
4421
  }
4328
4422
  }, "must be https (http only for localhost)");
4329
- var WebhookEndpointCreate = z17.object({
4423
+ var WebhookEndpointCreate = z18.object({
4330
4424
  url: WebhookUrl,
4331
- description: z17.string().max(500).optional(),
4332
- events: z17.array(WebhookEventType).min(1),
4333
- enabled: z17.boolean().optional()
4425
+ description: z18.string().max(500).optional(),
4426
+ events: z18.array(WebhookEventType).min(1),
4427
+ enabled: z18.boolean().optional()
4334
4428
  });
4335
- var WebhookEndpointUpdate = z17.object({
4429
+ var WebhookEndpointUpdate = z18.object({
4336
4430
  url: WebhookUrl,
4337
- description: z17.string().max(500).nullable(),
4338
- events: z17.array(WebhookEventType).min(1),
4339
- enabled: z17.boolean()
4431
+ description: z18.string().max(500).nullable(),
4432
+ events: z18.array(WebhookEventType).min(1),
4433
+ enabled: z18.boolean()
4340
4434
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4341
- var WebhookEndpointWithSecret = z17.object({
4435
+ var WebhookEndpointWithSecret = z18.object({
4342
4436
  endpoint: WebhookEndpoint,
4343
- secret: z17.string().min(32)
4437
+ secret: z18.string().min(32)
4344
4438
  });
4345
4439
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4346
- var WebhookDeliveryStatus = z17.enum(WEBHOOK_DELIVERY_STATUSES);
4440
+ var WebhookDeliveryStatus = z18.enum(WEBHOOK_DELIVERY_STATUSES);
4347
4441
  var WEBHOOK_MAX_ATTEMPTS = 8;
4348
4442
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4349
- var WebhookDelivery = z17.object({
4443
+ var WebhookDelivery = z18.object({
4350
4444
  id: Id,
4351
4445
  endpoint_id: Id,
4352
4446
  event_id: Id,
4353
4447
  event_type: WebhookEventType,
4354
4448
  status: WebhookDeliveryStatus,
4355
- attempts: z17.number().int().min(0),
4356
- last_status_code: z17.number().int().min(100).max(599).nullable(),
4357
- last_error: z17.string().nullable(),
4449
+ attempts: z18.number().int().min(0),
4450
+ last_status_code: z18.number().int().min(100).max(599).nullable(),
4451
+ last_error: z18.string().nullable(),
4358
4452
  next_attempt_at: Timestamp.nullable(),
4359
4453
  delivered_at: Timestamp.nullable(),
4360
4454
  created_at: Timestamp
@@ -4363,7 +4457,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4363
4457
  status: WebhookDeliveryStatus.optional(),
4364
4458
  event_type: WebhookEventType.optional()
4365
4459
  });
4366
- var WebhookDeliveryParams = z17.object({ id: Id, delivery_id: Id });
4460
+ var WebhookDeliveryParams = z18.object({ id: Id, delivery_id: Id });
4367
4461
 
4368
4462
  // src/webhook-signing.ts
4369
4463
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4430,99 +4524,99 @@ async function verifyWebhook(input) {
4430
4524
  }
4431
4525
 
4432
4526
  // src/billing.ts
4433
- import { z as z18 } from "zod";
4527
+ import { z as z19 } from "zod";
4434
4528
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4435
- var PlanId = z18.enum(PLAN_IDS);
4436
- var PlanLimits = z18.object({
4437
- monthly_messages: z18.number().int().min(0).nullable(),
4438
- contacts: z18.number().int().min(0).nullable(),
4439
- members: z18.number().int().min(1).nullable(),
4440
- providers: z18.number().int().min(1).nullable(),
4441
- webhook_endpoints: z18.number().int().min(0).nullable(),
4529
+ var PlanId = z19.enum(PLAN_IDS);
4530
+ var PlanLimits = z19.object({
4531
+ monthly_messages: z19.number().int().min(0).nullable(),
4532
+ contacts: z19.number().int().min(0).nullable(),
4533
+ members: z19.number().int().min(1).nullable(),
4534
+ providers: z19.number().int().min(1).nullable(),
4535
+ webhook_endpoints: z19.number().int().min(0).nullable(),
4442
4536
  /** Automations that may be live (active or paused) at once (A1). */
4443
- active_automations: z18.number().int().min(0).nullable(),
4537
+ active_automations: z19.number().int().min(0).nullable(),
4444
4538
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4445
- automation_steps: z18.number().int().min(1).nullable(),
4539
+ automation_steps: z19.number().int().min(1).nullable(),
4446
4540
  /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4447
- sending_domains: z18.number().int().min(0).nullable()
4541
+ sending_domains: z19.number().int().min(0).nullable()
4448
4542
  });
4449
- var PlanFeatures = z18.object({
4543
+ var PlanFeatures = z19.object({
4450
4544
  /** A/B tests of subject and content on a mailing (S4). */
4451
- ab_testing: z18.boolean(),
4545
+ ab_testing: z19.boolean(),
4452
4546
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4453
- tracking: z18.boolean(),
4547
+ tracking: z19.boolean(),
4454
4548
  /** Automations: flows a person walks through step by step (A1). */
4455
- automations: z18.boolean()
4549
+ automations: z19.boolean()
4456
4550
  });
4457
4551
  var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4458
- var Plan = z18.object({
4552
+ var Plan = z19.object({
4459
4553
  id: PlanId,
4460
- name: z18.string().min(1),
4554
+ name: z19.string().min(1),
4461
4555
  /** Price in the smallest currency unit per month; null for plans not sold. */
4462
- monthly_price_cents: z18.number().int().min(0).nullable(),
4463
- currency: z18.string().length(3),
4556
+ monthly_price_cents: z19.number().int().min(0).nullable(),
4557
+ currency: z19.string().length(3),
4464
4558
  limits: PlanLimits,
4465
4559
  features: PlanFeatures
4466
4560
  });
4467
- var CatalogPlan = Plan.extend({ sellable: z18.boolean() });
4468
- var Subscription = z18.object({
4561
+ var CatalogPlan = Plan.extend({ sellable: z19.boolean() });
4562
+ var Subscription = z19.object({
4469
4563
  workspace_id: Id,
4470
4564
  plan: PlanId,
4471
- status: z18.enum(["active", "trialing", "past_due", "cancelled"]),
4565
+ status: z19.enum(["active", "trialing", "past_due", "cancelled"]),
4472
4566
  current_period_start: Timestamp,
4473
4567
  current_period_end: Timestamp,
4474
- cancel_at_period_end: z18.boolean(),
4568
+ cancel_at_period_end: z19.boolean(),
4475
4569
  /**
4476
4570
  * A design partner outside billing (plan `design_partner`, no limits, no
4477
4571
  * checkout). Set only by an operator, never through the API.
4478
4572
  */
4479
- billing_exempt: z18.boolean(),
4573
+ billing_exempt: z19.boolean(),
4480
4574
  /**
4481
4575
  * Own sending domains bought on top of the plan's included ones (the
4482
4576
  * add-on), each a monthly charge on the same subscription. 0 without the
4483
4577
  * add-on; the usage limit `sending_domains` is the plan's plus these.
4484
4578
  */
4485
- extra_sending_domains: z18.number().int().min(0)
4579
+ extra_sending_domains: z19.number().int().min(0)
4486
4580
  });
4487
- var BillingAddons = z18.object({
4488
- sending_domain: z18.object({
4489
- monthly_price_cents: z18.number().int().min(0),
4490
- currency: z18.string().length(3),
4491
- sellable: z18.boolean()
4581
+ var BillingAddons = z19.object({
4582
+ sending_domain: z19.object({
4583
+ monthly_price_cents: z19.number().int().min(0),
4584
+ currency: z19.string().length(3),
4585
+ sellable: z19.boolean()
4492
4586
  })
4493
4587
  });
4494
4588
  var MAX_EXTRA_SENDING_DOMAINS = 100;
4495
- var ExtraSendingDomainsUpdate = z18.object({ quantity: z18.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4589
+ var ExtraSendingDomainsUpdate = z19.object({ quantity: z19.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4496
4590
  var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4497
- var UsageMetric = z18.enum(USAGE_METRICS);
4591
+ var UsageMetric = z19.enum(USAGE_METRICS);
4498
4592
  var USAGE_WARNING_RATIO = 0.8;
4499
- var UsageWarning = z18.object({
4593
+ var UsageWarning = z19.object({
4500
4594
  metric: UsageMetric,
4501
- used: z18.number().int().min(0),
4502
- limit: z18.number().int().min(0),
4595
+ used: z19.number().int().min(0),
4596
+ limit: z19.number().int().min(0),
4503
4597
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4504
- level: z18.enum(["approaching", "reached"])
4598
+ level: z19.enum(["approaching", "reached"])
4505
4599
  });
4506
- var TermsStatus = z18.object({ accepted_version: z18.string().nullable(), current_version: z18.string() });
4507
- var Usage = z18.object({
4600
+ var TermsStatus = z19.object({ accepted_version: z19.string().nullable(), current_version: z19.string() });
4601
+ var Usage = z19.object({
4508
4602
  plan: PlanId,
4509
4603
  period_start: Timestamp,
4510
4604
  period_end: Timestamp,
4511
- metrics: z18.record(UsageMetric, z18.object({ used: z18.number().int().min(0), limit: z18.number().int().min(0).nullable() })),
4512
- warnings: z18.array(UsageWarning),
4605
+ metrics: z19.record(UsageMetric, z19.object({ used: z19.number().int().min(0), limit: z19.number().int().min(0).nullable() })),
4606
+ warnings: z19.array(UsageWarning),
4513
4607
  terms: TermsStatus
4514
4608
  });
4515
- var TermsAcceptance = z18.object({ accept_terms: AcceptTerms });
4516
- var CheckoutRequest = z18.object({
4517
- plan: z18.enum(["starter", "growth"]),
4518
- success_url: z18.string().url(),
4519
- cancel_url: z18.string().url(),
4609
+ var TermsAcceptance = z19.object({ accept_terms: AcceptTerms });
4610
+ var CheckoutRequest = z19.object({
4611
+ plan: z19.enum(["starter", "growth"]),
4612
+ success_url: z19.string().url(),
4613
+ cancel_url: z19.string().url(),
4520
4614
  /** The buyer accepted the terms of service and the processing agreement of this version. */
4521
4615
  accept_terms: AcceptTerms
4522
4616
  });
4523
- var CheckoutSession = z18.object({ url: z18.string().url() });
4524
- var PortalRequest = z18.object({ return_url: z18.string().url() });
4525
- var PortalSession = z18.object({ url: z18.string().url() });
4617
+ var CheckoutSession = z19.object({ url: z19.string().url() });
4618
+ var PortalRequest = z19.object({ return_url: z19.string().url() });
4619
+ var PortalSession = z19.object({ url: z19.string().url() });
4526
4620
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4527
4621
  function formatUsageWarningHeader(warnings) {
4528
4622
  if (warnings.length === 0) return null;
@@ -4542,7 +4636,7 @@ function parseUsageWarningHeader(value) {
4542
4636
  }
4543
4637
 
4544
4638
  // src/routes.ts
4545
- import { z as z19 } from "zod";
4639
+ import { z as z20 } from "zod";
4546
4640
  var list = (item) => page(item);
4547
4641
  var foundationRoutes = {
4548
4642
  "workspaces.create": {
@@ -4788,7 +4882,7 @@ var templateRoutes = {
4788
4882
  path: "/v1/templates/:id/export",
4789
4883
  params: IdParams,
4790
4884
  query: TemplateExportQuery,
4791
- response: z19.string(),
4885
+ response: z20.string(),
4792
4886
  responseType: "text",
4793
4887
  status: 200,
4794
4888
  access: "read",
@@ -5168,7 +5262,7 @@ var sendingRoutes = {
5168
5262
  path: "/v1/mailings/:id/export",
5169
5263
  params: IdParams,
5170
5264
  query: MailingExportQuery,
5171
- response: z19.string(),
5265
+ response: z20.string(),
5172
5266
  responseType: "text",
5173
5267
  status: 200,
5174
5268
  access: "read",
@@ -5435,7 +5529,7 @@ var platformRoutes = {
5435
5529
  "contactProperties.list": {
5436
5530
  method: "GET",
5437
5531
  path: "/v1/contact-properties",
5438
- response: z19.object({ data: z19.array(ContactPropertyDefinition) }),
5532
+ response: z20.object({ data: z20.array(ContactPropertyDefinition) }),
5439
5533
  status: 200,
5440
5534
  access: "read",
5441
5535
  phase: "S4"
@@ -5734,7 +5828,7 @@ var billingRoutes = {
5734
5828
  "billing.plans": {
5735
5829
  method: "GET",
5736
5830
  path: "/v1/billing/plans",
5737
- response: z19.object({ data: z19.array(CatalogPlan), addons: BillingAddons }),
5831
+ response: z20.object({ data: z20.array(CatalogPlan), addons: BillingAddons }),
5738
5832
  status: 200,
5739
5833
  access: "read",
5740
5834
  phase: "S5"
@@ -5785,6 +5879,44 @@ var billingRoutes = {
5785
5879
  phase: "S5"
5786
5880
  }
5787
5881
  };
5882
+ var domainBuyingRoutes = {
5883
+ "domains.search": {
5884
+ method: "GET",
5885
+ path: "/v1/domains/search",
5886
+ query: DomainSearchQuery,
5887
+ response: DomainSearchResult,
5888
+ status: 200,
5889
+ access: "admin",
5890
+ phase: "S5"
5891
+ },
5892
+ "domainOrders.create": {
5893
+ method: "POST",
5894
+ path: "/v1/domain-orders",
5895
+ body: DomainOrderCreate,
5896
+ response: DomainOrder,
5897
+ status: 201,
5898
+ access: "admin",
5899
+ phase: "S5"
5900
+ },
5901
+ "domainOrders.list": {
5902
+ method: "GET",
5903
+ path: "/v1/domain-orders",
5904
+ query: PageQuery,
5905
+ response: list(DomainOrder),
5906
+ status: 200,
5907
+ access: "admin",
5908
+ phase: "S5"
5909
+ },
5910
+ "domainOrders.get": {
5911
+ method: "GET",
5912
+ path: "/v1/domain-orders/:id",
5913
+ params: IdParams,
5914
+ response: DomainOrder,
5915
+ status: 200,
5916
+ access: "admin",
5917
+ phase: "S5"
5918
+ }
5919
+ };
5788
5920
  var inviteRoutes = {
5789
5921
  "invites.create": {
5790
5922
  method: "POST",
@@ -5894,7 +6026,7 @@ var automationRoutes = {
5894
6026
  method: "POST",
5895
6027
  path: "/v1/automations/:id/pause",
5896
6028
  params: IdParams,
5897
- body: z19.object({}).strict(),
6029
+ body: z20.object({}).strict(),
5898
6030
  response: Automation,
5899
6031
  status: 200,
5900
6032
  access: "write",
@@ -5904,7 +6036,7 @@ var automationRoutes = {
5904
6036
  method: "POST",
5905
6037
  path: "/v1/automations/:id/resume",
5906
6038
  params: IdParams,
5907
- body: z19.object({}).strict(),
6039
+ body: z20.object({}).strict(),
5908
6040
  response: Automation,
5909
6041
  status: 200,
5910
6042
  access: "write",
@@ -5914,7 +6046,7 @@ var automationRoutes = {
5914
6046
  method: "POST",
5915
6047
  path: "/v1/automations/:id/archive",
5916
6048
  params: IdParams,
5917
- body: z19.object({}).strict(),
6049
+ body: z20.object({}).strict(),
5918
6050
  response: Automation,
5919
6051
  status: 200,
5920
6052
  access: "write",
@@ -6029,10 +6161,13 @@ var routes = {
6029
6161
  ...inviteRoutes,
6030
6162
  ...platformRoutes,
6031
6163
  ...billingRoutes,
6164
+ ...domainBuyingRoutes,
6032
6165
  ...automationRoutes
6033
6166
  };
6034
6167
  var TRUSTED_APP_OPERATIONS = {
6035
- booking: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"]
6168
+ booking: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"],
6169
+ // The shop's receipt email needs exactly what connecting a booking page needs.
6170
+ sites: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"]
6036
6171
  };
6037
6172
  function trustedAppMayCall(app, id) {
6038
6173
  return TRUSTED_APP_OPERATIONS[app].includes(id);
@@ -6193,10 +6328,24 @@ export {
6193
6328
  DEFAULT_INVITE_TTL_DAYS,
6194
6329
  DEFAULT_PAGE_LIMIT,
6195
6330
  DOCUMENT_SCHEMA_VERSIONS,
6331
+ DOMAIN_BUYING_BLOCKS,
6332
+ DOMAIN_BUYING_NOT_CONFIGURED_REASON,
6333
+ DOMAIN_ORDER_STATES,
6334
+ DOMAIN_PRICE_CHANGED_REASON,
6335
+ DOMAIN_UNAVAILABLE_REASONS,
6196
6336
  DateOnly,
6197
6337
  DatePassedAnswer,
6198
6338
  DelayStep,
6199
6339
  DocumentSchemaVersion,
6340
+ DomainBuyingBlock,
6341
+ DomainOffer,
6342
+ DomainOrder,
6343
+ DomainOrderCreate,
6344
+ DomainOrderState,
6345
+ DomainRegistrant,
6346
+ DomainSearchQuery,
6347
+ DomainSearchResult,
6348
+ DomainUnavailableReason,
6200
6349
  EDITABLE_MAILING_STATUSES,
6201
6350
  ERROR_CODES,
6202
6351
  ERROR_STATUS,
@@ -6280,6 +6429,7 @@ export {
6280
6429
  MAX_ASSET_BYTES,
6281
6430
  MAX_DELAY_SECONDS,
6282
6431
  MAX_DOCUMENT_BYTES,
6432
+ MAX_DOMAIN_ORDERS_PER_DAY,
6283
6433
  MAX_ENGAGEMENT_DAYS,
6284
6434
  MAX_EXPORT_WARNINGS_HEADER_LENGTH,
6285
6435
  MAX_EXTRA_SENDING_DOMAINS,
@@ -6590,6 +6740,7 @@ export {
6590
6740
  demoteForSave,
6591
6741
  demotedBySave,
6592
6742
  describeMissingTexts,
6743
+ domainBuyingRoutes,
6593
6744
  draftDocument,
6594
6745
  draftInsertionProblems,
6595
6746
  draftsDirty,