Skip to content
TipPage Docs
Esc
↑↓navigate↵open⌘Jpreview

Create a tip

Add a tip that TipPage didn’t take payment for. It enters the TTS queue (and the media queue when media_url is given) and plays like any other tip, with TTS pre-rendered. These tips deliberately skip the word filter (the author is trusted). Fires tip.created with source: "api".

Two independent fields decide how the tip is counted:

  • source labels where the tip came from - a stable lower-case slug per platform (kofi, youtube-superchat, ayupcc). Reports list one row per distinct source. On its own it makes a free tip: shown and read out on stream, never counted as money.
  • paid: true says real money was processed on that platform (a Ko-fi payment, a Super Chat, a legacy tipping service you’re bridging). The tip then counts as revenue on the streamer’s overview and in their PDF reports under that source, climbs the leaderboard and moves the tip goal. Requires source. reference is your own transaction id for that payment, shown to the streamer for reconciliation.

Neither field - a manual tip, exactly like the dashboard’s manual-tip form: visible on stream, never in the money totals, itemised separately in reports. Requires tips:create.

POST/tips
Authorization
AuthorizationBearer token (tp_live_... or tpat_...) · headerrequired
A TipPage API key (`tp_live_...`, created in Dashboard → Settings → Developer) or an OAuth 2.0 access token (`tpat_...`, see the OAuth guide). Both carry the same scopes and are accepted on every endpoint.
Request body
requiredapplication/json
namestringrequired
The display name shown on stream.
max length 22
amountnumberrequired
Displayed amount, in the streamer's currency.
min 0 · max 100000
messagestring
max length 255
media_urlstring<uri>
Optional video to queue alongside (YouTube supported).
media_start_timeinteger
Video start offset in seconds.
min 0 · default: 0
sourcestring
Where the tip came from, as a lower-case slug (`kofi`, `youtube-superchat`, `ayupcc`). A label only - pair it with `paid: true` when money really moved there.
matches ^[a-z0-9][a-z0-9._-]{1,47}$
paidboolean
Real money was processed on `source`. Makes the tip count as revenue (overview, reports, leaderboard, tip goal). Requires `source`.
default: false
referencestring
Your own reference for the payment on that platform (a transaction or order id). Requires `source`.
max length 128
Responses
201Tip queued.
tipobject
The tip as `GET /tts/queue` lists it. `tts_url` is `null` here - the audio is pre-rendered in the background (`tip.tts_ready`). `source` is `api`, `external_source` / `external_ref` / `is_paid` echo what you sent.
Show properties
order_idstring
namestring
Display name (post-filter).
amountnumber | null
messagestring | null
The tip message (post-filter - what shows on stream).
tts_urlstring<uri> | null
Audio for this tip. AI-voice tips are rendered at payment; standard voices are rendered when an alert box first plays the tip (in that box's voice) or the streamer previews it - `null` until then. Listen for `tip.tts_ready`.
is_replayboolean
is_sub_rewardboolean
sourcestring
Where the tip came from: `stripe`, `paypal`, `manual` (dashboard manual tip), `api` (POST /tips), `sub_reward`, `replay`, `test`, `ayupcc`, or `unknown` for tips older than source tracking.
external_sourcestring | null
Developer-API tips only - the `source` label the caller sent (`kofi`, `ayupcc`); `null` for every other source. Says where the tip came from, not whether money moved - see `is_paid`.
external_refstring | null
Developer-API tips only - the caller's own payment reference.
is_paidboolean
Real money changed hands (Stripe, PayPal, or a developer-API tip sent with `paid: true`). `false` for manual tips, free integration tips and sub rewards - those never count toward the streamer's totals.
platformstring | null
The platform of the account the donor was signed in with when they tipped; `null` for an unattributed tip.
Allowed:twitchkicknull
platform_user_idstring | null
The donor's id on that platform, when signed in.
name_was_filteredboolean
message_was_filteredboolean
queued_atstring<date-time>
media_queuedboolean
Whether a media item was queued alongside.
400Validation failed (name/amount/message/media URL).
errorstringrequired
Human-readable message.
codestring
Machine-readable code (e.g. `missing_scope`, `not_in_queue`).
401Missing or invalid credential (`missing_api_key` / `invalid_api_key`, or `invalid_token` for an expired/revoked OAuth access token).
errorstringrequired
Human-readable message.
codestring
Machine-readable code (e.g. `missing_scope`, `not_in_queue`).
403The key lacks the required scope (`missing_scope`).
errorstringrequired
Human-readable message.
codestring
Machine-readable code (e.g. `missing_scope`, `not_in_queue`).
required_scopestring
429Rate limit exceeded - check the `RateLimit-*` headers.
errorstring
Request
curl -X POST "https://api.tippage.com/v1/tips" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "amount": 100000,
  "message": "string",
  "media_url": "http://example.com",
  "media_start_time": 0,
  "source": "kofi",
  "paid": false,
  "reference": "kofi_txn_8f3a2c"
}'
Response
{
  "tip": {
    "order_id": "tip_1755100000000_ab12cd",
    "name": "string",
    "amount": 5,
    "message": "string",
    "tts_url": "http://example.com",
    "is_replay": true,
    "is_sub_reward": true,
    "source": "string",
    "external_source": "string",
    "external_ref": "string",
    "is_paid": true,
    "platform": "twitch",
    "platform_user_id": "string",
    "name_was_filtered": true,
    "message_was_filtered": true,
    "queued_at": "2019-08-24T14:15:22Z"
  },
  "media_queued": true
}