Tips

Tipping lets users in your chat send monetary tips to each other. A viewer can tip another user or a streamer directly from the chat interface — the receiver gets a notification and can accept, return, or block the tip.

Use tipping to increase engagement and monetization in your chat rooms: live streams, sports events, community discussions, and other interactive formats.


How It Works

Sending a Tip

A user opens the tip form by tapping the tip button next to a message or through the Chat Actions menu (on streams).

Chat Actions menu with Send Tip option

The tip form shows the recipient's name, an amount input with a currency selector, and the sender's available balance. The sender can also mark a tip as private — private tips won't appear in the public chat.

Tip form — recipient, amount, currency, private toggle

After sending, the sender sees a confirmation screen. The tip remains pending until the recipient responds. If the recipient does not respond within the configured timeout, the tip is automatically declined.

Tip sent confirmation — EUR 200.00 was sent

If the tip cannot be processed, the sender sees an error notification.

Error notification — An unexpected error has occurred

Receiving a Tip

When someone sends a tip, the receiver gets a banner notification in the chat with a countdown timer showing how long they have to respond.

Tip notification — You have been tipped, Review tip button

Tapping "Review tip" opens the tip details. The receiver has three options:

  • Accept — the tip is processed and funds are transferred to the receiver.
  • Return Tip — the tip is declined.
  • Block & Return — the tip is declined and the sender is blocked. The users won't see each other in chat.
Tip review — Accept, Return Tip, Block & Return

If the receiver chooses "Block & Return", they select a reason: "Amount too large", "Unwanted attention", "Sent by mistake", or "Other".

Block & Return — reason selection

After declining, the sender sees a notification.

Tips has been declined notification

After blocking, a confirmation is shown.

Konstantin was blocked notification

Sending a Tip on a Stream

On stream pages, tipping is available through the Chat Actions menu. The user taps the menu icon and selects "Send Tip". The tip is sent to the streamer (room owner).

Stream view with chat Stream view with chat

Admin Panel Setup (Required)

Before API integration, you must enable OAuth and tipping in Chat Admin.

OAuth is mandatory for tipping security. If OAuth is disabled, tipping will be automatically unavailable.

  1. Open Functional settings.
  2. Enable Oauth.
  3. Fill in Oauth url.
  4. Click Save.
  5. On the same page, enable Enable tipping.
  6. Click Save again.
  7. Open Tips (this section appears after tipping is enabled).

Configure Tips section

  1. In General, configure limits, room restrictions, accept timeout, cooldowns, role restrictions, and anti-abuse rules.
  2. In Claim settings, set:
    • Tips claim URL
    • Tips claim bearer
  3. In Currency and fees, add currencies, enable active ones, and configure payment fee.
  4. Click Save.

Mapping to integration fields

Chat Admin fieldIntegration field
Tips claim URLpartnerUrl
Tips claim bearerpartnerToken

These values are used in the Process payment and Get payment status endpoints.



Required headers for all API endpoints

ParameterDescription
AuthorizationBearer token that you can get from the back office (Admin panel / Settings / Bearer tokens)
projectYour project identifier

Endpoints you must implement

These endpoints are called by the Tipping Service. Your backend must implement them.


Validate user

Called on every tip creation — twice: once for receiver, once for sender. Validates that users exist in the room and are allowed to tip.

GET Endpoint: ${BACKEND_URL}/internal/talker/tip

Request query parameters

ParameterTypeRequiredDescription
userIdintegerYesUser ID to look up (sender or receiver)
externalRoomIdstringYesRoom identifier where the tip is being sent
projectstringYesProject identifier

CURL example (how the Tipping Service calls your backend):

curl --location '${BACKEND_URL}/internal/talker/tip?userId=42&externalRoomId=room-123&project=my-project' \
--header 'Authorization: Bearer ${INTERNAL_BEARER_TOKEN}'

Expected response:

{
  "externalUserId": "partner-user-abc123",
  "userName": "john_doe",
  "roles": "SPEAKER,MODERATOR",
  "isBanned": false,
  "reportCount": 0,
  "autoAcceptTips": false
}

Response fields

FieldTypeRequiredDescription
externalUserIdstringYesUser's ID in your payment partner system. Passed to the payment partner when processing payment
userNamestringYesDisplay name. Stored on the tip as senderUserName
rolesstringYesComma-separated roles in the room (e.g. "SPEAKER", "SPEAKER,MODERATOR"). Checked against allowedRoles setting
isBannedbooleanYesIf true and denyBannedUsers setting is enabled — user is blocked from tipping
reportCountintegerYesIf denyReportedUsers setting is enabled and reportCount >= denyReportedUsersThreshold — user is blocked
autoAcceptTipsbooleanYesIf true and user's role includes SPEAKER — tips are accepted automatically without manual action

Validation checks applied:

CheckApplies toError message
Endpoint returns 200 with dataBothFailed to get user
roles includes a role from allowedRolesReceiver onlyUser role not allowed
isBanned is falseBothUser is banned
reportCount < denyReportedUsersThresholdBothUser is reported

Process payment

Called when a tip is accepted. partnerUrl and partnerToken are configured per project via admin settings.

POST Endpoint: ${partnerUrl}/payment

Request payload

ParameterTypeRequiredDescription
senderIdstringYesSender's externalUserId from the validate user endpoint
receiverIdstringYesReceiver's externalUserId from the validate user endpoint
amountnumberYesTip amount
currencystringYesCurrency code (e.g. "USD", "EUR", "COINS")
internalTransactionIdintegerYesTip ID in the Tipping Service. Use to correlate transactions

CURL example (how the Tipping Service calls your payment partner):

curl --location -X POST "${partnerUrl}/payment" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer ${partnerToken}" \
  --data '{
    "senderId": "partner-user-abc123",
    "receiverId": "partner-user-xyz789",
    "amount": 50.00,
    "currency": "USD",
    "internalTransactionId": 1
  }'

Expected response:

{
  "transactionId": "ext-txn-456",
  "status": "SUCCESS",
  "processedAt": "2025-01-15T12:05:00.000Z"
}

Response fields

FieldTypeRequiredDescription
transactionIdstringYesExternal transaction ID. Stored on the tip and used for status polling
statusstringYesPayment result: PENDING, PROCESSING, SUCCESS, DECLINED, FAILED. Any unrecognized status is treated as PENDING
processedAtstringNoISO 8601 timestamp

Get payment status

The Tipping Service periodically polls this endpoint for tips in PROCESSING state.

GET Endpoint: ${partnerUrl}/payment/status/${transactionId}

CURL example:

curl --location "${partnerUrl}/payment/status/ext-txn-456" \
  --header "Authorization: Bearer ${partnerToken}"

Expected response:

{
  "status": "SUCCESS"
}

Allowed status values (case-insensitive):

StatusMeaning
PENDINGPayment queued, not yet started
PROCESSINGPayment in progress
SUCCESSPayment completed. Tip is finalized
DECLINEDPayment rejected. Tip is marked as declined
FAILEDPayment failed