GraphQL API

GraphQL is the contract between the TeamUp server and its own clients — the web app and the iOS app. The schema is published here as a stable, reviewable artifact.

Endpoint

https://team-up.tgmbot.com/graphql

Subscriptions use the graphql-ws protocol at https://team-up.tgmbot.com/graphql/subscription.

Introspection is disabled in production. The full SDL is published instead: download graphql-schema.gql. It is regenerated from the server code and guarded by CI, so it always matches the deployed schema.

Authentication

First-party only for now: requests carry a JWT obtained through TeamUp sign-in (Telegram, VK or Apple). There is no self-service client registration for GraphQL — if you are building an external integration, use the MCP server, which has a full OAuth 2.1 flow.

Queries (46)

  • budget(chatId: Int!): BudgetType
  • chatAssistantDays(chatId: Int!, tzOffsetMin: Int!): [AssistantDayType!]!
  • chatAssistantTurns(chatId: Int!, cursor: String, date: String!, includeSilent: Boolean!, tzOffsetMin: Int!): AssistantTurnsPageType!
  • chatCreditBalance(chatId: Int!): Float!
  • chatCreditDay(chatId: Int!, date: String!, tzOffsetMin: Int!): [CreditTransactionType!]!
  • chatCredits(chatId: Int!, from: DateTime, to: DateTime, tzOffsetMin: Int!): ChatCreditsType!
  • chatDebts(chatId: Int!): [ChatDebtType!]!
  • chatEvents(archivedOnly: Boolean, chatId: Int!, limit: Int, offset: Int): [EventType!]!
  • chatMembers(chatId: Int!): [ChatMemberType!]!
  • chatMemories(chatId: Int!, userId: Int): [PlayerMemoriesType!]!
  • contacts(eventId: Int): [ContactType!]!
  • creditPacks: [CreditPackType!]!
  • dues(eventId: Int!): [DuesEntryType!]!
  • duesSummary(eventId: Int!): DuesSummaryType
  • event(id: Int!): EventType!
  • eventLog(eventId: Int!): [LogEntryType!]!
  • eventLoggerConfig(eventId: Int!): EventLoggerConfigType!
  • eventNamingTemplate(chatId: Int!): EventNamingType!
  • eventScoringConfig(eventId: Int!): EventScoringConfigType
  • eventTypes(eventId: Int!): [EventTypeConfigType!]!
  • exportLink(chatId: Int!): ExportLinkType
  • gameScore(gameId: Int!): [GameTeamScoreType!]!
  • games(eventId: Int!): [GameScheduleType!]!
  • goalTimerStats(eventId: Int!): GoalTimerStatsType
  • groupInvite(slug: String!): GroupInvitePreviewType!
  • mergeCandidates(chatId: Int!, userId: Int!): [MergeCandidateType!]!
  • myCapabilities(chatId: Int!, eventId: Int): CapabilitiesType!
  • myChats: [ChatType!]!
  • myEvents(archivedOnly: Boolean, limit: Int, offset: Int): [EventType!]!
  • payDetails(paymentId: String!): PayDetailsType
  • payment(id: String!): PaymentType
  • playerStats(typeId: String, userId: Int!): [PlayerStatRowType!]!
  • preset(id: String!): PresetType
  • presets: [PresetType!]!
  • raceToStats(eventId: Int!): RaceToStatsType
  • registrations(eventId: Int!, includePending: Boolean): [RegistrationType!]!
  • roundJudgeStats(eventId: Int!): RoundJudgeStatsType
  • setPointStats(eventId: Int!): SetPointStatsType
  • signupCard(slug: String!): SignupCardType!
  • signupInviteCandidates(slug: String!): [SignupCandidateType!]!
  • signupLinks(eventId: Int!): [SignupLinkType!]!
  • spectatorCommentary(slug: String!): [SpectatorCommentaryType!]!
  • spectatorLog(slug: String!): [LogEntryType!]!
  • spectatorView(slug: String!): SpectatorViewType!
  • teams(eventId: Int!): [TeamType!]!
  • tonConnectTx(paymentId: String!, senderAddress: String): TonConnectTxType!

