
🏠 خانه
امید بسازید
کمک کنید هر خانواده جایی برای خانه نامیدن داشته باشد — با پشتیبانی مالی OseloHelp.com، سازمان غیرانتفاعی و معاف از مالیات ما.
Global Music Distribution Coming Soon!
اولین اتصال شما در یک صفحه جا میشود.
این نشانی را در مرورگر خود باز کنید. فوراً رویدادهای نمونه را میبینید.
https://timtim.live/api/partner-network/demo?city=Washingtonوارد شوید، به ما بگویید چه کسی هستید و ساخت کلید آزمایشی را بزنید. این کلید با tt_test_ شروع میشود و فقط رویدادهای نمونه را میبیند.
رویدادهای یک شهر را بخواهید.
curl "https://api.timtim.live/v1/events?city=Washington&category=music" \
-H "Authorization: Bearer tt_test_YOUR_KEY"هر رویداد نام، تاریخ، مکان، عکس، قیمت و برچسبهای آماده برای کارت شما دارد.
از buy_url که به شما میدهیم استفاده کنید. همین. TimTim.Live ثبت منبع فروش را داخل همان لینک انجام میدهد.
تعداد افرادی که فرستادید، بلیتهای فروختهشده و درآمد را در داشبورد خود ببینید، یا آنها را درخواست کنید.
GET https://api.timtim.live/v1/earningshttps://api.timtim.live/v1کلید خود را در هدر Authorization بفرستید. کلیدهای آزمایشی (tt_test_) فقط رویدادهای نمونه را میبینند. کلیدهای سایت (tt_pk_live_) میتوانند در یک صفحه وب باشند و فقط رویدادها را میخوانند. کلیدهای سرور (tt_sk_live_) روی سرور شما میمانند و درآمد را هم میخوانند. ما هر کلید را فقط یک بار نشان میدهیم — آن را امن نگه دارید.
curl "https://api.timtim.live/v1/events?city=Washington&category=music" \
-H "Authorization: Bearer tt_test_YOUR_KEY"const res = await fetch("https://api.timtim.live/v1/events?city=Washington&category=music", {
headers: { Authorization: "Bearer tt_test_YOUR_KEY" },
});
const { events, next } = await res.json();
for (const event of events) {
console.log(event.name, event.display.date_label, event.tickets.buy_url);
}// Node 18+ — keep server keys (tt_sk_live_) on the server
const res = await fetch("https://api.timtim.live/v1/events?city=Washington", {
headers: { Authorization: `Bearer ${process.env.TIMTIM_KEY}` },
});
if (!res.ok) {
const problem = await res.json();
throw new Error(`${problem.title} (${problem.request_id})`);
}
const { events } = await res.json();import os, requests
res = requests.get(
"https://api.timtim.live/v1/events",
params={"city": "Washington", "category": "music"},
headers={"Authorization": f"Bearer {os.environ['TIMTIM_KEY']}"},
)
res.raise_for_status()
for event in res.json()["events"]:
print(event["name"], event["tickets"]["buy_url"])<?php
$ch = curl_init("https://api.timtim.live/v1/events?city=Washington&category=music");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . getenv("TIMTIM_KEY")]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);
foreach ($data["events"] as $event) {
echo $event["name"] . " " . $event["tickets"]["buy_url"] . PHP_EOL;
}citycountrycategoryfromtochanged_sincecommissionedminimum_earningsnearlimitزمان آخرین همگامسازی را ذخیره کنید و آن را بهعنوان changed_since بفرستید. فقط رویدادهایی را میگیرید که تغییر کردهاند — از جمله لغوشدهها و اجراهای تمامشده. به webhook نیاز نیست. رویدادهایی که باید نمایششان را متوقف کنید در فهرست withdrawn میآیند.
GET https://api.timtim.live/v1/events?changed_since=2026-10-06T10:00:00Zاگر پاسخ next دارد، آن را بهعنوان cursor= برگردانید تا صفحه بعد را بگیرید. وقتی next خالی است، همه چیز را دارید.
GET https://api.timtim.live/v1/events?city=Paris&cursor=eyJtIjoiZCIs…هر رویداد earn دارد. اگر earn.eligible برابر false باشد، رویداد پاداشی ندارد — ولی نشان دادنش هنوز ارزش دارد. اگر true باشد، earn.description میگوید چه میگیرید، مثلاً "$5 برای هر بلیت واجد شرایط". اگر پول خرید برگردانده شود، پاداش هم برگشت میخورد.
یک فید یکجا را در داشبورد خود ذخیره کنید، سپس همهٔ رویدادهای آن را در یک فایل فشرده دانلود کنید: GET /v1/bulk/FEED_ID.ndjson.gz یا .csv.gz، با کلید سرور خود. برای گرفتن فقط تغییرها، ?changed_since= اضافه کنید، شامل رویدادهای برداشتهشده. کلیدهای آزمایشی همین حالا میتوانند امتحانش کنند؛ استفادهٔ واقعی به بررسی TimTim.Live نیاز دارد.
GET https://api.timtim.live/v1/bulk/bfs_YOURFEED.ndjson.gz?changed_since=2026-10-06T00:00:00Zشریکهای بزرگ میتوانند خریداران را در اپ خودشان نگه دارند. با GET /v1/events/EVENT_ID/tickets بپرسید چه چیزی برای فروش هست، سپس POST /v1/orders را با انتخاب خریدار بفرستید. یک لینک پرداخت TimTim.Live میگیرید تا برای خریدار باز کنید؛ فروش مستقیم به حساب شرکت شما ثبت میشود. کلیدهای آزمایشی همین حالا میتوانند آن را امتحان کنند. استفادهٔ واقعی به بررسی TimTim.Live و روشن بودن پرداخت با کارت نیاز دارد.
POST https://api.timtim.live/v1/orders (Idempotency-Key: …) {"event_id": "evt_test_washington_konpa", "ticket_type_id": "tt_test_washington_konpa", "quantity": 2, "buyer_email": "…", "buyer_name": "…"}GET /v1/offers هر رویدادی را که پاداش میدهد به شکل یک پیشنهاد میدهد: برگزارکننده، تاریخهایی که میشود خرید کرد، قیمت، مکان و پاداش. مشتری شما آن را از طریق لینک قابلپیگیری شما فعال میکند، و پاداش از طریق /v1/earnings به شرکت شما پرداخت میشود. کلیدهای آزمایشی پیشنهادهای نمونه میبینند. پیشنهادهای واقعی به بررسی TimTim.Live نیاز دارند. تطبیق مستقیم پرداختهای کارتی به توافق با یک شبکهٔ کارت یا بانک نیاز دارد، و وصل نشده است.
GET https://api.timtim.live/v1/offers?country=USمقدار status یکی از scheduled، postponed، rescheduled، cancelled، sold_out یا completed است. مقدار tickets.availability یکی از available، limited، sold_out، not_on_sale یا ended است. وقتی رویدادی لغو شد، آن را بردارید.
GET https://api.timtim.live/v1/events/evt_test_washington_konpaکلیدهای آزمایشی: 60 درخواست در دقیقه. کلیدهای واقعی: 120 در دقیقه. سریعتر از این، پاسخ 429 با Retry-After میگیرد، یعنی تعداد ثانیههایی که باید صبر کنید.
رویدادهایی که برگزارکنندگان TimTim.Live میسازند و تصمیم میگیرند به اشتراک بگذارند. رویدادهایی که از سایتهای دیگر فروش بلیت وارد کردهایم هرگز شامل نمیشوند، چون ما حق اشتراکگذاری آنها را نداریم.
نام خریداران، نشانی ایمیل، نشانی خانه، شماره تلفن و اطلاعات کارت. Partner API اطلاعات رویدادها را به اشتراک میگذارد، نه اعضای ما را.
یک خط HTML رویدادها را در هر سایتی نشان میدهد. از کلید سایت (tt_pk_live_) استفاده کنید و سایت خود را به فهرست مجاز کلید اضافه کنید. بدون کلید، رویدادهای نمونه نشان داده میشود.
<script src="https://timtim.live/widget/events.js"
data-key="tt_pk_live_YOUR_WEBSITE_KEY"
data-city="Washington" data-category="music" async></script>گزینهها: data-city، data-country، data-category، data-limit (1–24)، data-earn="true"، data-lang و data-color.
اختیاری است. در داشبورد خود یک کلاینت OAuth بسازید. بعد شناسه کلاینت و رمز آن را با یک توکن دسترسی یکساعته عوض کنید و آن توکن را به جای کلید بفرستید. رمز هرگز همراه درخواستهای API شما نمیرود، و میتوانید دسترسیهای (scopes) کمتری از آنچه کلاینت دارد بخواهید.
# 1. Trade the client ID and secret for a one-hour token
curl -u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=client_credentials -d "scope=events:read events:details" \
https://api.timtim.live/v1/oauth/token
# → {"access_token":"tt_at_…","token_type":"Bearer","expires_in":3600,"scope":"events:read events:details"}
# 2. Use the token exactly like a key
curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://api.timtim.live/v1/events?city=Washington"برای پایان دادن زودتر به یک توکن، آن را با POST به /v1/oauth/revoke بفرستید، با همان شناسه کلاینت و رمز. اگر کلاینت را در داشبورد خود خاموش کنید، همه توکنهای آن یکجا تمام میشوند.
اختیاری. در داشبورد خود، زیر یک کلید سرور، کلید آزمایشی یا کلاینت OAuth، بخش «قفل روی سرورهای من» را باز کنید و آدرسهای عمومی سرورهایتان را بنویسید. درخواستها — و درخواستهای token — از هر جای دیگر با ip_not_allowed رد میشوند، حتی با کلید درست.
گواهیهای کلاینت (mTLS): گواهی کلاینت TLS خود را به یک کلید وصل کنید، بعد با آن به https://api.timtim.live درخواست بفرستید. هر درخواست باید آن گواهی را نشان دهد؛ دستدهی TLS ثابت میکند که کلید خصوصی آن را دارید.
# Your certificate's SHA-256 — paste this (or the PEM) under "Lock to my servers"
openssl x509 -in client.crt -noout -fingerprint -sha256
# Every call then presents the certificate
curl --cert client.crt --key client.key \
-H "Authorization: Bearer $KEY" "https://api.timtim.live/v1/events?city=Washington"از WordPress استفاده میکنید؟ TimTim.Live Events را نصب کنید: یک بلوک و یک کد کوتاه که رویدادها را با لینکهای بلیت TimTim.Live خودتان نشان میدهند. آن را TimTim.Live ساخته است، فقط با timtim.live ارتباط دارد و فقط از timtim.live بهروز میشود.
فایل را در افزونهها → افزودن → بارگذاری افزونه بارگذاری کنید. کلید سایت خود را در تنظیمات → TimTim.Live Events بچسبانید و Test Connection را بزنید. سپس بلوک TimTim.Live Events را به هر صفحهای اضافه کنید.
دانلود افزونه WordPress[timtim_events city="Washington" category="music" limit="6"]همان رویدادها به شکل JSON Feed، RSS، XML، CSV یا یک تقویم (.ics) که Google Calendar، Apple Calendar و Outlook میتوانند مشترکش شوند. فیدخوانها نمیتوانند هدر بفرستند، پس کلید سایت یا کلید آزمایشی را در ?key= بگذارید. هرگز کلید سرور را در لینک نگذارید.
https://timtim.live/v1/feeds/events.json?key=tt_pk_live_YOUR_KEY&city=Paris
https://timtim.live/v1/feeds/events.rss?key=tt_pk_live_YOUR_KEY&city=Paris
https://timtim.live/v1/feeds/events.xml?key=tt_pk_live_YOUR_KEY&city=Paris
https://timtim.live/v1/feeds/events.csv?key=tt_pk_live_YOUR_KEY&city=Paris
https://timtim.live/v1/feeds/events.ics?key=tt_pk_live_YOUR_KEY&city=Parisدر داشبورد خود روی «افزودن نشانی» بزنید؛ هر وقت چیزی تغییر کند به آن نشانی پیام میفرستیم: event.changed یا earnings.changed. Webhookها اختیاریاند — changed_since همان اطلاعات را به شما میدهد.
{
"id": "whd_8Fk2mQxR7tLp",
"type": "event.changed",
"created_at": "2026-10-06T15:04:05.000Z",
"mode": "live",
"data": {
"event": {
"id": "ev_…",
"name": "…",
"status": "cancelled",
"tickets": {
"availability": "ended",
"buy_url": "https://timtim.live/b/…"
},
"…": "the same event object as GET /v1/events"
}
}
}هر پیام را بررسی کنید: با رمز مخفی شما امضا شده است. پیامهای قدیمیتر از پنج دقیقه را نپذیرید، و TimTim-Delivery-Id را که قبلاً پردازش کردهاید نادیده بگیرید.
// 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);
});ظرف 10 ثانیه با هر کد 2xx پاسخ دهید. اگر نه، بعد از 1 دقیقه، 5 دقیقه، 30 دقیقه، سپس 2، 6، 12 و 24 ساعت دوباره امتحان میکنیم و بعد متوقف میشویم. ما هرگز تغییر مسیر را دنبال نمیکنیم.
کلیدهای آزمایشی رویدادهای نمونه با برچسب رویداد آزمایشی — بدون پول واقعی میگیرند. یک buy_url را باز کنید، خرید بلیت آزمایشی را بزنید، بعد درآمد خود را درخواست کنید. یک بازپرداخت شبیهسازی کنید و ببینید که برگشت میخورد.
خطاها با کلمات ساده خودشان را توضیح میدهند، با یک عنوان و کاری که باید بعد انجام دهید. هر پاسخ یک TimTim-Request-Id دارد. آن را برای ما بفرستید تا درخواست شما را پیدا کنیم.
missing_keyPlease add your TimTim.Live key. Send it as: Authorization: Bearer tt_test_… — get a test key at /partners/dashboard.invalid_keyWe do not recognise that key. Check you copied the whole key, or make a new one at /partners/dashboard.revoked_keyThat key was switched off. Make a new key at /partners/dashboard.partner_inactiveThis partner account cannot use live keys right now. Your test key still works. Contact TimTim.Live partnerships to review the account.missing_scopeThis key is not allowed to do that. Earnings need a secret key (tt_sk_live_…) or a test key, used from your server.domain_not_allowedThis website is not allowed to use this key. Add the website to the key's allowed domains at /partners/dashboard.unknown_parameterWe do not know one of those parameters. See /partners/docs for the list.invalid_countryWe could not read that country. Use a two-letter code, for example country=US or country=FR.invalid_dateWe could not read that date. Dates look like 2026-10-20.invalid_changed_sinceWe could not read changed_since. Use a full time, for example changed_since=2026-10-06T10:00:00Z.invalid_booleanThat value must be true or false. For example commissioned=true.invalid_numberThat value must be a number. For example minimum_earnings=5.invalid_nearWe could not find that place. Try near=Paris,FR or city=Paris&country=FR.invalid_locationWe could not read that location. Send lat, lng and optionally radius in kilometres.invalid_limitlimit must be between 1 and 100. Leave it out to get 20.invalid_cursorThat cursor is not one we gave you. Use the `next` value from the previous page exactly as it came.event_not_foundWe could not find that event. It may have been removed, or it is not shared with partners.capability_requiredCard-linked offers are not switched on for your account. Offers are an enterprise feature. Your test key shows sample offers now; ask TimTim.Live partnerships to review your account for live offers.server_key_requiredThis is for your server only. Use a secret key (tt_sk_live_…) or a test key from your server, never a website key in a web page.commerce_not_enabledSelling tickets in your own app is not switched on for your account. This is an enterprise feature (EMBEDDED_CHECKOUT). Your test key can try it now; ask TimTim.Live partnerships to review your account. Until then, use each event's buy_url.checkout_not_openCard payments are not open on TimTim.Live yet. Send the buyer to the event's buy_url instead. Your test key can still rehearse orders.ticket_not_availableThat ticket cannot be bought right now. It may be sold out, not on sale yet, or no longer on sale. Ask /v1/events/{id}/tickets for what is on sale now.order_invalidWe could not read that order. See /partners/docs for the fields an order needs.idempotency_key_requiredPlease send an Idempotency-Key header. 8 to 80 letters, digits, - or _. Send the same key again to retry safely — you will get the same order, never a second one.order_not_foundWe could not find that order. Only orders your company began with this kind of key (test or live) can be read here.bulk_not_enabledBulk feeds are not switched on for your account. This is an enterprise feature (BULK_FEEDS). Your test key can try it now; ask TimTim.Live partnerships to review your account. Until then, page through /v1/events or the feeds.bulk_not_foundWe could not find that bulk feed. Use the address shown on /partners/dashboard: /v1/bulk/<subscription id>.ndjson.gz or .csv.gz.bulk_too_soonA full file was made for this feed a few minutes ago. Full files can be made every 15 minutes. For what changed since, add changed_since=<time> — that is not limited.event_withdrawnThis event is no longer shared with partners. Stop showing it and remove its buy_url. Nothing else is needed — your old link still takes people to the event page.invalid_trackWe could not read that tracking signal. Send {"type":"impression"}, {"type":"event_view","event_id":"…"} or {"type":"event_click","event_id":"…"}. Sales are recorded by TimTim.Live, never sent from a page.not_foundThere is nothing at this address. The Partner API lives at /v1/events, /v1/events/{id}, /v1/offers and /v1/earnings.method_not_allowedThis address does not answer that method. The Allow header lists the methods it answers.key_in_urlSend your key in the Authorization header. Only /v1/feeds reads a key from the URL (?key=). Everywhere else use Authorization: Bearer <key> — keys in URLs end up in logs.ip_not_allowedThis key only works from your listed servers. Call from an address on the key's allowlist, or change the list at /partners/dashboard.certificate_requiredThis key needs your client certificate. Connect to https://api.timtim.live with the TLS client certificate pinned to this key.certificate_mismatchThat is not the certificate pinned to this key. Use the certificate whose SHA-256 is on your dashboard, or pin the new one there.rate_limitedToo many requests — please slow down. Wait the number of seconds in Retry-After, then try again.server_errorSomething went wrong on our side. Please try again. If it keeps happening, send us your TimTim Request ID.کلید آزمایشی شما فوراً کار میکند. برای کلیدهای واقعی، یک نفر در TimTim.Live نام شرکت، وبسایت و روش نشان دادن رویدادهای شما را نگاه میکند. جواب را در داشبورد خود میبینید.
نسخهٔ 1 فقط بزرگتر میشود. ما چیزهای تازه اضافه میکنیم. چیزی را که از قبل هست حذف نمیکنیم و نامش را عوض نمیکنیم.
هدف ما
از همه دعوت میکنیم تا در بهجا گذاشتن میراثی برای بشریت کمک کنند.
به سه مأموریتی بپیوندید که از همه ما بیشتر عمر میکنند

