डेवलपर
वेबहुक और Zapier
जैसे ही आपके वर्कस्पेस में कुछ होता है, जैसे कोई ऐप पॉज़ किया जाता है या किसी स्मार्ट लिंक पर क्लिक होता है, वेबहुक आपके सर्वर को एक HTTP रिक्वेस्ट भेजते हैं। इनसे आप अपने सिस्टम अपडेट कर सकते हैं, Slack पर पोस्ट कर सकते हैं, या बिना सर्वर लिखे mapps.one को Zapier, Make या n8n से जोड़ सकते हैं। वेबहुक Studio प्लान पर उपलब्ध हैं, और हर वर्कस्पेस में 10 एंडपॉइंट तक जोड़े जा सकते हैं।
एंडपॉइंट जोड़ें
- डैशबोर्ड में डेवलपर → वेबहुक खोलें और एंडपॉइंट जोड़ें चुनें। वर्कस्पेस मालिक और एडमिन यह कर सकते हैं।
- एक पब्लिक
httpsURL डालें, भेजे जाने वाले इवेंट चुनें (या सभी इवेंट) और एक विवरण जोड़ें। - साइनिंग सीक्रेट कॉपी करें और उसे अपने सर्वर के बाकी सीक्रेट के साथ सुरक्षित रखें।
- यह जांचने के लिए कि आपका एंडपॉइंट जवाब देता है, टेस्ट इवेंट भेजें चुनें।
एंडपॉइंट पेज पर हाल की डिलीवरी दिखती हैं, साथ में रिस्पॉन्स स्टेटस, रिस्पॉन्स बॉडी के पहले 2,000 कैरेक्टर और हर कोशिश में लगा समय। आप API से भी एंडपॉइंट बना और हटा सकते हैं।
इवेंट
| टाइप | कब भेजा जाता है |
|---|---|
app.created | वर्कस्पेस में कोई ऐप जोड़ा गया। |
app.updated | ऐप की जानकारी, लिंक या पेज सेटिंग बदली गईं। |
app.deleted | कोई ऐप हटाया गया। |
app.status_changed | कोई ऐप लाइव हुआ, पॉज़ किया गया या निलंबित किया गया। |
app.metadata_fetched | किसी ऐप के लिए स्टोर मेटाडेटा इम्पोर्ट किया गया। |
legal.published | कोई गोपनीयता नीति या सेवा की शर्तों वाला डॉक्यूमेंट प्रकाशित किया गया। |
domain.verified | कोई कस्टम डोमेन वेरिफ़ाई हुआ। |
link.clicked | हर स्मार्ट लिंक क्लिक। किसी लोकप्रिय ऐप के लिए इससे बहुत सारी रिक्वेस्ट आ सकती हैं। |
analytics.daily_summary | हर ऐप के पिछले दिन के कुल क्लिक, दिन में एक बार भेजे जाते हैं। |
रिक्वेस्ट फ़ॉर्मेट
हर इवेंट JSON बॉडी के साथ एक POST रिक्वेस्ट के रूप में भेजा जाता है।
| हेडर | वैल्यू |
|---|---|
Content-Type | application/json |
User-Agent | mapps.one-Webhooks/1.0 |
X-Mapps-Event | इवेंट टाइप, जैसे link.clicked |
X-Mapps-Delivery | इवेंट ID। हर रीट्राई पर यह एक जैसी रहती है। |
X-Mapps-Timestamp | इस डिलीवरी कोशिश का Unix टाइम |
X-Mapps-Signature | t={timestamp},v1={signature} |
बॉडी एक एनवेलप है, जिसका ढांचा हर इवेंट के लिए एक जैसा होता है:
{
"id": "evt_01j8c3m9t5v2x7z4b6d8f0h2k4",
"type": "app.status_changed",
"created_at": "2026-09-14T09:41:07+00:00",
"workspace": {
"id": "01j8a0f4c7d2e9h6k3m5n8q1r4",
"name": "Habitly Labs"
},
"data": {
"app": {
"id": "01j8b2k6r3xq9v7m4n5p0s1t2w",
"slug": "habitly",
"name": "Habitly"
},
"status": "paused"
}
}
data में क्या होगा, यह इवेंट पर निर्भर करता है। किसी ऐप से जुड़े इवेंट में एक app ऑब्जेक्ट होता है, जिसमें उसका id, slug और name होता है।
link.clicked
"data": {
"app": { "id": "01j8b2k6r3xq9v7m4n5p0s1t2w", "slug": "habitly", "name": "Habitly" },
"click": {
"occurred_at": "2026-09-14 09:41:07",
"os": "iOS",
"device_type": "mobile",
"country": "TR",
"source": "instagram",
"destination": "app_store",
"utm_source": "instagram",
"utm_medium": "social",
"utm_campaign": "launch"
}
}
occurred_at UTC में होता है। device_type की वैल्यू mobile, tablet या desktop होती है। destination कोई स्टोर कुंजी, web या landing होता है। जो फ़ील्ड अज्ञात हों, वे null होते हैं। बॉट विज़िट से यह इवेंट कभी ट्रिगर नहीं होता।
app.metadata_fetched
"data": {
"app": { "id": "01j8b2k6r3xq9v7m4n5p0s1t2w", "slug": "habitly", "name": "Habitly" },
"source": "app_store"
}
सिग्नेचर वेरिफ़ाई करें
हर रिक्वेस्ट का सिग्नेचर जांचें, ताकि आपको पता रहे कि वह mapps.one से आई है और रास्ते में बदली नहीं गई:
X-Mapps-Signatureहेडर सेtऔरv1पढ़ें।- अपने एंडपॉइंट के साइनिंग सीक्रेट का इस्तेमाल करके
{t}.{raw request body}का HMAC-SHA256 लोअरकेस हेक्स में कैलकुलेट करें। - कॉन्स्टेंट-टाइम तुलना से इसे
v1से मिलाएं। - रीप्ले की गई रिक्वेस्ट रोकने के लिए, अगर
tआपके सर्वर की घड़ी से पांच मिनट से ज़्यादा आगे या पीछे है, तो रिक्वेस्ट अस्वीकार करें।
PHP
<?php
$secret = getenv('MAPPS_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_X_MAPPS_SIGNATURE'] ?? ''), $parts);
$timestamp = (int) ($parts['t'] ?? 0);
$expected = hash_hmac('sha256', $timestamp.'.'.$body, $secret);
if (! hash_equals($expected, (string) ($parts['v1'] ?? '')) || abs(time() - $timestamp) > 300) {
http_response_code(400);
exit;
}
$event = json_decode($body, true);
if ($event['type'] === 'link.clicked') {
// Store $event['data']['click'] ...
}
http_response_code(200);
Laravel में, बॉडी $request->getContent() से और हेडर $request->header('X-Mapps-Signature') से पढ़ें, और रूट को CSRF सुरक्षा से बाहर रखें।
Node.js (Express)
import crypto from 'node:crypto';
import express from 'express';
const app = express();
const secret = process.env.MAPPS_WEBHOOK_SECRET;
app.post('/webhooks/mapps', express.raw({ type: 'application/json' }), (req, res) => {
const header = req.get('X-Mapps-Signature') ?? '';
const parts = Object.fromEntries(header.split(',').map((pair) => pair.split('=')));
const timestamp = Number(parts.t);
const body = req.body.toString('utf8');
const expected = crypto.createHmac('sha256', secret).update(`${timestamp}.${body}`).digest();
const received = Buffer.from(parts.v1 ?? '', 'hex');
const valid = received.length === expected.length && crypto.timingSafeEqual(received, expected);
if (!valid || Math.abs(Date.now() / 1000 - timestamp) > 300) {
return res.sendStatus(400);
}
const event = JSON.parse(body);
if (event.type === 'link.clicked') {
// Store event.data.click ...
}
res.sendStatus(200);
});
app.listen(3000);
रिस्पॉन्स और रीट्राई
- 10 सेकंड के अंदर कोई भी 2xx स्टेटस लौटाएं। धीमा काम जवाब देने के बाद किसी बैकग्राउंड जॉब में करें।
- रीडायरेक्ट फ़ॉलो नहीं किए जाते, इसलिए फ़ाइनल URL इस्तेमाल करें।
- URL पब्लिक
httpsहोना चाहिए। प्राइवेट और लोकल नेटवर्क के पते स्वीकार नहीं किए जाते। - अगर आपके एंडपॉइंट का टाइमआउट हो जाता है या वह 2xx के अलावा कुछ और लौटाता है, तो हम पांच बार तक और कोशिश करते हैं: लगभग 1 मिनट, 5 मिनट, 30 मिनट, 2 घंटे और 6 घंटे बाद। हर कोशिश का टाइमस्टैंप और सिग्नेचर नया होता है।
- एक ही इवेंट एक से ज़्यादा बार आ सकता है, और इवेंट क्रम से हटकर भी आ सकते हैं। डुप्लिकेट को नज़रअंदाज़ करने के लिए
X-Mapps-Delivery, यानी इवेंटid, और उन्हें क्रम में लगाने के लिएcreated_atइस्तेमाल करें। - लगातार 20 कोशिशें विफल होने पर एंडपॉइंट बंद कर दिया जाता है और उसे आगे कुछ नहीं भेजा जाता। समस्या ठीक करें, फिर डैशबोर्ड में उसे दोबारा चालू करें।
Zapier, Make और n8n
आप बिना कोई सर्वर चलाए mapps.one को हज़ारों ऐप से जोड़ सकते हैं।
Zapier
- ट्रिगर के रूप में Webhooks by Zapier के साथ एक Zap बनाएं और Catch Hook चुनें।
- Zapier से मिला वेबहुक URL कॉपी करें।
- mapps.one में उस URL के साथ एक एंडपॉइंट जोड़ें और अपने मनचाहे इवेंट चुनें, जैसे
app.status_changedयाanalytics.daily_summary। - mapps.one में टेस्ट इवेंट भेजें चुनें, फिर Zapier में Test trigger चुनें। अब पेलोड के फ़ील्ड, जैसे
data.app.name, अगले चरणों में इस्तेमाल किए जा सकते हैं।
उदाहरण: कोई ऐप पॉज़ होने पर Slack मैसेज पोस्ट करें, हर दिन के क्लिक Google Sheet में जोड़ें, या किसी क्लाइंट का डोमेन वेरिफ़ाई होने पर उसे ईमेल भेजें।
Make और n8n
Make में Webhooks → Custom webhook ट्रिगर इस्तेमाल करें। n8n में POST मेथड के साथ Webhook नोड इस्तेमाल करें। फिर ऊपर बताए तरीके से mapps.one में URL को एंडपॉइंट के रूप में जोड़ें।
इंटीग्रेशन बनाना
अगर आप दूसरों के लिए mapps.one इंटीग्रेशन बना रहे हैं, तो यूज़र के कनेक्ट करने पर API से सब्सक्राइब करें (POST /api/v1/webhooks), डिस्कनेक्ट करने पर अनसब्सक्राइब करें (DELETE /api/v1/webhooks/{id}), इवेंट पिकर के लिए GET /api/v1/events और कनेक्शन टेस्ट करने के लिए GET /api/v1/workspace इस्तेमाल करें। API रेफ़रेंस देखें।