Finish a TTS
Promotes the TTS from queue to history and frees the now-playing slot (when it points at this one). Fires queue.tts.finished. Idempotent - finishing an already-gone TTS succeeds with tip: null. Finishing means “this played” - if it didn’t (your effect failed), use release to put it back instead. Requires tts:control.
POST
/tts/{orderId}/finishAuthorization
AuthorizationBearer token (tp_live_... or tpat_...) · headerrequiredA 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.
Path parameters
orderIdstringrequiredThe tip's order id (e.g. `tip_1755100000000_ab12cd`) - the only external row reference.
Responses
200Finished.
successbooleantipQueueTip | anyShow propertiesHide properties
One of:
QueueTip
order_idstringnamestringDisplay name (post-filter).
amountnumber | nullmessagestring | nullThe tip message (post-filter - what shows on stream).
tts_urlstring<uri> | nullPre-rendered audio; `null` until rendering completes.
is_replaybooleanis_sub_rewardbooleansourcestringWhere 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 | nullDeveloper-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 | nullDeveloper-API tips only - the caller's own payment reference.
is_paidbooleanReal 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 | nullThe platform of the account the donor was signed in with when they tipped; `null` for an unattributed tip.
Allowed:
twitchkicknullplatform_user_idstring | nullThe donor's id on that platform, when signed in.
name_was_filteredbooleanmessage_was_filteredbooleanqueued_atstring<date-time>any
any401Missing or invalid credential (`missing_api_key` / `invalid_api_key`, or `invalid_token` for an expired/revoked OAuth access token).
errorstringrequiredHuman-readable message.
codestringMachine-readable code (e.g. `missing_scope`, `not_in_queue`).
403The key lacks the required scope (`missing_scope`).
errorstringrequiredHuman-readable message.
codestringMachine-readable code (e.g. `missing_scope`, `not_in_queue`).
required_scopestring429Rate limit exceeded - check the `RateLimit-*` headers.
errorstringRequest
curl -X POST "https://api.tippage.com/v1/tts/string/finish" \
-H "Authorization: Bearer YOUR_TOKEN"const response = await fetch("https://api.tippage.com/v1/tts/string/finish", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_TOKEN"
}
});import requests
response = requests.post(
"https://api.tippage.com/v1/tts/string/finish",
headers={
"Authorization": "Bearer YOUR_TOKEN"
},
)Response
{
"success": true,
"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"
}
}{
"error": "string",
"code": "string"
}{
"error": "string",
"code": "string",
"required_scope": "string"
}{
"error": "string"
}