امید بسازید
کمک کنید هر خانواده جایی برای خانه نامیدن داشته باشد — با پشتیبانی مالی OseloHelp.com، سازمان غیرانتفاعی و معاف از مالیات ما.

حفظ بشریت از راه موسیقی
موسیقی و داستانهای بشر را برای بیش از ۱٬۰۰۰ سال آینده حفظ کنید.

الهامبخش نسل بعدی کاوشگران باشید
فرصت کاوش فضا را برای همه فراهم کنید.

طرح یک هواپیمای فضایی که به جای پرتاب با موشک، از باند پرواز بلند میشود. این یک ایده است، نه فضاپیمایی ساختهشده.
ببینید چگونه کار میکندهمه چیز چگونه به هم وصل است
هیچ چیز اینجا کسبوکاری جدا نیست — هر مرحله مرحله بعد را قویتر میکند.
یک هدف. کسبوکارهای بسیاری که یکدیگر را تقویت میکنند.
چه به آهنگی گوش دهید، داستانی را به اشتراک بگذارید، محصولات را بپوشید، به کنسرتی بروید، شعر ترانهای را ترجمه کنید، کشوری را پیشنهاد دهید یا فقط به دوستی بگویید — بخشی از چیزی میشوید که برای ماندن در نسلها ساخته شده است.
همه میتوانند شرکت کنند. هیچ کمکی کوچک نیست.
TimTim.Live — جهان را با موسیقی کاوش کنید.
TimTim.Live هماکنون ۲۳۳٬۸۳۹ مکان را در همه ۱۹۵ کشور روی نقشه آورده و به جوامعی با جمعیت تنها ۱٬۰۰۰ نفر هم میرسد، از جمله:
۲۵۷ ایالت • ۱٬۶۹۰ استان • ۴٬۸۰۸ شهرستان • ۴۱٬۱۳۰ ناحیه • ۱۳٬۴۷۱ شهر • ۱۱۷٬۸۹۶ شهرک • ۴۰٬۹۸۸ روستا
© 2026 TimTim.Live. تمامی حقوق محفوظ است.