@itm-studio/partner-sdk 0.2.6 → 0.2.8

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.
@@ -20,11 +20,37 @@ enum MomentSortOrder {
20
20
  DESC
21
21
  }
22
22
 
23
+ enum BrandDropCtaType {
24
+ EXTERNAL_URL
25
+ GATED_LINK
26
+ MUSIC_LINK
27
+ SUBSCRIBE
28
+ }
29
+
30
+ enum MusicReleaseType {
31
+ ALBUM
32
+ EP
33
+ SINGLE
34
+ }
35
+
23
36
  enum MomentType {
24
37
  DIGITAL
38
+ HYBRID
25
39
  IRL
26
40
  }
27
41
 
42
+ enum MomentOnlineProvider {
43
+ GOOGLE_MEET
44
+ MS_TEAMS
45
+ OTHER
46
+ ZOOM
47
+ }
48
+
49
+ enum TicketAttendanceMode {
50
+ IN_PERSON
51
+ ONLINE
52
+ }
53
+
28
54
  enum MomentCategory {
29
55
  ACTIVATION
30
56
  CONCERT
@@ -297,6 +323,24 @@ type Currency {
297
323
  updatedAt: DateTime!
298
324
  }
299
325
 
326
+ """
327
+ The authenticated partner's brand identity and public-facing details.
328
+ The brand is derived from the partner token and cannot be selected by UID or slug.
329
+ """
330
+ type PartnerBrand {
331
+ uid: ID!
332
+ createdAt: DateTime!
333
+ updatedAt: DateTime!
334
+ name: String!
335
+ slug: String!
336
+ bio: String
337
+ publicUrl: String!
338
+ customDomain: String
339
+ customDomainVerifiedAt: DateTime
340
+ spotifyUrl: String
341
+ youtubeEmbedUrl: String
342
+ }
343
+
300
344
  type Venue {
301
345
  uid: ID!
302
346
  name: String!
@@ -335,11 +379,13 @@ type Moment {
335
379
  soldOut: Boolean!
336
380
  timezone: String!
337
381
  minimumAge: Int!
382
+ """Tracks the overall capacity of the moment."""
383
+ capacity: Int
338
384
  externalUrl: String
339
385
  """Display label to use when rendering the public lineup section."""
340
386
  lineupDisplayLabel: MomentLineupDisplayLabel!
341
387
  """Cover image for the moment. Null if no cover image is set."""
342
- coverImage: MomentCoverImage
388
+ coverImage: MomentCoverImage!
343
389
  venue: Venue
344
390
  ticketTiers: [TicketTier!]!
345
391
  createdAt: DateTime!
@@ -368,6 +414,7 @@ type TicketTier {
368
414
  description: String
369
415
  price: Float!
370
416
  currency: Currency!
417
+ attendanceMode: TicketAttendanceMode!
371
418
  isActive: Boolean!
372
419
  isPrivate: Boolean!
373
420
  maxPerUser: Int!
@@ -382,7 +429,7 @@ type TicketTier {
382
429
  type User {
383
430
  uid: ID!
384
431
  name: String
385
- phoneNumber: String!
432
+ phoneNumber: String
386
433
  primaryEmail: String
387
434
  instagramProfile: String
388
435
  twitterProfile: String
@@ -457,6 +504,69 @@ type PartnerMomentStats {
457
504
  ticketRsvpRequestsCount: Int!
458
505
  }
459
506
 
507
+ type PartnerMomentAttendanceCount {
508
+ total: Int!
509
+ checkedIn: Int!
510
+ }
511
+
512
+ type PartnerMomentTicketTierAttendance {
513
+ total: Int!
514
+ checkedIn: Int!
515
+ tierUid: String!
516
+ name: String!
517
+ label: String
518
+ }
519
+
520
+ type PartnerMomentTicketAttendance {
521
+ total: Int!
522
+ checkedIn: Int!
523
+ tiers: [PartnerMomentTicketTierAttendance!]!
524
+ }
525
+
526
+ type PartnerMomentGuestlistLabelAttendance {
527
+ total: Int!
528
+ checkedIn: Int!
529
+ labelUid: String!
530
+ name: String!
531
+ }
532
+
533
+ type PartnerMomentGuestlistAttendance {
534
+ total: Int!
535
+ checkedIn: Int!
536
+ unlabeled: PartnerMomentAttendanceCount!
537
+ labels: [PartnerMomentGuestlistLabelAttendance!]!
538
+ }
539
+
540
+ type PartnerMomentAttendanceStats {
541
+ momentUid: String!
542
+ momentSlug: String!
543
+ generatedAt: DateTime!
544
+ tickets: PartnerMomentTicketAttendance!
545
+ guestlist: PartnerMomentGuestlistAttendance!
546
+ }
547
+
548
+ enum EventImportPlatform {
549
+ EVENTBRITE
550
+ }
551
+
552
+ input PartnerMomentAttendanceLookupInput {
553
+ """
554
+ ITM moment UID. Provide exactly one of momentUid, momentSlug, or externalPlatform with externalId.
555
+ """
556
+ momentUid: String
557
+
558
+ """
559
+ ITM moment slug. Provide exactly one of momentUid, momentSlug, or externalPlatform with externalId.
560
+ """
561
+ momentSlug: String
562
+
563
+ """Source platform for externalId, for example EVENTBRITE."""
564
+ externalPlatform: EventImportPlatform
565
+
566
+ """Opaque source-platform event ID. Must be provided together with externalPlatform."""
567
+ externalId: String
568
+ }
569
+
460
570
  type MomentCollectionLink {
461
571
  uid: ID!
462
572
  url: String!
@@ -531,6 +641,46 @@ type Echo {
531
641
  updatedAt: DateTime!
532
642
  }
533
643
 
644
+ type BrandDrop {
645
+ uid: ID!
646
+ name: String!
647
+ slug: String!
648
+ subtitle: String
649
+ disclosures: String
650
+ isPublic: Boolean!
651
+ ctaType: BrandDropCtaType!
652
+ ctaUrl: String
653
+ ctaConfig: JSON
654
+ captureName: Boolean!
655
+ captureEmail: Boolean!
656
+ consentText: String
657
+ coverImage: MediaAsset!
658
+ coverImageMobile: MediaAsset
659
+ isActive: Boolean!
660
+ musicLink: BrandDropMusicLink
661
+ createdAt: DateTime!
662
+ updatedAt: DateTime!
663
+ }
664
+
665
+ type BrandDropMusicLink {
666
+ uid: ID!
667
+ releaseType: MusicReleaseType!
668
+ title: String!
669
+ artistName: String!
670
+ isrcCode: String
671
+ upcCode: String
672
+ releaseDate: DateTime
673
+ thumbnailUrl: String
674
+ thumbnailWidth: Int
675
+ thumbnailHeight: Int
676
+ subscriberOnly: Boolean!
677
+ sourceUrl: String!
678
+ odesliPageUrl: String
679
+ lastSyncedAt: DateTime
680
+ createdAt: DateTime!
681
+ updatedAt: DateTime!
682
+ }
683
+
534
684
  # ─── Paginated Responses ─────────────────────────────────────────────────────
535
685
 
536
686
  type GetPublicMomentsResponse {
@@ -540,6 +690,13 @@ type GetPublicMomentsResponse {
540
690
  nextCursor: String
541
691
  }
542
692
 
693
+ type GetPartnerDropsResponse {
694
+ drops: [BrandDrop!]!
695
+ totalCount: Int!
696
+ hasNextPage: Boolean!
697
+ nextCursor: String
698
+ }
699
+
543
700
  type GetMomentLineupsResponse {
544
701
  lineups: [MomentLineup!]!
545
702
  totalCount: Int!
@@ -568,6 +725,201 @@ type GetBrandEchoesForUserResponse {
568
725
  nextCursor: String
569
726
  }
570
727
 
728
+ type PartnerTicketTier {
729
+ """Sold-through fill rate as a 0-1 ratio."""
730
+ fillRate: Float!
731
+ isActive: Boolean!
732
+ isPrivate: Boolean!
733
+ label: String
734
+ labelColor: String
735
+ name: String!
736
+ price: Int!
737
+ facilityFee: Int!
738
+ remainingSupply: Int!
739
+ slotDate: DateTime
740
+ slotDurationHours: Int
741
+ supply: Int!
742
+ uid: String!
743
+ }
744
+
745
+ type GetPartnerTicketTiersForMomentResponse {
746
+ ticketTiers: [PartnerTicketTier!]!
747
+ totalCount: Int!
748
+ hasNextPage: Boolean!
749
+ nextCursor: String
750
+ }
751
+
752
+ enum DynamicPricingActorType {
753
+ ADMIN
754
+ PARTNER_API
755
+ }
756
+
757
+ enum DynamicPricingExecutionMode {
758
+ APPLY
759
+ PREVIEW
760
+ }
761
+
762
+ enum DynamicPricingBatchStatus {
763
+ APPLIED
764
+ CONFLICTED
765
+ FAILED
766
+ NO_CHANGES
767
+ PREVIEWED
768
+ PROCESSING
769
+ REJECTED
770
+ }
771
+
772
+ enum DynamicPricingBatchItemStatus {
773
+ APPLIED
774
+ BLOCKED_BY_BATCH
775
+ CONFLICTED
776
+ NO_CHANGE
777
+ REJECTED
778
+ WOULD_APPLY
779
+ WOULD_NOT_CHANGE
780
+ FAILED
781
+ }
782
+
783
+ enum DynamicPricingBatchEventType {
784
+ APPLIED
785
+ CONFLICTED
786
+ FAILED
787
+ IDEMPOTENCY_CONFLICT
788
+ NO_CHANGES
789
+ PREVIEWED
790
+ PROCESSING
791
+ RECEIVED
792
+ REJECTED
793
+ REPLAYED
794
+ }
795
+
796
+ enum DynamicPricingInventoryGuardMode {
797
+ INDEPENDENT
798
+ RANGE
799
+ }
800
+
801
+ enum DynamicPricingInventoryMetric {
802
+ REMAINING_SUPPLY
803
+ FILL_RATE_BPS
804
+ }
805
+
806
+ enum TicketAdmissionWindowSource {
807
+ EXPLICIT
808
+ LEGACY_SLOT
809
+ DEFAULT_MOMENT
810
+ MOMENT_OCCURRENCE
811
+ }
812
+
813
+ type MomentDynamicPricingTierRule {
814
+ uid: String!
815
+ ticketTierUid: String!
816
+ minPrice: Int!
817
+ maxPrice: Int!
818
+ }
819
+
820
+ type MomentDynamicPricingPolicy {
821
+ uid: String!
822
+ momentUid: String!
823
+ enabled: Boolean!
824
+ version: Int!
825
+ advanceBookingHorizonDays: Int!
826
+ tierRules: [MomentDynamicPricingTierRule!]!
827
+ createdAt: DateTime!
828
+ updatedAt: DateTime!
829
+ }
830
+
831
+ type DynamicPricingAdmissionWindow {
832
+ uid: String!
833
+ startsAt: DateTime!
834
+ endsAt: DateTime!
835
+ checkInOpensAt: DateTime
836
+ checkInClosesAt: DateTime
837
+ label: String
838
+ source: TicketAdmissionWindowSource!
839
+ sortOrder: Int!
840
+ }
841
+
842
+ type DynamicPricingTierContext {
843
+ ticketTierUid: String!
844
+ name: String!
845
+ currency: String!
846
+ currentPrice: Int!
847
+ facilityFee: Int!
848
+ minPrice: Int!
849
+ maxPrice: Int!
850
+ supply: Int!
851
+ remainingSupply: Int!
852
+ consumedSupply: Int!
853
+ fillRateBps: Int!
854
+ isActive: Boolean!
855
+ eligible: Boolean!
856
+ ineligibilityReasons: [String!]!
857
+ pricingContextVersion: String!
858
+ lastDynamicPriceChangeAt: DateTime
859
+ admissionWindows: [DynamicPricingAdmissionWindow!]!
860
+ }
861
+
862
+ type DynamicPricingContext {
863
+ serverNow: DateTime!
864
+ horizonEndsAt: DateTime!
865
+ validUntil: DateTime
866
+ momentUid: String!
867
+ momentSlug: String!
868
+ timezone: String!
869
+ policy: MomentDynamicPricingPolicy!
870
+ tiers: [DynamicPricingTierContext!]!
871
+ }
872
+
873
+ type DynamicPricingBatchItem {
874
+ uid: String!
875
+ ticketTierUid: String!
876
+ expectedPrice: Int!
877
+ requestedPrice: Int!
878
+ previousPrice: Int
879
+ resultingPrice: Int
880
+ expectedPricingContextVersion: String!
881
+ actualPricingContextVersion: String
882
+ status: DynamicPricingBatchItemStatus!
883
+ failureCode: String
884
+ failureMessage: String
885
+ contextSnapshot: JSON
886
+ externalSignals: JSON
887
+ }
888
+
889
+ type DynamicPricingBatchEvent {
890
+ uid: String!
891
+ type: DynamicPricingBatchEventType!
892
+ requestHash: String
893
+ details: JSON
894
+ createdAt: DateTime!
895
+ }
896
+
897
+ type DynamicPricingBatch {
898
+ uid: String!
899
+ momentUidRequested: String!
900
+ actorType: DynamicPricingActorType!
901
+ actorUid: String!
902
+ executionMode: DynamicPricingExecutionMode!
903
+ status: DynamicPricingBatchStatus!
904
+ idempotencyKey: String!
905
+ requestHash: String!
906
+ replayCount: Int!
907
+ idempotencyConflictCount: Int!
908
+ policyVersion: Int!
909
+ reason: String!
910
+ strategyKey: String
911
+ strategyVersion: String
912
+ externalReference: String
913
+ metadata: JSON
914
+ failureCode: String
915
+ failureMessage: String
916
+ items: [DynamicPricingBatchItem!]!
917
+ events: [DynamicPricingBatchEvent!]!
918
+ createdAt: DateTime!
919
+ updatedAt: DateTime!
920
+ completedAt: DateTime
921
+ }
922
+
571
923
  type BrandSubscription {
572
924
  uid: ID!
573
925
  isActive: Boolean!
@@ -594,6 +946,11 @@ type MomentLineupResponseResult {
594
946
  # ─── Queries ─────────────────────────────────────────────────────────────────
595
947
 
596
948
  type Query {
949
+ """
950
+ Get details for the brand associated with the partner token.
951
+ """
952
+ getPartnerBrand: PartnerBrand!
953
+
597
954
  """
598
955
  Get paginated moments for the brand associated with the partner token.
599
956
  """
@@ -606,6 +963,19 @@ type Query {
606
963
  sortOrder: MomentSortOrder
607
964
  ): GetPublicMomentsResponse!
608
965
 
966
+ """
967
+ Get paginated drops for the brand associated with the partner token.
968
+ """
969
+ getPartnerDrops(
970
+ """Cursor UID for pagination"""
971
+ cursor: String
972
+ take: Int
973
+ """Case-insensitive search over name, subtitle, and slug"""
974
+ search: String
975
+ isPublic: Boolean
976
+ ctaType: BrandDropCtaType
977
+ ): GetPartnerDropsResponse!
978
+
609
979
  """
610
980
  Get a single moment by slug.
611
981
  """
@@ -617,6 +987,15 @@ type Query {
617
987
  """
618
988
  getPartnerMomentStats(momentSlug: String!): PartnerMomentStats
619
989
 
990
+ """
991
+ Get a cached attendance snapshot for a partner-owned moment; counts can be
992
+ up to five minutes old. Look up by exactly one of momentUid, momentSlug, or
993
+ externalPlatform with externalId. Returns null when no owned moment matches.
994
+ """
995
+ getPartnerMomentAttendanceStats(
996
+ input: PartnerMomentAttendanceLookupInput!
997
+ ): PartnerMomentAttendanceStats
998
+
620
999
  """
621
1000
  Get paginated tickets for a moment.
622
1001
  """
@@ -659,6 +1038,27 @@ type Query {
659
1038
  take: Int
660
1039
  ): GetBrandEchoesForUserResponse!
661
1040
 
1041
+ """
1042
+ Get paginated ticket tiers for a partner-owned moment.
1043
+ Provide either momentSlug or momentUid. Omitted isActive defaults to active tiers only.
1044
+ """
1045
+ getPartnerTicketTiersForMoment(
1046
+ input: GetPartnerTicketTiersForMomentInput!
1047
+ ): GetPartnerTicketTiersForMomentResponse!
1048
+
1049
+ """
1050
+ Get a policy-bounded, admission-window-aware snapshot for dynamic pricing.
1051
+ Use each tier's currentPrice and pricingContextVersion as apply preconditions.
1052
+ """
1053
+ getPartnerMomentDynamicPricingContext(
1054
+ input: DynamicPricingMomentInput!
1055
+ ): DynamicPricingContext!
1056
+
1057
+ """
1058
+ Retrieve one dynamic pricing batch owned by the authenticated partner brand.
1059
+ """
1060
+ getPartnerDynamicPricingBatch(batchUid: String!): DynamicPricingBatch!
1061
+
662
1062
  """
663
1063
  Get approved public lineup entries for a moment.
664
1064
  Use getPartnerMoment to resolve a moment slug to uid before calling this query.
@@ -680,14 +1080,14 @@ type Query {
680
1080
  # ─── Input Types ──────────────────────────────────────────────────────────────
681
1081
 
682
1082
  input DimensionsInput {
683
- width: Int!
684
- height: Int!
1083
+ width: Float!
1084
+ height: Float!
685
1085
  }
686
1086
 
687
1087
  input VenueInput {
688
1088
  name: String!
689
1089
  city: String!
690
- country: String!
1090
+ country: String
691
1091
  address: String
692
1092
  postalCode: String
693
1093
  }
@@ -710,30 +1110,139 @@ input CreatePartnerTicketTierInput {
710
1110
  isPrivate: Boolean
711
1111
  """Default: true."""
712
1112
  isActive: Boolean
1113
+ """
1114
+ Required for HYBRID moments. Defaults from parent type for IRL and DIGITAL moments.
1115
+ """
1116
+ attendanceMode: TicketAttendanceMode
1117
+ }
1118
+
1119
+ input CreateMomentOnlineConfigInput {
1120
+ hostInstructions: String
1121
+ meetingId: String
1122
+ meetingPasscode: String
1123
+ meetingUrl: String!
1124
+ provider: MomentOnlineProvider!
713
1125
  }
714
1126
 
715
1127
  input CreatePartnerMomentInput {
716
1128
  name: String!
717
1129
  description: String!
718
- blurb: String!
1130
+ blurb: String
719
1131
  startDate: DateTime!
720
1132
  endDate: DateTime!
721
1133
  """IANA timezone (e.g. "America/New_York")."""
722
1134
  timezone: String!
723
- """IRL (in-person) or DIGITAL."""
1135
+ """IRL (in-person), DIGITAL, or HYBRID."""
724
1136
  type: MomentType!
725
1137
  """UID of a previously uploaded media asset. If omitted, uses the brand default cover image."""
726
1138
  coverImageUid: String
727
1139
  """Required when type is IRL."""
728
1140
  venue: VenueInput
1141
+ """Allowed when type is DIGITAL or HYBRID."""
1142
+ onlineConfig: CreateMomentOnlineConfigInput
729
1143
  """Default: false."""
730
1144
  isPrivate: Boolean
1145
+ """Tracks the overall capacity of the moment."""
1146
+ capacity: Int
731
1147
  category: MomentCategory
732
1148
  subcategory: MomentSubcategory
733
1149
  """Ticket tiers to create along with the moment."""
734
1150
  ticketTiers: [CreatePartnerTicketTierInput!]
735
1151
  }
736
1152
 
1153
+ input GetPartnerTicketTiersForMomentInput {
1154
+ """Moment UID to search ticket tiers for. Provide this or momentSlug."""
1155
+ momentUid: String
1156
+ """Moment slug to search ticket tiers for. Provide this or momentUid."""
1157
+ momentSlug: String
1158
+ cursor: String
1159
+ take: Int
1160
+ """Optional ticket tier UIDs to return."""
1161
+ ticketTierUids: [String!]
1162
+ """Case-insensitive search over tier name and label."""
1163
+ search: String
1164
+ isActive: Boolean
1165
+ isPrivate: Boolean
1166
+ """
1167
+ Filter by payment type: true = paid tiers only, false = free tiers only.
1168
+ """
1169
+ isPaid: Boolean
1170
+ """Exact tier price in cents."""
1171
+ price: Int
1172
+ """Minimum tier price in cents."""
1173
+ minPrice: Int
1174
+ """Maximum tier price in cents."""
1175
+ maxPrice: Int
1176
+ supply: Int
1177
+ minSupply: Int
1178
+ maxSupply: Int
1179
+ remainingSupply: Int
1180
+ minRemainingSupply: Int
1181
+ maxRemainingSupply: Int
1182
+ """Minimum sold-through fill rate as a 0-1 ratio."""
1183
+ minFillRate: Float
1184
+ """Maximum sold-through fill rate as a 0-1 ratio."""
1185
+ maxFillRate: Float
1186
+ """Filter to tiers with an admission window ending after this date."""
1187
+ startsAt: DateTime
1188
+ """Filter to tiers with an admission window starting before this date."""
1189
+ endsAt: DateTime
1190
+ """Filter to tiers with slotDate on or after this date."""
1191
+ slotDateStart: DateTime
1192
+ """Filter to tiers with slotDate on or before this date."""
1193
+ slotDateEnd: DateTime
1194
+ }
1195
+
1196
+ input PartnerTicketTierUpdateInput {
1197
+ ticketTierUid: String!
1198
+ price: Int
1199
+ facilityFee: Int
1200
+ supply: Int
1201
+ }
1202
+
1203
+ input EditPartnerTicketTiersForMomentInput {
1204
+ """Moment UID containing the ticket tiers. Provide this or momentSlug."""
1205
+ momentUid: String
1206
+ """Moment slug containing the ticket tiers. Provide this or momentUid."""
1207
+ momentSlug: String
1208
+ updates: [PartnerTicketTierUpdateInput!]!
1209
+ }
1210
+
1211
+ input DynamicPricingMomentInput {
1212
+ momentUid: String
1213
+ momentSlug: String
1214
+ }
1215
+
1216
+ input DynamicPricingTierUpdateInput {
1217
+ ticketTierUid: String!
1218
+ newPrice: Int!
1219
+ expectedPrice: Int!
1220
+ expectedPricingContextVersion: String!
1221
+ inventoryGuard: DynamicPricingInventoryGuardInput!
1222
+ externalSignals: JSON
1223
+ }
1224
+
1225
+ input DynamicPricingInventoryGuardInput {
1226
+ mode: DynamicPricingInventoryGuardMode!
1227
+ metric: DynamicPricingInventoryMetric
1228
+ minimum: Int
1229
+ maximum: Int
1230
+ }
1231
+
1232
+ input ApplyDynamicPricingInput {
1233
+ momentUid: String
1234
+ momentSlug: String
1235
+ mode: DynamicPricingExecutionMode!
1236
+ idempotencyKey: String!
1237
+ policyVersion: Int!
1238
+ reason: String!
1239
+ strategyKey: String
1240
+ strategyVersion: String
1241
+ externalReference: String
1242
+ metadata: JSON
1243
+ updates: [DynamicPricingTierUpdateInput!]!
1244
+ }
1245
+
737
1246
  input RespondToMomentLineupInput {
738
1247
  token: String!
739
1248
  status: MomentLineupStatus!
@@ -896,6 +1405,22 @@ type Mutation {
896
1405
  """
897
1406
  createPartnerMoment(input: CreatePartnerMomentInput!): Moment!
898
1407
 
1408
+ """
1409
+ Bulk edit partner-owned ticket tiers for a moment.
1410
+ Supports per-tier price, facility-fee, and supply updates.
1411
+ """
1412
+ editPartnerTicketTiersForMoment(
1413
+ input: EditPartnerTicketTiersForMomentInput!
1414
+ ): [PartnerTicketTier!]!
1415
+
1416
+ """
1417
+ Preview or atomically apply absolute prices to explicitly selected,
1418
+ policy-enrolled ticket tiers.
1419
+ """
1420
+ applyPartnerMomentDynamicPricing(
1421
+ input: ApplyDynamicPricingInput!
1422
+ ): DynamicPricingBatch!
1423
+
899
1424
  """
900
1425
  Complete a partner brand subscription that was created with requireOtpVerification=true.
901
1426
  """