Mutations (69)

  • addEventHost(eventId: Int!, userId: Int!): Boolean!
  • addMemory(chatId: Int!, text: String!, userId: Int!): MemoryWriteResultType!
  • addPlayerToTeam(teamId: Int!, userId: Int!): TeamMemberType!
  • approveRegistration(registrationId: Int!): RegistrationType!
  • archiveEvent(id: Int!): EventType!
  • claimDues(eventId: Int!): DuesEntryType!
  • createChat(name: String!): ChatType!
  • createEvent(input: CreateEventInput!): EventType!
  • createExportLink(chatId: Int!, includeMoney: Boolean): ExportLinkType!
  • createGameSchedule(eventId: Int!, teamIds: [Int!]!): GameScheduleType!
  • createInvoice(chatId: Int!, currency: String, offerCode: String!): CreateInvoiceResultType!
  • createSignupLink(eventId: Int!, label: String, settings: SignupSettingsInput): SignupLinkType!
  • createTeam(color: String, emoji: String, eventId: Int!, name: String!): TeamType!
  • deleteBankEntry(chatId: Int!, entryId: Int!): Boolean!
  • deleteEventType(eventId: Int!, typeId: String!): Boolean!
  • deleteGroup(chatId: Int!): Boolean!
  • deleteMemory(id: Int!): Boolean!
  • deleteTeam(teamId: Int!): Boolean!
  • disableGroupInvite(chatId: Int!): Boolean!
  • disableSpectatorLink(eventId: Int!): Boolean!
  • enableGroupInvite(chatId: Int!): GroupInviteType!
  • enableSpectatorLink(eventId: Int!): SpectatorLinkType!
  • finishEvent(id: Int!): EventType!
  • finishGame(gameId: Int!): GameScheduleType!
  • generateRoundRobin(eventId: Int!): [GameScheduleType!]!
  • grantCapability(capability: String!, chatId: Int!, userId: Int!): Boolean!
  • inviteViaLink(guestName: String, slug: String!, userId: Int): RegistrationType!
  • joinGroup(slug: String!): JoinGroupResultType!
  • mergeChatMember(chatId: Int!, sourceUserId: Int!, targetUserId: Int!): Boolean!
  • migrateChatEvents(sourceChatId: Int!, targetChatId: Int!): ChatType!
  • movePlayer(memberId: Int!, toTeamId: Int!): TeamMemberType!
  • quickCreateEvent(demo: Boolean!, presetId: String!): QuickCreateResultType!
  • reapplyPreset(eventId: Int!, presetId: String!): Boolean!
  • recordBankEntry(amount: Int!, chatId: Int!, eventId: Int, kind: String!, label: String!): BankEntryType!
  • refreshChatMembers(chatId: Int!): Boolean!
  • register(eventId: Int!): RegistrationType!
  • registerDeviceToken(environment: String, platform: String, token: String!): Boolean!
  • registerExisting(eventId: Int!, userIds: [Int!]!): [RegistrationType!]!
  • registerGuestReusable(eventId: Int!, guestName: String!): RegistrationType!
  • registerViaLink(slug: String!): RegistrationType!
  • rejectRegistration(note: String, registrationId: Int!): RegistrationType!
  • removeEventHost(eventId: Int!, userId: Int!): Boolean!
  • removePlayerFromTeam(memberId: Int!): Boolean!
  • renameChat(chatId: Int!, name: String!): ChatType!
  • renameGuest(chatId: Int!, name: String!, userId: Int!): UserType!
  • reopenEvent(id: Int!): EventType!
  • revokeCapability(capability: String!, chatId: Int!, userId: Int!): Boolean!
  • revokeExportLink(chatId: Int!): Boolean!
  • revokeSignupLink(linkId: Int!): Boolean!
  • setBankHolder(chatId: Int!, userId: Int): String
  • setChatRequisites(chatId: Int!, details: String, remove: Boolean): DuesRequisitesType
  • setDuesStatus(eventId: Int!, paidAmount: Int, status: String!, userIds: [Int!]!): [DuesEntryType!]!
  • setEventNamingTemplate(chatId: Int!, label: String, scheme: String!): EventNamingType!
  • setMemberRole(chatId: Int!, role: String!, userId: Int!): Boolean!
  • setScoringConfig(eventId: Int!, input: ScoringConfigInput!): Boolean!
  • splitTeams(count: Int!, eventId: Int!): [TeamType!]!
  • splitTeamsManual(input: SplitTeamsManualInput!): [TeamType!]!
  • startGame(gameId: Int!): GameScheduleType!
  • submitVoiceNote(durationSec: Int!, eventId: Int!, gameId: Int, localId: String!, recordedAt: String!): VoiceNoteResultType!
  • syncEntries(entries: [SyncEntryInput!]!, eventId: Int!, gameId: Int): SyncResponseType!
  • transferOwnership(chatId: Int!, newOwnerUserId: Int!): Boolean!
  • unarchiveEvent(id: Int!): EventType!
  • unregister(eventId: Int!, userId: Int): RegistrationType
  • updateEvent(description: String, id: Int!): EventType!
  • updateMemory(id: Int!, text: String!): MemoryWriteResultType!
  • updateProfile(firstName: String, lastName: String): UserType!
  • updateSignupLink(label: String, linkId: Int!, settings: SignupSettingsInput): SignupLinkType!
  • updateTeam(color: String, emoji: String, name: String, teamId: Int!): TeamType!
  • upsertEventType(eventId: Int!, input: UpsertEventTypeInput!): Boolean!

Subscriptions (2)

  • gameUpdated(eventId: Int!): SyncResponseType!
  • paymentUpdated(paymentId: String!): PaymentType!