全球音乐发行:即将上线!

首页收听探索
我的 TimTim.Live
登录

3,004,606+ 个艺术家页面 · 8,684,003+ 个商家页面 · 提供 417+ 种语言

全部 195 个国家的国旗
195 个国家233,870 个地点417+ 种语言

TimTim.Live Developer Preview

API Reference

An API is a door your program knocks on to ask TimTim.Live a question. Ask "events in Miami?" and it answers with a list, in a format called JSON. The address is https://api.timtim.live/v1. This page is read from the contract itself — TimTim.Live Partner API, version 1.0.0.

Authentication

Every question carries your key, so TimTim.Live knows who is asking. Send it in the Authorization header: Bearer tt_….

  • tt_test_…

    Sandbox. Sample events only. Free, made on the dashboard.

  • tt_pk_live_…

    Website key. Safe in a web page. Locked to your domains.

  • tt_sk_live_…

    Secret key. Server only. Never put it in a page or an app.

No key at all? GET /v1/demo/events answers anyone with sample events. Big companies can swap a name and password for a one-hour pass instead (OAuth, how). Most people do not need it.

Endpoints

MethodPathWhat it doesKey
GET/v1/eventsFind eventsyes
GET/v1/demo/eventsSample events, no keynone
GET/v1/demo/events/{id}One sample event, no keynone
GET/v1/categoriesWhich categories have eventsyes
GET/v1/locationsWhich cities have eventsyes
GET/v1/demo/categoriesSample categories, no keynone
GET/v1/demo/locationsSample cities, no keynone
POST/v1/trackSay what a visitor saw and clickednone
GET/v1/events/{id}One eventyes
GET/v1/earningsYour resultsyes
GET/v1/bulk/{file}A custom bulk feed — every event a saved subscription covers, in one gzipped fileyes
GET/v1/events/{id}/ticketsTicket types you may sell in your own app (embedded commerce)yes
POST/v1/ordersHold tickets for your buyer and get TimTim.Live's payment linkyes
GET/v1/orders/{id}The status of an order your company beganyes
GET/v1/settlementsYour monthly statements (custom settlement)yes
GET/v1/offersCard-linked offers (banks and rewards programmes)yes
POST/v1/oauth/tokenGet an access token (OAuth 2.0 client credentials)none
POST/v1/oauth/revokeEnd an access token early (RFC 7009)none
GET/v1/feeds/{file}The same events as a feedyes

Want to press buttons instead of writing code? Import our Postman collection. How.

Each row is one endpoint: 19 in all. Long lists come in pages, as { object: "list", events: […], next }. Send next back as cursor to get the next page (cursor).

Keeping up with changes

Ask GET /v1/events?changed_since=2026-10-06T10:00:00Z to get every event that changed after that time — including ones that ended or were cancelled. The answer also has a withdrawn list: events you may no longer show. Remove those ids. Or skip polling and use webhooks.

Status and availability

Every event has a status:

  • scheduled
  • postponed
  • rescheduled
  • cancelled
  • sold_out
  • completed

and tickets.availability: available, limited, sold_out, not_on_sale or ended. Hide the ticket button when it is sold_out or ended. See it happen.

Which events you get

Only events their organizers sell on TimTim.Live, that are published and public, and whose organizers left partner sharing on. Each event says so in can_share. Test keys get sample events only.

Webhooks

A webhook is a message TimTim.Live sends to your server when something happens: event.changed, earnings.changed, conversion.postback. Add webhook addresses on the dashboard.

Verify the signature

Each message carries a seal made with a secret only you and TimTim.Live know. Check it before you trust the message. The code below does it. The details: every delivery has TimTim-Signature: t=…,v1=…. v1 is HMAC-SHA256 of t + "." + the raw body with your webhook secret. Refuse it if the time is more than 5 minutes off, and use TimTim-Delivery-Id to ignore repeats.

Node — the same check TimTim.Live's own tests use
// Node — Express with the RAW body (do not JSON.parse before checking)
import crypto from "node:crypto";

