@itm-studio/partner-sdk 0.2.6 → 0.2.7

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
@@ -531,6 +578,46 @@ type Echo {
531
578
  updatedAt: DateTime!
532
579
  }
533
580
 
581
+ type BrandDrop {
582
+ uid: ID!
583
+ name: String!
584
+ slug: String!
585
+ subtitle: String
586
+ disclosures: String
587
+ isPublic: Boolean!
588
+ ctaType: BrandDropCtaType!
589
+ ctaUrl: String
590
+ ctaConfig: JSON
591
+ captureName: Boolean!
592
+ captureEmail: Boolean!
593
+ consentText: String
594
+ coverImage: MediaAsset!
595
+ coverImageMobile: MediaAsset
596
+ isActive: Boolean!
597
+ musicLink: BrandDropMusicLink
598
+ createdAt: DateTime!
599
+ updatedAt: DateTime!
600
+ }
601
+
602
+ type BrandDropMusicLink {
603
+ uid: ID!
604
+ releaseType: MusicReleaseType!
605
+ title: String!
606
+ artistName: String!
607
+ isrcCode: String
608
+ upcCode: String
609
+ releaseDate: DateTime
610
+ thumbnailUrl: String
611
+ thumbnailWidth: Int
612
+ thumbnailHeight: Int
613
+ subscriberOnly: Boolean!
614
+ sourceUrl: String!
615
+ odesliPageUrl: String
616
+ lastSyncedAt: DateTime
617
+ createdAt: DateTime!
618
+ updatedAt: DateTime!
619
+ }
620
+
534
621
  # ─── Paginated Responses ─────────────────────────────────────────────────────
535
622
 
