फ़ीचर
प्रतीक्षा अलर्ट
जब किसी जगह का लाइव इंतज़ार आपकी सीमा से नीचे आता है, Waity आपके वेबहुक को कॉल करता है, ताकि एजेंट को बार-बार पूछना न पड़े। हर प्लान में ये हैं, Free में भी।
यह कैसे काम करता है
एक जगह के लिए मिनट में सीमा और एक https वेबहुक के साथ अलर्ट बनाएँ। हर मिनट नया डेटा आने के बाद, Waity उन जगहों की जाँच करता है जिन्हें अभी नई रीडिंग मिली है, और जब इंतज़ार सीमा पर या उससे नीचे हो, तो आपके वेबहुक पर साइन की हुई JSON बॉडी POST करता है।
अलर्ट वही लाइव जवाब पढ़ता है जो GET /v1/places/{id} देता है, इसलिए यह कभी API से अलग बात नहीं कहता। यह तभी ट्रिगर होता है जब now.usable true हो, इकाई मिनट हो और now.value ज़्यादा से ज़्यादा under हो। न्यूनतम मान (“60 से ज़्यादा”), पुराना या रुका हुआ नंबर, बंद जगह या डेटा न होना कभी अलर्ट ट्रिगर नहीं करता।
अलर्ट बनाएँ
API कुंजी और JSON बॉडी के साथ POST /v1/alerts। जवाब में अलर्ट मिलता है, उसकी id और साइनिंग सीक्रेट के साथ। सीक्रेट एक बार दिखता है: इसे वहाँ रखें जहाँ आपका वेबहुक इसे पढ़ सके।
| फ़ील्ड | क्या लेता है |
|---|---|
place_id | एक जगह, लेन या विभाग। एयरपोर्ट, बॉर्डर पोर्ट या अस्पताल कैंपस का कोई एक इंतज़ार नहीं होता, इसलिए उसकी id अस्वीकार की जाती है, उसकी लेन या विभाग की id के साथ। |
under | पूरे मिनट, 1 से 600 तक। |
webhook_url | Waity कहाँ POST करता है। सिर्फ़ https; नीचे के नियम देखें। |
repeat | false (डिफ़ॉल्ट) एक बार ट्रिगर होता है, फिर अलर्ट fired हो जाता है। true तब दोबारा ट्रिगर होता है जब इंतज़ार सीमा से 5 मिनट से ज़्यादा ऊपर जा चुका हो, ज़्यादा से ज़्यादा हर 30 मिनट में एक बार। |
expires_at | वैकल्पिक, ISO 8601। डिफ़ॉल्ट अभी से 24 घंटे है, सबसे ज़्यादा 30 दिन। |
curl -X POST "https://api.waity.ai/v1/alerts" \
-H "X-Api-Key: $WAITY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"place_id":"pl_nvk0wkb3ps","under":30,"webhook_url":"https://example.com/waity/webhook"}'
201जवाब
{
"id": "al_3k9qx2m7t4p8w1za",
"place": {
"id": "pl_nvk0wkb3ps",
"name": "Ysleta Passenger Vehicles, Standard",
"category": "border"
},
"under": 30,
"unit": "min",
"repeat": false,
"webhook_url": "https://example.com/waity/webhook",
"status": "armed",
"created_at": "2026-10-31T19:02:11Z",
"expires_at": "2026-11-01T19:02:11Z",
वेबहुक URL के नियम
अलर्ट को निजी नेटवर्क तक पहुँचने से रोकने के लिए, Waity ऐसा वेबहुक URL अस्वीकार करता है जो:
- डिफ़ॉल्ट पोर्ट (443) पर https इस्तेमाल न करे, या जिसमें यूज़र नेम या पासवर्ड हो;
- होस्ट नेम की जगह IP पता इस्तेमाल करे, इसलिए निजी, loopback, link-local और क्लाउड मेटाडेटा पते सभी अस्वीकार होते हैं;
- localhost, एक ही लेबल वाला नाम, या .local, .internal, .lan या .home.arpa जैसा निजी या आरक्षित नाम इस्तेमाल करे;
- ख़ुद Waity की ओर इशारा करे।
Waity ख़ुद कोई नाम resolve नहीं करता और कभी रीडायरेक्ट फ़ॉलो नहीं करता: 3xx जवाब को असफल डिलीवरी गिना जाता है।
सूची, पढ़ें और हटाएँ
GET /v1/alerts आपके अलर्ट लौटाता है, सबसे नया पहले, उनकी स्थिति और आख़िरी डिलीवरी के साथ। एक खाते की कुंजियाँ एक ही सूची साझा करती हैं; बिना खाते वाली कुंजी की अपनी सूची होती है। GET /v1/alerts/{id} एक अलर्ट पढ़ता है, और DELETE /v1/alerts/{id} उसे हटाता है और उसकी डिलीवरी रोक देता है।
curl
curl "https://api.waity.ai/v1/alerts" \
-H "X-Api-Key: $WAITY_API_KEY"
curl -X DELETE "https://api.waity.ai/v1/alerts/al_3k9qx2m7t4p8w1za" \
-H "X-Api-Key: $WAITY_API_KEY"
| स्थिति | क्या लेता है |
|---|---|
armed | इंतज़ार के सीमा से नीचे आने की प्रतीक्षा में। |
fired | एक बार वाला अलर्ट जो ट्रिगर हो चुका है। |
expired | बिना ट्रिगर हुए अपना expires_at पार कर चुका है। |
failing | पिछली डिलीवरी की कोशिश असफल रही; last_delivery देखें। जब तक कोशिशें बाकी हैं, दोबारा कोशिश होती रहेगी। |
disabled | लगातार 20 डिलीवरी कोशिशें असफल रहीं। आपका वेबहुक काम करने लगे, तो नया अलर्ट बनाएँ। |
वेबहुक
हर डिलीवरी JSON बॉडी वाला एक POST है। यूज़र को पहले warnings बताएँ, फिर summary। now.value now.usable_until तक मान्य है; उसके बाद GET /v1/places/{id} से फिर पूछें।
POST
{
"type": "wait.under",
"alert": {
"id": "al_3k9qx2m7t4p8w1za",
"under": 30
},
"place": {
"id": "pl_nvk0wkb3ps",
"name": "Ysleta Passenger Vehicles, Standard",
"category": "border",
"url": "https://waity.ai/places/ysleta-passenger-vehicles-standard-kb3ps"
},
"now": {
"value": 25,
"unit": "min",
"measured_at": "2026-10-31T13:58:00-06:00",
"usable_until": "2026-10-31T15:28:00-06:00",
"basis": "estimate"
},
"summary": "About 25 min to enter the US, estimated by the border agency, updated 2 min ago.",
"warnings": [],
"links": {
"place": "https://api.waity.ai/v1/places/pl_nvk0wkb3ps",
"page": "https://waity.ai/places/ysleta-passenger-vehicles-standard-kb3ps",
"alert": "https://api.waity.ai/v1/alerts/al_3k9qx2m7t4p8w1za",
"docs": "https://waity.ai/docs/alerts"
}
}
हर रिक्वेस्ट में ये हेडर होते हैं:
Waity-Signature: t=<unix>,v1=<hex>:tसाइन करने का समय है, unix सेकंड में;v1उस स्ट्रिंग का HMAC-SHA256 है जोt, एक डॉट और कच्ची बॉडी से बनती है, और इसकी कुंजी अलर्ट का पूरा सीक्रेट है।Waity-Alert: अलर्ट की id।Waity-Delivery: डिलीवरी की id, हर दोबारा कोशिश पर वही, ताकि आप डुप्लिकेट हटा सकें।
सिग्नेचर जाँचें
JSON पार्स करने से पहले कच्चे बाइट्स पर सिग्नेचर जाँचें, constant time में तुलना करें, और 5 मिनट से पुराना t अस्वीकार करें।
import crypto from "node:crypto";
import express from "express";
const app = express();
const secret = process.env.WAITY_ALERT_SECRET; // whsec_…
// The raw body: the signature covers the exact bytes Waity sent.
app.post("/waity/webhook", express.raw({ type: "application/json" }), (req, res) => {
const parts = Object.fromEntries(
(req.get("Waity-Signature") ?? "").split(",").map((p) => p.split("=", 2)),
);
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${req.body}`)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300;
const ok =
fresh &&
typeof parts.v1 === "string" &&
parts.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
if (!ok) return res.status(400).end();
const event = JSON.parse(req.body);
// Read event.warnings first, then event.summary.
res.status(204).end();
});
app.listen(3000);
दोबारा कोशिशें
10 सेकंड के अंदर किसी भी 2xx से जवाब दें। बाकी कुछ भी असफल कोशिश है, जिसे लगभग 1, 5, 25 मिनट बाद दोबारा आज़माया जाता है। लगातार 20 असफल कोशिशों के बाद अलर्ट बंद कर दिया जाता है।
हर प्लान की सीमाएँ
हर प्लान में एक साथ तय संख्या में सक्रिय अलर्ट रखे जा सकते हैं। एक और बनाने पर 409 alert_limit जवाब मिलता है, एक मैसेज के साथ जो आपके प्लान की सीमा बताता है। अलर्ट की हर रिक्वेस्ट एक कॉल गिनी जाती है; डिलीवरी कभी नहीं गिनी जातीं। बिना खाते वाली कुंजी Free गिनी जाती है।
| प्लान | सक्रिय अलर्ट |
|---|---|
| Free | 1 |
| Plus | 10 |
| Pro | 100 |
| Team | 1,000 |
ER और अर्जेंट केयर
ER और अर्जेंट केयर के अलर्ट में, हर डिलीवरी का warnings[0] 911 वाली लाइन होता है, एक बार कहा गया, जैसा हर ER जवाब में होता है।
संबंधित
आगे इतिहास से बताता है कि इंतज़ार कब घटना चाहिए। जवाब पढ़ना हर फ़ील्ड समझाता है, और हर फ़ील्ड API रेफ़रेंस में है।