app.post("/timtim", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("TimTim-Signature") ?? "";           // t=1700000000,v1=<hex>
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const body = req.body.toString("utf8");
  const expected = crypto.createHmac("sha256", process.env.TIMTIM_WEBHOOK_SECRET)
    .update(`${parts.t}.${body}`).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300;
  const same = expected.length === (parts.v1 ?? "").length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
  if (!fresh || !same) return res.sendStatus(400);

  const message = JSON.parse(body);                            // { id, type, mode, data }
  if (alreadyHandled(req.get("TimTim-Delivery-Id"))) return res.sendStatus(200);
  // message.type === "event.changed"    → message.data.event
  // message.type === "earnings.changed" → message.data.earning
  res.sendStatus(200);
});

Retries

Reply "got it" (any 2xx code) within 10 seconds. If you do not, we try again after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, 24 h — 8 tries in all. Test keys' webhooks retry the same way.

Rate limits

A rate limit is how many questions a key may ask in one minute.

  • Test keys: 60 requests a minute.
  • Live keys: 120 a minute (1200 for approved high-volume partners).
  • Website keys count each visitor on their own: 120 a minute per visitor, and up to 6000 a minute for the whole site.

The same question from a website key gets the same answer for 30 seconds. So a busy page is fast, and new events show up within half a minute.

Too many? You get 429 and a Retry-After header in seconds. Wait that long. See a real 429.

Errors

When something goes wrong, the answer says what happened (title) and what to do next (detail). It also has a code and a request_id. Send us the request id and we can find it. Technically it is application/problem+json (error answer). Every error code.

Are you representing a company?

Learn how TimTim.Live distribution partnerships work.

Partner Program →

我们的使命

让世界比我们发现它时更美好

我们邀请每个人共同为人类留下传承。

加入三项将比我们更长久的使命

家园

🏠 家园

播种希望

帮助每个家庭拥有一个可称之为家的住所——由我们的免税非营利机构 OseloHelp.com 提供资金支持。

记忆

🎵 记忆

通过音乐保存人类遗产

将人类的音乐与故事保存逾千年。

未来

🚀 未来

激励下一代探索者

让每个人都有探索太空的机会。

AdMerk Spacecraft 概念技术图

我们正在设计的航天器

一种从跑道起飞、而非由火箭发射的太空飞机设计。这是一个概念,尚未建成。

了解它如何运作

它们如何相互连接

TimTim.Live 飞轮

这里没有独立的业务——每个环节都增强下一个环节。

  1. 🎵音乐与创作者
  2. 🌍全球社区
  3. 💰收入
  4. 🏠可负担住房
  5. 📜保护文化
  6. 🚀未来技术
  7. 📖更多故事
  8. 🎶更多音乐

一个使命,多项相互强化的业务。

  1. 1音乐创造社区。
  2. 2社区建立信任。
  3. 3信任支持商业。
  4. 4商业为长期使命提供资金。
  5. 5长期使命创造值得分享的故事。
  6. 6这些故事吸引更多社区参与。

成为这份传承的一部分

无论你是聆听一首歌、分享一个故事、穿戴周边、参加演出、翻译歌词、推荐一个国家,还是只是告诉朋友——你都成为了一个为世代传承而打造事业的一部分。

人人皆可参与。没有任何贡献太微小。

TimTim.Live — 用音乐探索世界。

连接全球 195 个国家的人们——目前已有 3,004,606+ 个艺术家页面,将扩展至 400 万以上 · 8,684,003+ 个商家页面,将扩展至 4 亿 · 本站将翻译成全球 417 种地方语言。

TimTim.Live 已收录全部 195 个国家的 233,870 个地点,覆盖小至 1,000 人的社区,其中包括:

257 个州 • 1,690 个省 • 4,808 个县 • 41,161 个区 • 13,471 座城市 • 117,896 个城镇 • 40,988 个村庄

© 2026 TimTim.Live. 版权所有。