कंटेंट पर जाएं

डेवलपर

वेबहुक और Zapier

जैसे ही आपके वर्कस्पेस में कुछ होता है, जैसे कोई ऐप पॉज़ किया जाता है या किसी स्मार्ट लिंक पर क्लिक होता है, वेबहुक आपके सर्वर को एक HTTP रिक्वेस्ट भेजते हैं। इनसे आप अपने सिस्टम अपडेट कर सकते हैं, Slack पर पोस्ट कर सकते हैं, या बिना सर्वर लिखे mapps.one को Zapier, Make या n8n से जोड़ सकते हैं। वेबहुक Studio प्लान पर उपलब्ध हैं, और हर वर्कस्पेस में 10 एंडपॉइंट तक जोड़े जा सकते हैं।

एंडपॉइंट जोड़ें

  1. डैशबोर्ड में डेवलपर → वेबहुक खोलें और एंडपॉइंट जोड़ें चुनें। वर्कस्पेस मालिक और एडमिन यह कर सकते हैं।
  2. एक पब्लिक https URL डालें, भेजे जाने वाले इवेंट चुनें (या सभी इवेंट) और एक विवरण जोड़ें।
  3. साइनिंग सीक्रेट कॉपी करें और उसे अपने सर्वर के बाकी सीक्रेट के साथ सुरक्षित रखें।
  4. यह जांचने के लिए कि आपका एंडपॉइंट जवाब देता है, टेस्ट इवेंट भेजें चुनें।

एंडपॉइंट पेज पर हाल की डिलीवरी दिखती हैं, साथ में रिस्पॉन्स स्टेटस, रिस्पॉन्स बॉडी के पहले 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-Typeapplication/json
User-Agentmapps.one-Webhooks/1.0
X-Mapps-Eventइवेंट टाइप, जैसे link.clicked
X-Mapps-Deliveryइवेंट ID। हर रीट्राई पर यह एक जैसी रहती है।
X-Mapps-Timestampइस डिलीवरी कोशिश का Unix टाइम
X-Mapps-Signaturet={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 से आई है और रास्ते में बदली नहीं गई:

  1. X-Mapps-Signature हेडर से t और v1 पढ़ें।
  2. अपने एंडपॉइंट के साइनिंग सीक्रेट का इस्तेमाल करके {t}.{raw request body} का HMAC-SHA256 लोअरकेस हेक्स में कैलकुलेट करें।
  3. कॉन्स्टेंट-टाइम तुलना से इसे v1 से मिलाएं।
  4. रीप्ले की गई रिक्वेस्ट रोकने के लिए, अगर t आपके सर्वर की घड़ी से पांच मिनट से ज़्यादा आगे या पीछे है, तो रिक्वेस्ट अस्वीकार करें।
रॉ बॉडी इस्तेमाल करें। JSON पार्स करने से पहले, ठीक वही बाइट साइन करें जो आपको मिली हैं। JSON को दोबारा एनकोड करने से स्लैश या Unicode कैरेक्टर बदल सकते हैं और सिग्नेचर मेल नहीं खाएगा।

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

  1. ट्रिगर के रूप में Webhooks by Zapier के साथ एक Zap बनाएं और Catch Hook चुनें।
  2. Zapier से मिला वेबहुक URL कॉपी करें।
  3. mapps.one में उस URL के साथ एक एंडपॉइंट जोड़ें और अपने मनचाहे इवेंट चुनें, जैसे app.status_changed या analytics.daily_summary।
  4. 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 रेफ़रेंस देखें।