@itm-studio/partner-sdk 0.2.0 → 0.2.2

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/README.md CHANGED
@@ -64,6 +64,31 @@ Get your partner API token from the ITM backstage dashboard: **Settings > Partne
64
64
 
65
65
  The token is sent as the `x-partner-api-key` header on every request. Your brand is determined automatically from the token — no need to pass brand IDs.
66
66
 
67
+ Keep the partner token on your server. Do not expose it from browser code or client-side mobile code.
68
+
69
+ For request-scoped mutations such as partner brand subscriptions, create the client inside the incoming request and forward `x-forwarded-for` and `user-agent` so the backend can enrich compliance metadata when those fields are omitted from `input.compliance`.
70
+
71
+ ```typescript
72
+ import { createITMPartnerClient } from '@itm-studio/partner-sdk';
73
+
74
+ export function createITMClientForRequest(request: Request) {
75
+ return createITMPartnerClient({
76
+ token: process.env.ITM_PARTNER_TOKEN!,
77
+ headers: () => {
78
+ const forwardedFor = request.headers.get('x-forwarded-for');
79
+ const userAgent = request.headers.get('user-agent');
80
+
81
+ return {
82
+ ...(forwardedFor ? { 'x-forwarded-for': forwardedFor } : {}),
83
+ ...(userAgent ? { 'user-agent': userAgent } : {}),
84
+ };
85
+ },
86
+ });
87
+ }
88
+ ```
89
+
90
+ If you also send `input.compliance`, the backend keeps the values you provide and backfills missing `ipAddress` and `userAgent` from the forwarded headers when available.
91
+
67
92
  ## Available Queries
68
93
 
69
94
  ### `getPartnerMomentsForBrand`
@@ -114,6 +139,29 @@ const { getPartnerMoment } = await itm.query({
114
139
  });
