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!): BudgetTypechatAssistantDays(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!): DuesSummaryTypeevent(id: Int!): EventType!eventLog(eventId: Int!): [LogEntryType!]!eventLoggerConfig(eventId: Int!): EventLoggerConfigType!eventNamingTemplate(chatId: Int!): EventNamingType!eventScoringConfig(eventId: Int!): EventScoringConfigTypeeventTypes(eventId: Int!): [EventTypeConfigType!]!exportLink(chatId: Int!): ExportLinkTypegameScore(gameId: Int!): [GameTeamScoreType!]!games(eventId: Int!): [GameScheduleType!]!goalTimerStats(eventId: Int!): GoalTimerStatsTypegroupInvite(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!): PayDetailsTypepayment(id: String!): PaymentTypeplayerStats(typeId: String, userId: Int!): [PlayerStatRowType!]!preset(id: String!): PresetTypepresets: [PresetType!]!raceToStats(eventId: Int!): RaceToStatsTyperegistrations(eventId: Int!, includePending: Boolean): [RegistrationType!]!roundJudgeStats(eventId: Int!): RoundJudgeStatsTypesetPointStats(eventId: Int!): SetPointStatsTypesignupCard(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): StringsetChatRequisites(chatId: Int!, details: String, remove: Boolean): DuesRequisitesTypesetDuesStatus(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): RegistrationTypeupdateEvent(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!