536
623
  type GetPublicMomentsResponse {
@@ -540,6 +627,13 @@ type GetPublicMomentsResponse {
540
627
  nextCursor: String
541
628
  }
542
629
 
630
+ type GetPartnerDropsResponse {
631
+ drops: [BrandDrop!]!
632
+ totalCount: Int!
633
+ hasNextPage: Boolean!
634
+ nextCursor: String
635
+ }
636
+
543
637
  type GetMomentLineupsResponse {
544
638
  lineups: [MomentLineup!]!
545
639
  totalCount: Int!
@@ -568,6 +662,201 @@ type GetBrandEchoesForUserResponse {
568
662
  nextCursor: String
569
663
  }
570
664
 
665
+ type PartnerTicketTier {
666
+ """Sold-through fill rate as a 0-1 ratio."""
667
+ fillRate: Float!
668
+ isActive: Boolean!
669
+ isPrivate: Boolean!
670
+ label: String
671
+ labelColor: String
672
+ name: String!
673
+ price: Int!
674
+ facilityFee: Int!
675
+ remainingSupply: Int!
676
+ slotDate: DateTime
677
+ slotDurationHours: Int
678
+ supply: Int!
679
+ uid: String!
680
+ }
681
+
682
+ type GetPartnerTicketTiersForMomentResponse {
683
+ ticketTiers: [PartnerTicketTier!]!
684
+ totalCount: Int!
685
+ hasNextPage: Boolean!
686
+ nextCursor: String
687
+ }
688
+
689
+ enum DynamicPricingActorType {
690
+ ADMIN
691
+ PARTNER_API
692
+ }
693
+
694
+ enum DynamicPricingExecutionMode {
695
+ APPLY
696
+ PREVIEW
697
+ }
698
+
699
+ enum DynamicPricingBatchStatus {
700
+ APPLIED
701
+ CONFLICTED
702
+ FAILED
703
+ NO_CHANGES
704
+ PREVIEWED
705
+ PROCESSING
706
+ REJECTED
707
+ }
708
+
709
+ enum DynamicPricingBatchItemStatus {
710
+ APPLIED
711
+ BLOCKED_BY_BATCH
712
+ CONFLICTED
713
+ NO_CHANGE
714
+ REJECTED
715
+ WOULD_APPLY
716
+ WOULD_NOT_CHANGE
717
+ FAILED
718
+ }
719
+
720
+ enum DynamicPricingBatchEventType {
721
+ APPLIED
722
+ CONFLICTED
723
+ FAILED
724
+ IDEMPOTENCY_CONFLICT
725
+ NO_CHANGES
726
+ PREVIEWED
727
+ PROCESSING
728
+ RECEIVED
729
+ REJECTED
730
+ REPLAYED
731
+ }
732
+
733
+ enum DynamicPricingInventoryGuardMode {
734
+ INDEPENDENT
735
+ RANGE
736
+ }
737
+
738
+ enum DynamicPricingInventoryMetric {
739
+ REMAINING_SUPPLY
740
+ FILL_RATE_BPS
741
+ }
742
+
743
+ enum TicketAdmissionWindowSource {
744
+ EXPLICIT
745
+ LEGACY_SLOT
746
+ DEFAULT_MOMENT
747
+ MOMENT_OCCURRENCE
748
+ }
749
+
750
+ type MomentDynamicPricingTierRule {
751
+ uid: String!
752
+ ticketTierUid: String!
753
+ minPrice: Int!
754
+ maxPrice: Int!
755
+ }
756
+
757
+ type MomentDynamicPricingPolicy {
758
+ uid: String!
759
+ momentUid: String!
760
+ enabled: Boolean!
761
+ version: Int!
762
+ advanceBookingHorizonDays: Int!
763
+ tierRules: [MomentDynamicPricingTierRule!]!
764
+ createdAt: DateTime!
765
+ updatedAt: DateTime!
766
+ }
767
+
768
+ type DynamicPricingAdmissionWindow {
769
+ uid: String!
770
+ startsAt: DateTime!
771
+ endsAt: DateTime!
772
+ checkInOpensAt: DateTime
773
+ checkInClosesAt: DateTime
774
+ label: String
775
+ source: TicketAdmissionWindowSource!
776
+ sortOrder: Int!
777
+ }
778
+
779
+ type DynamicPricingTierContext {
780
+ ticketTierUid: String!
781
+ name: String!
782
+ currency: String!
783
+ currentPrice: Int!
784
+ facilityFee: Int!
785
+ minPrice: Int!
786
+ maxPrice: Int!
787
+ supply: Int!
788
+ remainingSupply: Int!
789
+ consumedSupply: Int!
790
+ fillRateBps: Int!
791
+ isActive: Boolean!
792
+ eligible: Boolean!
793
+ ineligibilityReasons: [String!]!
794
+ pricingContextVersion: String!
795
+ lastDynamicPriceChangeAt: DateTime
796
+ admissionWindows: [DynamicPricingAdmissionWindow!]!
797
+ }
798
+
799
+ type DynamicPricingContext {
800
+ serverNow: DateTime!
801
+ horizonEndsAt: DateTime!
802
+ validUntil: DateTime
803
+ momentUid: String!
804
+ momentSlug: String!
805
+ timezone: String!
806
+ policy: MomentDynamicPricingPolicy!
807
+ tiers: [DynamicPricingTierContext!]!
808
+ }
809
+
810
+ type DynamicPricingBatchItem {
811
+ uid: String!
812
+ ticketTierUid: String!
813
+ expectedPrice: Int!
814
+ requestedPrice: Int!
815
+ previousPrice: Int
816
+ resultingPrice: Int
817
+ expectedPricingContextVersion: String!
818
+ actualPricingContextVersion: String
819
+ status: DynamicPricingBatchItemStatus!
820
+ failureCode: String
821
+ failureMessage: String
822
+ contextSnapshot: JSON
823
+ externalSignals: JSON
824
+ }
825
+
826
+ type DynamicPricingBatchEvent {
827
+ uid: String!
828
+ type: DynamicPricingBatchEventType!
829
+ requestHash: String
830
+ details: JSON
831
+ createdAt: DateTime!
832
+ }
833
+
834
+ type DynamicPricingBatch {
835
+ uid: String!
836
+ momentUidRequested: String!
837
+ actorType: DynamicPricingActorType!
838
+ actorUid: String!
839
+ executionMode: DynamicPricingExecutionMode!
840
+ status: DynamicPricingBatchStatus!
841
+ idempotencyKey: String!
842
+ requestHash: String!
843
+ replayCount: Int!
844
+ idempotencyConflictCount: Int!
845
+ policyVersion: Int!
846
+ reason: String!
847
+ strategyKey: String
848
+ strategyVersion: String
849
+ externalReference: String
850
+ metadata: JSON
851
+ failureCode: String
852
+ failureMessage: String
853
+ items: [DynamicPricingBatchItem!]!
854
+ events: [DynamicPricingBatchEvent!]!
855
+ createdAt: DateTime!
856
+ updatedAt: DateTime!
857
+ completedAt: DateTime
858
+ }
859
+
571
860
  type BrandSubscription {
572
861
  uid: ID!
573
862
  isActive: Boolean!
@@ -594,6 +883,11 @@ type MomentLineupResponseResult {
594
883
  # ─── Queries ─────────────────────────────────────────────────────────────────
595
884
 
596
885
  type Query {
886
+ """
887
+ Get details for the brand associated with the partner token.
888
+ """
889
+ getPartnerBrand: PartnerBrand!
890
+
597
891
  """
598
892
  Get paginated moments for the brand associated with the partner token.
599
893
  """
@@ -606,6 +900,19 @@ type Query {
606
900
  sortOrder: MomentSortOrder
607
901
  ): GetPublicMomentsResponse!
608
902
 
903
+ """
904
+ Get paginated drops for the brand associated with the partner token.
905
+ """
906
+ getPartnerDrops(
907
+ """Cursor UID for pagination"""
908
+ cursor: String
909
+ take: Int
910
+ """Case-insensitive search over name, subtitle, and slug"""
911
+ search: String
912
+ isPublic: Boolean
913
+ ctaType: BrandDropCtaType
914
+ ): GetPartnerDropsResponse!
915
+
609
916
  """
610
917
  Get a single moment by slug.
611
918
  """
@@ -659,6 +966,27 @@ type Query {
659
966
  take: Int
660
967
  ): GetBrandEchoesForUserResponse!
661
968
 
969
+ """
970
+ Get paginated ticket tiers for a partner-owned moment.
971
+ Provide either momentSlug or momentUid. Omitted isActive defaults to active tiers only.
972
+ """
973
+ getPartnerTicketTiersForMoment(
974
+ input: GetPartnerTicketTiersForMomentInput!
975
+ ): GetPartnerTicketTiersForMomentResponse!
976
+
977
+ """
978
+ Get a policy-bounded, admission-window-aware snapshot for dynamic pricing.
979
+ Use each tier's currentPrice and pricingContextVersion as apply preconditions.
980
+ """
981
+ getPartnerMomentDynamicPricingContext(
982
+ input: DynamicPricingMomentInput!
983
+ ): DynamicPricingContext!
984
+
985
+ """
986
+ Retrieve one dynamic pricing batch owned by the authenticated partner brand.
987
+ """
988
+ getPartnerDynamicPricingBatch(batchUid: String!): DynamicPricingBatch!
989
+
662
990
  """
663
991
  Get approved public lineup entries for a moment.
664
992
  Use getPartnerMoment to resolve a moment slug to uid before calling this query.
@@ -680,14 +1008,14 @@ type Query {
680
1008
  # ─── Input Types ──────────────────────────────────────────────────────────────
681
1009
 
682
1010
  input DimensionsInput {
683
- width: Int!
684
- height: Int!
1011
+ width: Float!
1012
+ height: Float!
685
1013
  }
686
1014
 
687
1015
  input VenueInput {
688
1016
  name: String!
689
1017
  city: String!
690
- country: String!
1018
+ country: String
691
1019
  address: String
692
1020
  postalCode: String
693
1021
  }
@@ -710,30 +1038,139 @@ input CreatePartnerTicketTierInput {
710
1038
  isPrivate: Boolean
711
1039
  """Default: true."""
712
1040
  isActive: Boolean
1041
+ """
1042
+ Required for HYBRID moments. Defaults from parent type for IRL and DIGITAL moments.
1043
+ """
1044
+ attendanceMode: TicketAttendanceMode
1045
+ }
1046
+
1047
+ input CreateMomentOnlineConfigInput {
1048
+ hostInstructions: String
1049
+ meetingId: String
1050
+ meetingPasscode: String
1051
+ meetingUrl: String!
1052
+ provider: MomentOnlineProvider!
713
1053
  }
714
1054
 
715
1055
  input CreatePartnerMomentInput {
716
1056
  name: String!
717
1057
  description: String!
718
- blurb: String!
1058
+ blurb: String
719
1059
  startDate: DateTime!
720
1060
  endDate: DateTime!
721
1061
  """IANA timezone (e.g. "America/New_York")."""
722
1062
  timezone: String!
723
- """IRL (in-person) or DIGITAL."""
1063
+ """IRL (in-person), DIGITAL, or HYBRID."""
724
1064
  type: MomentType!
725
1065
  """UID of a previously uploaded media asset. If omitted, uses the brand default cover image."""
726
1066
  coverImageUid: String
727
1067
  """Required when type is IRL."""
728
1068
  venue: VenueInput
1069
+ """Allowed when type is DIGITAL or HYBRID."""
1070
+ onlineConfig: CreateMomentOnlineConfigInput
729
1071
  """Default: false."""
730
1072
  isPrivate: Boolean
1073
+ """Tracks the overall capacity of the moment."""
1074
+ capacity: Int
731
1075
  category: MomentCategory
732
1076
  subcategory: MomentSubcategory
733
1077
  """Ticket tiers to create along with the moment."""
734
1078
  ticketTiers: [CreatePartnerTicketTierInput!]
735
1079
  }
736
1080
 
1081
+ input GetPartnerTicketTiersForMomentInput {
1082
+ """Moment UID to search ticket tiers for. Provide this or momentSlug."""
1083
+ momentUid: String
1084
+ """Moment slug to search ticket tiers for. Provide this or momentUid."""
1085
+ momentSlug: String
1086
+ cursor: String
1087
+ take: Int
1088
+ """Optional ticket tier UIDs to return."""
1089
+ ticketTierUids: [String!]
1090
+ """Case-insensitive search over tier name and label."""
1091
+ search: String
1092
+ isActive: Boolean
1093
+ isPrivate: Boolean
1094
+ """
1095
+ Filter by payment type: true = paid tiers only, false = free tiers only.
1096
+ """
1097
+ isPaid: Boolean
1098
+ """Exact tier price in cents."""
1099
+ price: Int
1100
+ """Minimum tier price in cents."""
1101
+ minPrice: Int
1102
+ """Maximum tier price in cents."""
1103
+ maxPrice: Int
1104
+ supply: Int
1105
+ minSupply: Int
1106
+ maxSupply: Int
1107
+ remainingSupply: Int
1108
+ minRemainingSupply: Int
1109
+ maxRemainingSupply: Int
1110
+ """Minimum sold-through fill rate as a 0-1 ratio."""
1111
+ minFillRate: Float
1112
+ """Maximum sold-through fill rate as a 0-1 ratio."""
1113
+ maxFillRate: Float
1114
+ """Filter to tiers with an admission window ending after this date."""
1115
+ startsAt: DateTime
1116
+ """Filter to tiers with an admission window starting before this date."""
1117
+ endsAt: DateTime
1118
+ """Filter to tiers with slotDate on or after this date."""
1119
+ slotDateStart: DateTime
1120
+ """Filter to tiers with slotDate on or before this date."""
1121
+ slotDateEnd: DateTime
1122
+ }
1123
+
1124
+ input PartnerTicketTierUpdateInput {
1125
+ ticketTierUid: String!
1126
+ price: Int
1127
+ facilityFee: Int
1128
+ supply: Int
1129
+ }
1130
+
1131
+ input EditPartnerTicketTiersForMomentInput {
1132
+ """Moment UID containing the ticket tiers. Provide this or momentSlug."""
1133
+ momentUid: String
1134
+ """Moment slug containing the ticket tiers. Provide this or momentUid."""
1135
+ momentSlug: String
1136
+ updates: [PartnerTicketTierUpdateInput!]!
1137
+ }
1138
+
1139
+ input DynamicPricingMomentInput {
1140
+ momentUid: String
1141
+ momentSlug: String
1142
+ }
1143
+
1144
+ input DynamicPricingTierUpdateInput {
1145
+ ticketTierUid: String!
1146
+ newPrice: Int!
1147
+ expectedPrice: Int!
1148
+ expectedPricingContextVersion: String!
1149
+ inventoryGuard: DynamicPricingInventoryGuardInput!
1150
+ externalSignals: JSON
1151
+ }
1152
+
1153
+ input DynamicPricingInventoryGuardInput {
1154
+ mode: DynamicPricingInventoryGuardMode!
1155
+ metric: DynamicPricingInventoryMetric
1156
+ minimum: Int
1157
+ maximum: Int
1158
+ }
1159
+
1160
+ input ApplyDynamicPricingInput {
1161
+ momentUid: String
1162
+ momentSlug: String
1163
+ mode: DynamicPricingExecutionMode!
1164
+ idempotencyKey: String!
1165
+ policyVersion: Int!
1166
+ reason: String!
1167
+ strategyKey: String
1168
+ strategyVersion: String
1169
+ externalReference: String
1170
+ metadata: JSON
1171
+ updates: [DynamicPricingTierUpdateInput!]!
1172
+ }
1173
+
737
1174
  input RespondToMomentLineupInput {
738
1175
  token: String!
739
1176
  status: MomentLineupStatus!
@@ -896,6 +1333,22 @@ type Mutation {
896
1333
  """
897
1334
  createPartnerMoment(input: CreatePartnerMomentInput!): Moment!
898
1335
 
1336
+ """
1337
+ Bulk edit partner-owned ticket tiers for a moment.
1338
+ Supports per-tier price, facility-fee, and supply updates.
1339
+ """
1340
+ editPartnerTicketTiersForMoment(
1341
+ input: EditPartnerTicketTiersForMomentInput!
1342
+ ): [PartnerTicketTier!]!
1343
+
1344
+ """
1345
+ Preview or atomically apply absolute prices to explicitly selected,
1346
+ policy-enrolled ticket tiers.
1347
+ """
1348
+ applyPartnerMomentDynamicPricing(
1349
+ input: ApplyDynamicPricingInput!
1350
+ ): DynamicPricingBatch!
1351
+
899
1352
  """
900
1353
  Complete a partner brand subscription that was created with requireOtpVerification=true.
901
1354
  """