115
140
  ```
116
141
 
142
+ ### `getMomentStats`
143
+
144
+ Get cached partner-facing counts for a moment owned by the authenticated partner's brand.
145
+
146
+ - `ticketsCount` counts confirmed tickets only.
147
+ - `waitlistCount` counts active waitlist entries.
148
+ - `externalRsvpCount` counts external RSVPs.
149
+ - `ticketRsvpRequestsCount` counts ticket RSVP requests.
150
+
151
+ ```typescript
152
+ const { getMomentStats } = await itm.query({
153
+ getMomentStats: {
154
+ __args: { momentSlug: 'my-event-slug' },
155
+ ticketsCount: true,
156
+ waitlistCount: true,
157
+ externalRsvpCount: true,
158
+ ticketRsvpRequestsCount: true,
159
+ },
160
+ });
161
+ ```
162
+
163
+ > **Note:** `getMomentStats` returns `null` if the moment does not exist or is not owned by the authenticated partner's brand.
164
+
117
165
  ### `getPartnerTicketsForMoment`
118
166
 
119
167
  Get paginated tickets for a moment.
@@ -295,6 +343,241 @@ const { getPartnerPublicEchoes } = await itm.query({
295
343
 
296
344
  The SDK supports write operations via `client.mutation()`. All mutations use the same authentication — your brand is determined from the token.
297
345
 
346
+ ## Partner Brand Subscription Guide
347
+
348
+ The partner brand subscription API supports two integration modes:
349
+
350
+ - Direct subscribe: create the subscription immediately in one mutation.
351
+ - OTP subscribe: send an SMS code first, then confirm with a second mutation.
352
+
353
+ Use direct subscribe when your product already has the right consent flow and you do not need to prove possession of the phone number in real time.
354
+
355
+ Use OTP subscribe when you want the user to confirm the phone number before the brand subscription is created.
356
+
357
+ ### Flow Summary
358
+
359
+ | Mode | First mutation | First response | Second mutation |
360
+ |---|---|---|---|
361
+ | Direct | `createPartnerBrandSubscription` with `requireOtpVerification: false` or omitted | `verificationRequired: false` and `subscription` populated | None |
362
+ | OTP | `createPartnerBrandSubscription` with `requireOtpVerification: true` | `verificationRequired: true`, `verificationToken`, `subscription: null` | `verifyPartnerBrandSubscription` |
363
+
364
+ ### Input Behavior
365
+
366
+ - `phoneNumber`: send an E.164 phone number such as `+14155551234`.
367
+ - `fullName`: optional, but if you send it, include both first and last name.
368
+ - `email`: optional and attached to the subscribed user if provided.
369
+ - `listNames`: optional brand list names. Missing lists are created automatically and the subscribed user is attached to them.
370
+ - `compliance`: optional metadata about how consent was collected. This is the right place for fields like `pageUrl`, `submissionMethod`, `submittedAt`, `timezone`, and geo/browser/device details.
371
+ - `compliance.ipAddress` and `compliance.userAgent`: optional. If you omit them and forward `x-forwarded-for` and `user-agent`, the backend backfills those values for you.
372
+
373
+ ### OTP Flow Step By Step
374
+
375
+ 1. Call `createPartnerBrandSubscription` with `requireOtpVerification: true`.
376
+ 2. Store the returned `verificationToken` in the user session or another short-lived server-side state container associated with the current signup attempt.
377
+ 3. Collect the SMS code from the user.
378
+ 4. Call `verifyPartnerBrandSubscription` with that `verificationToken` and `code`.
379
+
380
+ `verificationToken` is brand-scoped. A token created under one partner token cannot be verified by another brand's partner token.
381
+
382
+ If the verification token is invalid or expired, verification fails and the subscription is not created.
383
+
384
+ ### `createPartnerBrandSubscription`
385
+
386
+ Subscribe a phone number to the authenticated partner brand.
387
+
388
+ - Omit `requireOtpVerification` or set it to `false` to create the subscription immediately.
389
+ - Set `requireOtpVerification: true` to start the OTP flow. The backend sends the code to the provided phone number and returns a `verificationToken`.
390
+ - If you pass `fullName`, include both first and last name.
391
+
392
+ ```typescript
393
+ const { createPartnerBrandSubscription } = await itm.mutation({
394
+ createPartnerBrandSubscription: {
395
+ __args: {
396
+ input: {
397
+ phoneNumber: '+14155550111',
398
+ fullName: 'Jane Doe',
399
+ email: 'jane@example.com',
400
+ listNames: ['VIP', 'Newsletter'],
401
+ compliance: {
402
+ pageUrl: 'https://example.com/signup',
403
+ submissionMethod: 'partner_sdk',
404
+ },
405
+ },
406
+ },
407
+ verificationRequired: true,
408
+ verificationToken: true,
409
+ subscription: {
410
+ uid: true,
411
+ isActive: true,
412
+ subscribedAt: true,
413
+ },
414
+ },
415
+ });
416
+
417
+ if (!createPartnerBrandSubscription.verificationRequired) {
418
+ console.log(createPartnerBrandSubscription.subscription?.uid);
419
+ }
420
+ ```
421
+
422
+ When `verificationRequired` is `false`, `subscription` is populated and `verificationToken` is `null`.
423
+
424
+ This is the recommended mode when:
425
+
426
+ - You are subscribing from an already-authenticated server flow.
427
+ - You already have consent and do not need phone possession verification.
428
+ - You want a single network round trip.
429
+
430
+ ### `verifyPartnerBrandSubscription`
431
+
432
+ Complete a subscription created with `requireOtpVerification: true`.
433
+
434
+ ```typescript
435
+ const { createPartnerBrandSubscription } = await itm.mutation({
436
+ createPartnerBrandSubscription: {
437
+ __args: {
438
+ input: {
439
+ phoneNumber: '+14155550112',
440
+ requireOtpVerification: true,
441
+ fullName: 'Otp User',
442
+ compliance: {
443
+ pageUrl: 'https://example.com/otp-signup',
444
+ submissionMethod: 'partner_sdk',
445
+ },
446
+ },
447
+ },
448
+ verificationRequired: true,
449
+ verificationToken: true,
450
+ },
451
+ });
452
+
453
+ if (!createPartnerBrandSubscription.verificationToken) {
454
+ throw new Error('Expected OTP verification to be required');
455
+ }
456
+
457
+ // Collect the SMS code from the user in your UI or API flow.
458
+ const code = '123456';
459
+
460
+ const { verifyPartnerBrandSubscription } = await itm.mutation({
461
+ verifyPartnerBrandSubscription: {
462
+ __args: {
463
+ input: {
464
+ verificationToken:
465
+ createPartnerBrandSubscription.verificationToken,
466
+ code,
467
+ },
468
+ },
469
+ uid: true,
470
+ isActive: true,
471
+ subscribedAt: true,
472
+ },
473
+ });
474
+
475
+ console.log(verifyPartnerBrandSubscription.uid);
476
+ ```
477
+
478
+ When OTP is required, `createPartnerBrandSubscription` returns `verificationRequired: true`, `subscription: null`, and a non-null `verificationToken`. Pass that token into `verifyPartnerBrandSubscription` together with the one-time code sent to the phone number.
479
+
480
+ This is the recommended mode when:
481
+
482
+ - The subscription starts from a public signup form.
483
+ - You want to prove the user controls the submitted phone number.
484
+ - Your compliance flow requires explicit OTP confirmation before the subscription is created.
485
+
486
+ ### Full OTP Example
487
+
488
+ This is the full two-step flow most integrators will want to implement from a server route or server action.
489
+
490
+ ```typescript
491
+ import { createITMPartnerClient } from '@itm-studio/partner-sdk';
492
+
493
+ function createRequestScopedITM(request: Request) {
494
+ return createITMPartnerClient({
495
+ token: process.env.ITM_PARTNER_TOKEN!,
496
+ headers: () => ({
497
+ ...(request.headers.get('x-forwarded-for')
498
+ ? { 'x-forwarded-for': request.headers.get('x-forwarded-for')! }
499
+ : {}),
500
+ ...(request.headers.get('user-agent')
501
+ ? { 'user-agent': request.headers.get('user-agent')! }
502
+ : {}),
503
+ }),
504
+ });
505
+ }
506
+
507
+ export async function startOtpSubscription(request: Request) {
508
+ const itm = createRequestScopedITM(request);
509
+
510
+ const { createPartnerBrandSubscription } = await itm.mutation({
511
+ createPartnerBrandSubscription: {
512
+ __args: {
513
+ input: {
514
+ phoneNumber: '+14155550112',
515
+ requireOtpVerification: true,
516
+ fullName: 'Otp User',
517
+ email: 'otp@example.com',
518
+ listNames: ['Members', 'SMS'],
519
+ compliance: {
520
+ pageUrl: 'https://example.com/join',
521
+ submissionMethod: 'partner_sdk',
522
+ submittedAt: new Date().toISOString(),
523
+ timezone: 'America/New_York',
524
+ },
525
+ },
526
+ },
527
+ verificationRequired: true,
528
+ verificationToken: true,
529
+ subscription: {
530
+ uid: true,
531
+ },
532
+ },
533
+ });
534
+
535
+ if (!createPartnerBrandSubscription.verificationRequired) {
536
+ return {
537
+ status: 'subscribed',
538
+ subscriptionUid: createPartnerBrandSubscription.subscription?.uid ?? null,
539
+ };
540
+ }
541
+
542
+ return {
543
+ status: 'otp_required',
544
+ verificationToken: createPartnerBrandSubscription.verificationToken,
545
+ };
546
+ }
547
+
548
+ export async function finishOtpSubscription(
549
+ request: Request,
550
+ verificationToken: string,
551
+ code: string,
552
+ ) {
553
+ const itm = createRequestScopedITM(request);
554
+
555
+ const { verifyPartnerBrandSubscription } = await itm.mutation({
556
+ verifyPartnerBrandSubscription: {
557
+ __args: {
558
+ input: {
559
+ verificationToken,
560
+ code,
561
+ },
562
+ },
563
+ uid: true,
564
+ isActive: true,
565
+ subscribedAt: true,
566
+ },
567
+ });
568
+
569
+ return verifyPartnerBrandSubscription;
570
+ }
571
+ ```
572
+
573
+ ### Common Integration Notes
574
+
575
+ - Create the ITM client inside the incoming request when you need compliance backfill from headers.
576
+ - Persist the OTP `verificationToken` only for the duration of the signup flow. Treat it as short-lived state, not a durable identifier.
577
+ - Do not attempt to verify an OTP token with a different partner token than the one that created it.
578
+ - If you are building a browser form, post to your own backend first, then have your backend call the ITM Partner SDK. Do not call the SDK directly from the browser.
579
+ - If you need to associate the user with CRM-style segments on subscribe, send `listNames` during the initial create call. Those lists are created on demand.
580
+
298
581
  ### Media Upload Flow
299
582
 
300
583
  Uploading media (e.g. cover images) is a two-step process:
package/dist/index.d.mts CHANGED
@@ -162,6 +162,13 @@ interface PartnerCustomer {
162
162
  tickets: Ticket[];
163
163
  __typename: 'PartnerCustomer';
164
164
  }
165
+ interface PartnerMomentStats {
166
+ ticketsCount: Scalars['Int'];
167
+ waitlistCount: Scalars['Int'];
168
+ externalRsvpCount: Scalars['Int'];
169
+ ticketRsvpRequestsCount: Scalars['Int'];
170
+ __typename: 'PartnerMomentStats';
171
+ }
165
172
  interface MomentCollectionLink {
166
173
  uid: Scalars['ID'];
167
174
  url: Scalars['String'];
@@ -260,11 +267,24 @@ interface GetBrandEchoesForUserResponse {
260
267
  nextCursor: (Scalars['String'] | null);
261
268
  __typename: 'GetBrandEchoesForUserResponse';
262
269
  }
270
+ interface BrandSubscription {
271
+ uid: Scalars['ID'];
272
+ isActive: Scalars['Boolean'];
273
+ subscribedAt: Scalars['DateTime'];
274
+ createdAt: Scalars['DateTime'];
275
+ updatedAt: Scalars['DateTime'];
276
+ __typename: 'BrandSubscription';
277
+ }
263
278
  interface Query {
264
279
  /** Get paginated moments for the brand associated with the partner token. */
265
280
  getPartnerMomentsForBrand: GetPublicMomentsResponse;
266
281
  /** Get a single moment by slug. */
267
282
  getPartnerMoment: (Moment | null);
283
+ /**
284
+ * Get cached partner-facing counts for a moment.
285
+ * Only returns stats for moments owned by the authenticated partner's brand.
286
+ */
287
+ getPartnerMomentStats: (PartnerMomentStats | null);
268
288
  /** Get paginated tickets for a moment. */
269
289
  getPartnerTicketsForMoment: GetTicketsResponse;
270
290
  /**
@@ -315,6 +335,12 @@ interface MediaAsset {
315
335
  updatedAt: Scalars['DateTime'];
316
336
  __typename: 'MediaAsset';
317
337
  }
338
+ interface CreatePartnerBrandSubscriptionResponse {
339
+ subscription: (BrandSubscription | null);
340
+ verificationRequired: Scalars['Boolean'];
341
+ verificationToken: (Scalars['String'] | null);
342
+ __typename: 'CreatePartnerBrandSubscriptionResponse';
343
+ }
318
344
  interface Mutation {
319
345
  /**
320
346
  * Get a presigned S3 URL for direct file upload.
@@ -326,11 +352,18 @@ interface Mutation {
326
352
  * Call after uploading to S3 via the presigned URL from getPartnerUploadUrl.
327
353
  */
328
354
  createPartnerMediaAsset: MediaAsset;
355
+ /**
356
+ * Subscribe a user to the authenticated partner brand.
357
+ * Set requireOtpVerification to true to start a two-step OTP flow.
358
+ */
359
+ createPartnerBrandSubscription: CreatePartnerBrandSubscriptionResponse;
329
360
  /**
330
361
  * Create a moment with optional venue and ticket tiers in one atomic operation.
331
362
  * When type is IRL, the venue field is required.
332
363
  */
333
364
  createPartnerMoment: Moment;
365
+ /** Complete a partner brand subscription that was created with requireOtpVerification=true. */
366
+ verifyPartnerBrandSubscription: BrandSubscription;
334
367
  __typename: 'Mutation';
335
368
  }
336
369
  interface CurrencyGenqlSelection {
@@ -484,6 +517,14 @@ interface PartnerCustomerGenqlSelection {
484
517
  __typename?: boolean | number;
485
518
  __scalar?: boolean | number;
486
519
  }
520
+ interface PartnerMomentStatsGenqlSelection {
521
+ ticketsCount?: boolean | number;
522
+ waitlistCount?: boolean | number;
523
+ externalRsvpCount?: boolean | number;
524
+ ticketRsvpRequestsCount?: boolean | number;
525
+ __typename?: boolean | number;
526
+ __scalar?: boolean | number;
527
+ }
487
528
  interface MomentCollectionLinkGenqlSelection {
488
529
  uid?: boolean | number;
489
530
  url?: boolean | number;
@@ -595,6 +636,15 @@ interface GetBrandEchoesForUserResponseGenqlSelection {
595
636
  __typename?: boolean | number;
596
637
  __scalar?: boolean | number;
597
638
  }
639
+ interface BrandSubscriptionGenqlSelection {
640
+ uid?: boolean | number;
641
+ isActive?: boolean | number;
642
+ subscribedAt?: boolean | number;
643
+ createdAt?: boolean | number;
644
+ updatedAt?: boolean | number;
645
+ __typename?: boolean | number;
646
+ __scalar?: boolean | number;
647
+ }
598
648
  interface QueryGenqlSelection {
599
649
  /** Get paginated moments for the brand associated with the partner token. */
600
650
  getPartnerMomentsForBrand?: (GetPublicMomentsResponseGenqlSelection & {
@@ -613,6 +663,15 @@ interface QueryGenqlSelection {
613
663
  slug: Scalars['String'];
614
664
  };
615
665
  });
666
+ /**
667
+ * Get cached partner-facing counts for a moment.
668
+ * Only returns stats for moments owned by the authenticated partner's brand.
669
+ */
670
+ getPartnerMomentStats?: (PartnerMomentStatsGenqlSelection & {
671
+ __args: {
672
+ momentSlug: Scalars['String'];
673
+ };
674
+ });
616
675
  /** Get paginated tickets for a moment. */
617
676
  getPartnerTicketsForMoment?: (GetTicketsResponseGenqlSelection & {
618
677
  __args: {
@@ -713,6 +772,44 @@ interface CreatePartnerMomentInput {
713
772
  /** Ticket tiers to create along with the moment. */
714
773
  ticketTiers?: (CreatePartnerTicketTierInput[] | null);
715
774
  }
775
+ interface SubscriptionComplianceInput {
776
+ browserName?: (Scalars['String'] | null);
777
+ browserVersion?: (Scalars['String'] | null);
778
+ deviceType?: (Scalars['String'] | null);
779
+ geoAccuracy?: (Scalars['Float'] | null);
780
+ geoCity?: (Scalars['String'] | null);
781
+ geoCountry?: (Scalars['String'] | null);
782
+ geoLatitude?: (Scalars['Float'] | null);
783
+ geoLongitude?: (Scalars['Float'] | null);
784
+ geoRegion?: (Scalars['String'] | null);
785
+ ipAddress?: (Scalars['String'] | null);
786
+ language?: (Scalars['String'] | null);
787
+ osName?: (Scalars['String'] | null);
788
+ osVersion?: (Scalars['String'] | null);
789
+ pageUrl?: (Scalars['String'] | null);
790
+ referrerUrl?: (Scalars['String'] | null);
791
+ screenHeight?: (Scalars['Int'] | null);
792
+ screenWidth?: (Scalars['Int'] | null);
793
+ submissionMethod?: (Scalars['String'] | null);
794
+ submittedAt?: (Scalars['DateTime'] | null);
795
+ timezone?: (Scalars['String'] | null);
796
+ userAgent?: (Scalars['String'] | null);
797
+ }
798
+ interface CreatePartnerBrandSubscriptionInput {
799
+ compliance?: (SubscriptionComplianceInput | null);
800
+ email?: (Scalars['String'] | null);
801
+ /** Optional full name. If provided, include first and last name. */
802
+ fullName?: (Scalars['String'] | null);
803
+ /** Optional brand list names to attach the subscribed user to. Missing lists are created automatically. */
804
+ listNames?: (Scalars['String'][] | null);
805
+ /** E.164 phone number (for example +14155551234) */
806
+ phoneNumber: Scalars['String'];
807
+ requireOtpVerification?: (Scalars['Boolean'] | null);
808
+ }
809
+ interface VerifyPartnerBrandSubscriptionInput {
810
+ code: Scalars['String'];
811
+ verificationToken: Scalars['String'];
812
+ }
716
813
  /**
717
814
  * A presigned S3 upload URL and the generated filename.
718
815
  * Returned by getPartnerUploadUrl.
@@ -745,6 +842,13 @@ interface MediaAssetGenqlSelection {
745
842
  __typename?: boolean | number;
746
843
  __scalar?: boolean | number;
747
844
  }
845
+ interface CreatePartnerBrandSubscriptionResponseGenqlSelection {
846
+ subscription?: BrandSubscriptionGenqlSelection;
847
+ verificationRequired?: boolean | number;
848
+ verificationToken?: boolean | number;
849
+ __typename?: boolean | number;
850
+ __scalar?: boolean | number;
851
+ }
748
852
  interface MutationGenqlSelection {
749
853
  /**
750
854
  * Get a presigned S3 URL for direct file upload.
@@ -767,6 +871,15 @@ interface MutationGenqlSelection {
767
871
  dimensions: DimensionsInput;
768
872
  };
769
873
  });
874
+ /**
875
+ * Subscribe a user to the authenticated partner brand.
876
+ * Set requireOtpVerification to true to start a two-step OTP flow.
877
+ */
878
+ createPartnerBrandSubscription?: (CreatePartnerBrandSubscriptionResponseGenqlSelection & {
879
+ __args: {
880
+ input: CreatePartnerBrandSubscriptionInput;
881
+ };
882
+ });
770
883
  /**
771
884
  * Create a moment with optional venue and ticket tiers in one atomic operation.
772
885
  * When type is IRL, the venue field is required.
@@ -776,6 +889,12 @@ interface MutationGenqlSelection {
776
889
  input: CreatePartnerMomentInput;
777
890
  };
778
891
  });
892
+ /** Complete a partner brand subscription that was created with requireOtpVerification=true. */
893
+ verifyPartnerBrandSubscription?: (BrandSubscriptionGenqlSelection & {
894
+ __args: {
895
+ input: VerifyPartnerBrandSubscriptionInput;
896
+ };
897
+ });
779
898
  __typename?: boolean | number;
780
899
  __scalar?: boolean | number;
781
900
  }
@@ -834,6 +953,13 @@ declare const generateMutationOp: (fields: MutationGenqlSelection & {
834
953
  __name?: string;
835
954
  }) => GraphqlOperation;
836
955
 
956
+ /**
957
+ * Default ITM backend production API endpoint.
958
+ */
959
+ declare const DEFAULT_API_URL = "https://itm-backend-production.up.railway.app/graphql";
960
+ type MaybePromise<T> = T | Promise<T>;
961
+ type ITMPartnerHeadersObject = Record<string, string>;
962
+ type ITMPartnerHeaders = ITMPartnerHeadersObject | (() => MaybePromise<ITMPartnerHeadersObject | undefined>);
837
963
  interface ITMPartnerClientConfig {
838
964
  /**
839
965
  * Partner API token (from backstage: Settings > Partner API).
@@ -842,13 +968,15 @@ interface ITMPartnerClientConfig {
842
968
  token: string;
843
969
  /**
844
970
  * Base URL of the ITM GraphQL API.
845
- * @default 'https://api.itm.studio/graphql'
971
+ * @default DEFAULT_API_URL
846
972
  */
847
973
  baseUrl?: string;
848
974
  /**
849
975
  * Additional headers to include on every request.
976
+ * A function is useful for request-scoped values like `x-forwarded-for`
977
+ * and `user-agent` when proxying end-user traffic through your server.
850
978
  */
851
- headers?: Record<string, string>;
979
+ headers?: ITMPartnerHeaders;
852
980
  }
853
981
  type ITMPartnerClient = Client;
854
982
  /**
@@ -881,4 +1009,4 @@ type ITMPartnerClient = Client;
881
1009
  */
882
1010
  declare function createITMPartnerClient(config: ITMPartnerClientConfig): ITMPartnerClient;
883
1011
 
884
- export { type CreatePartnerMomentInput, type CreatePartnerTicketTierInput, type Currency, type Dimensions, type DimensionsInput, type Echo, type EchoMediaAsset, type EchoType, type GetBrandEchoesForUserResponse, type GetPartnerCustomersResponse, type GetPublicMomentsResponse, type GetTicketsResponse, type ITMPartnerClient, type ITMPartnerClientConfig, type MediaAsset, type MediaAssetUploadUrl, type MerchPurchase, type Moment, type MomentCategory, type MomentCollection, type MomentCollectionLink, type MomentDiscountCodeUsage, type MomentSortOrder, type MomentStatus, type MomentSubcategory, type MomentType, type Mutation, type PartnerCustomer, type Payment, type PaymentStatus, type Query, type ThirdPartyEchoType, type Ticket, type TicketExtension, type TicketExtensionStatus, type TicketTier, type User, type Venue, type VenueInput, createITMPartnerClient, everything, generateMutationOp, generateQueryOp };
1012
+ export { type BrandSubscription, type CreatePartnerBrandSubscriptionInput, type CreatePartnerBrandSubscriptionResponse, type CreatePartnerMomentInput, type CreatePartnerTicketTierInput, type Currency, DEFAULT_API_URL, type Dimensions, type DimensionsInput, type Echo, type EchoMediaAsset, type EchoType, type GetBrandEchoesForUserResponse, type GetPartnerCustomersResponse, type GetPublicMomentsResponse, type GetTicketsResponse, type ITMPartnerClient, type ITMPartnerClientConfig, type ITMPartnerHeaders, type ITMPartnerHeadersObject, type MediaAsset, type MediaAssetUploadUrl, type MerchPurchase, type Moment, type MomentCategory, type MomentCollection, type MomentCollectionLink, type MomentDiscountCodeUsage, type MomentSortOrder, type MomentStatus, type MomentSubcategory, type MomentType, type Mutation, type PartnerCustomer, type PartnerMomentStats, type Payment, type PaymentStatus, type Query, type SubscriptionComplianceInput, type ThirdPartyEchoType, type Ticket, type TicketExtension, type TicketExtensionStatus, type TicketTier, type User, type Venue, type VenueInput, type VerifyPartnerBrandSubscriptionInput, createITMPartnerClient, everything, generateMutationOp, generateQueryOp };