{
  "info": {
    "_postman_id": "6b1f1d52-0a4e-4b8e-9d51-7a2c9f3e1b20",
    "name": "WABridge Public API",
    "description": "Send WhatsApp messages and read your leads from your own systems.\n\n**Before you start:** open this collection's **Variables** and set `apiKey` to a key from WABridge → Integrations → API keys. `waId` is the lead's WhatsApp number with country code, digits only.\n\nA key can be created with SCOPES (what it may do) and an expiry date. Tick nothing and it has full access, like every key created before scopes existed; a call outside a key's scopes is refused with 403 INSUFFICIENT_SCOPE.\n\nEvery request sends the key as the `X-Api-Key` header (set on the collection). Limit: 120 requests a minute per key. Amounts are in paise (`_minor`), timestamps are ISO 8601 in UTC.\n\nFull reference: https://whatsapp.ichelon.in/api-docs.html",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "X-Api-Key",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{apiKey}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://wabridgeapi.ichelon.in/api/v1/public",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "wab_paste_your_key_here",
      "type": "string"
    },
    {
      "key": "waId",
      "value": "919814100001",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Messages",
      "description": "Send session and template messages. A 202 means WhatsApp accepted the message, not that it arrived; delivery, read and failure arrive as the lead.message_status webhook.",
      "item": [
        {
          "name": "Send a session message: text",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/session",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "session"
              ]
            },
            "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"text\",\n  \"text\": \"Thanks, Ravi. Dr Mehta can see you at 5:30 pm today. Shall I book it?\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"text\",\n  \"text\": \"Thanks, Ravi. Dr Mehta can see you at 5:30 pm today. Shall I book it?\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b412-3e7d-7c1a-9d2e-5b8f0a6c1d44\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"c1f0e8a2-5d4b-4f7e-9a61-2b3c4d5e6f70\",\n    \"session_expires_at\": \"2026-09-18T06:13:40+00:00\"\n  }\n}"
            },
            {
              "name": "422 Outside the 24-hour window",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"text\",\n  \"text\": \"Thanks, Ravi. Dr Mehta can see you at 5:30 pm today. Shall I book it?\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"OUTSIDE_SESSION_WINDOW\",\n    \"message\": \"This contact has not written to you in the last 24 hours, so only a template can be sent.\",\n    \"details\": {\n      \"session_expires_at\": \"2026-09-16T08:12:03+00:00\"\n    }\n  }\n}"
            },
            {
              "name": "404 Never wrote to you",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"text\",\n  \"text\": \"Thanks, Ravi. Dr Mehta can see you at 5:30 pm today. Shall I book it?\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONTACT_NOT_FOUND\",\n    \"message\": \"No contact with that wa_id. A session message can only go to someone who has written to you.\"\n  }\n}"
            },
            {
              "name": "402 Wallet too low",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"text\",\n  \"text\": \"Thanks, Ravi. Dr Mehta can see you at 5:30 pm today. Shall I book it?\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Payment Required",
              "code": 402,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_FUNDS\",\n    \"message\": \"Your wallet balance is too low to send this message.\",\n    \"details\": {\n      \"available_minor\": 0,\n      \"required_minor\": 35\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Send a session message: image",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/session",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "session"
              ]
            },
            "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"image\",\n  \"media_url\": \"https://cdn.example.com/knee-pain-programme.jpg\",\n  \"caption\": \"Our 6-week knee pain programme\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"image\",\n  \"media_url\": \"https://cdn.example.com/knee-pain-programme.jpg\",\n  \"caption\": \"Our 6-week knee pain programme\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b412-3e7d-7c1a-9d2e-5b8f0a6c1d44\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"c1f0e8a2-5d4b-4f7e-9a61-2b3c4d5e6f70\",\n    \"session_expires_at\": \"2026-09-18T06:13:40+00:00\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Send a session message: document",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/session",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "session"
              ]
            },
            "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"document\",\n  \"media_url\": \"https://cdn.example.com/diabetes-reversal-plan.pdf\",\n  \"caption\": \"Programme details and fees\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"document\",\n  \"media_url\": \"https://cdn.example.com/diabetes-reversal-plan.pdf\",\n  \"caption\": \"Programme details and fees\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b412-3e7d-7c1a-9d2e-5b8f0a6c1d44\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"c1f0e8a2-5d4b-4f7e-9a61-2b3c4d5e6f70\",\n    \"session_expires_at\": \"2026-09-18T06:13:40+00:00\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Send a session message: buttons",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/session",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "session"
              ]
            },
            "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"buttons\",\n  \"text\": \"When would you like to visit?\",\n  \"buttons\": [\n    \"Today\",\n    \"Tomorrow\",\n    \"Call me\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"buttons\",\n  \"text\": \"When would you like to visit?\",\n  \"buttons\": [\n    \"Today\",\n    \"Tomorrow\",\n    \"Call me\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b412-3e7d-7c1a-9d2e-5b8f0a6c1d44\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"c1f0e8a2-5d4b-4f7e-9a61-2b3c4d5e6f70\",\n    \"session_expires_at\": \"2026-09-18T06:13:40+00:00\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Send a session message: list",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/session",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "session"
              ]
            },
            "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"list\",\n  \"text\": \"What would you like help with?\",\n  \"list\": {\n    \"button\": \"Choose\",\n    \"header\": \"Pain & metabolic clinic\",\n    \"section\": \"Concerns\",\n    \"rows\": [\n      {\n        \"title\": \"Back or neck pain\"\n      },\n      {\n        \"title\": \"Knee or joint pain\"\n      },\n      {\n        \"title\": \"Diabetes\",\n        \"description\": \"Sugar control and reversal\"\n      },\n      {\n        \"title\": \"Weight loss\"\n      }\n    ]\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/session",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "session"
                  ]
                },
                "description": "Send a free-form message to a lead who has written to you in the last 24 hours. Outside that window the request is refused with OUTSIDE_SESSION_WINDOW and nothing is sent; use a template instead.\n\n`type`: text, image, video, document, audio, buttons or list. Media needs a public https `media_url`; buttons take 1-3 labels (20 characters each); a list takes 1-10 rows.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"type\": \"list\",\n  \"text\": \"What would you like help with?\",\n  \"list\": {\n    \"button\": \"Choose\",\n    \"header\": \"Pain & metabolic clinic\",\n    \"section\": \"Concerns\",\n    \"rows\": [\n      {\n        \"title\": \"Back or neck pain\"\n      },\n      {\n        \"title\": \"Knee or joint pain\"\n      },\n      {\n        \"title\": \"Diabetes\",\n        \"description\": \"Sugar control and reversal\"\n      },\n      {\n        \"title\": \"Weight loss\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b412-3e7d-7c1a-9d2e-5b8f0a6c1d44\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"c1f0e8a2-5d4b-4f7e-9a61-2b3c4d5e6f70\",\n    \"session_expires_at\": \"2026-09-18T06:13:40+00:00\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Send a template message",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/messages/template",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "messages",
                "template"
              ]
            },
            "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/template",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "template"
                  ]
                },
                "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"message_id\": \"01a0b415-0c22-7e44-8b19-6c7d8e9f0a12\",\n    \"status\": \"submitted\",\n    \"provider_message_id\": \"5e9d2b71-8c3a-4f60-b1d4-7a8b9c0d1e23\"\n  }\n}"
            },
            {
              "name": "422 Not opted in",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/template",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "template"
                  ]
                },
                "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"NOT_OPTED_IN\",\n    \"message\": \"This contact has not opted in to receive template messages.\"\n  }\n}"
            },
            {
              "name": "422 Template not approved",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/template",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "template"
                  ]
                },
                "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"TEMPLATE_NOT_APPROVED\",\n    \"message\": \"WhatsApp has paused the template \\\"appointment_reminder\\\", usually because recipients reported it. It cannot be sent until it is fixed and re-approved.\"\n  }\n}"
            },
            {
              "name": "404 No such template",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/template",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "template"
                  ]
                },
                "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"TEMPLATE_NOT_FOUND\",\n    \"message\": \"No template named \\\"appointment_reminder\\\".\"\n  }\n}"
            },
            {
              "name": "403 Key without messages:send",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/messages/template",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "messages",
                    "template"
                  ]
                },
                "description": "Send a WhatsApp-approved template, at any time. The lead must have opted in (write to you, or Create or update a contact with opted_in: true). `language` is needed only when the template exists in more than one language. `variables` fill {{1}}, {{2}}... in order.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"template_name\": \"appointment_reminder\",\n  \"language\": \"en\",\n  \"variables\": [\n    \"Ravi\",\n    \"18 Sep, 5:30 pm\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SCOPE\",\n    \"message\": \"This API key doesn't have the messages:send permission. Create a key that includes it.\",\n    \"details\": {\n      \"required_scope\": \"messages:send\"\n    }\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Leads",
      "description": "Read leads with their qualification and chat, and add or update contacts.",
      "item": [
        {
          "name": "List leads",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/leads?verdict=qualified&per_page=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "leads"
              ],
              "query": [
                {
                  "key": "verdict",
                  "value": "qualified",
                  "description": "new, in_progress, needs_human, qualified or disqualified"
                },
                {
                  "key": "per_page",
                  "value": "50",
                  "description": "1-100, default 25"
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number",
                  "disabled": true
                },
                {
                  "key": "updated_since",
                  "value": "2026-09-17T00:00:00+05:30",
                  "description": "Only leads changed after this time (ISO 8601)",
                  "disabled": true
                },
                {
                  "key": "tag",
                  "value": "vip",
                  "description": "Only leads with this tag",
                  "disabled": true
                },
                {
                  "key": "from_ad",
                  "value": "1",
                  "description": "1: only leads from a Click-to-WhatsApp ad, 0: only others",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "ravi",
                  "description": "Search by name or part of the number",
                  "disabled": true
                },
                {
                  "key": "created_from",
                  "value": "2026-09-01",
                  "description": "First seen on or after (ISO 8601)",
                  "disabled": true
                },
                {
                  "key": "created_to",
                  "value": "2026-09-30",
                  "description": "First seen on or before (ISO 8601)",
                  "disabled": true
                }
              ]
            },
            "description": "Every lead, newest first, a page at a time. Turn on the query parameters you need. To keep a copy in sync, pass the time of your last call as updated_since."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads?verdict=qualified&per_page=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads"
                  ],
                  "query": [
                    {
                      "key": "verdict",
                      "value": "qualified",
                      "description": "new, in_progress, needs_human, qualified or disqualified"
                    },
                    {
                      "key": "per_page",
                      "value": "50",
                      "description": "1-100, default 25"
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number",
                      "disabled": true
                    },
                    {
                      "key": "updated_since",
                      "value": "2026-09-17T00:00:00+05:30",
                      "description": "Only leads changed after this time (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "tag",
                      "value": "vip",
                      "description": "Only leads with this tag",
                      "disabled": true
                    },
                    {
                      "key": "from_ad",
                      "value": "1",
                      "description": "1: only leads from a Click-to-WhatsApp ad, 0: only others",
                      "disabled": true
                    },
                    {
                      "key": "q",
                      "value": "ravi",
                      "description": "Search by name or part of the number",
                      "disabled": true
                    },
                    {
                      "key": "created_from",
                      "value": "2026-09-01",
                      "description": "First seen on or after (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "created_to",
                      "value": "2026-09-30",
                      "description": "First seen on or before (ISO 8601)",
                      "disabled": true
                    }
                  ]
                },
                "description": "Every lead, newest first, a page at a time. Turn on the query parameters you need. To keep a copy in sync, pass the time of your last call as updated_since."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"01a0b3d2-6c41-7a90-b2f5-7e1c3d9a4b20\",\n      \"name\": \"Ravi Kumar\",\n      \"wa_id\": \"919814100001\",\n      \"phone\": \"+919814100001\",\n      \"verdict\": \"qualified\",\n      \"qualification\": {\n        \"status\": \"qualified\",\n        \"reason\": \"Knee pain for two years; painkillers no longer help; wants a consultation this week.\",\n        \"turns\": 3,\n        \"fields\": {\n          \"concern\": \"Knee pain\",\n          \"duration\": \"2 years\",\n          \"city\": \"Jalandhar\"\n        },\n        \"source\": \"ai\",\n        \"completed_at\": \"2026-09-17T06:14:09+00:00\"\n      },\n      \"tags\": [\n        \"qualified-lead\"\n      ],\n      \"lead_rating\": 4,\n      \"opt_in_status\": \"opted_in\",\n      \"blocked\": false,\n      \"from_ad\": true,\n      \"ad\": {\n        \"source_type\": \"ad\",\n        \"source_id\": \"120214455667788\",\n        \"headline\": \"Knee pain? Walk freely again\"\n      },\n      \"attributes\": {\n        \"preferred_time\": \"evening\"\n      },\n      \"last_inbound_at\": \"2026-09-17T06:13:40+00:00\",\n      \"created_at\": \"2026-09-17T06:02:11+00:00\",\n      \"updated_at\": \"2026-09-17T06:14:09+00:00\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 50,\n    \"total\": 1,\n    \"last_page\": 1\n  }\n}"
            },
            {
              "name": "422 per_page too large",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads?verdict=qualified&per_page=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads"
                  ],
                  "query": [
                    {
                      "key": "verdict",
                      "value": "qualified",
                      "description": "new, in_progress, needs_human, qualified or disqualified"
                    },
                    {
                      "key": "per_page",
                      "value": "50",
                      "description": "1-100, default 25"
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number",
                      "disabled": true
                    },
                    {
                      "key": "updated_since",
                      "value": "2026-09-17T00:00:00+05:30",
                      "description": "Only leads changed after this time (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "tag",
                      "value": "vip",
                      "description": "Only leads with this tag",
                      "disabled": true
                    },
                    {
                      "key": "from_ad",
                      "value": "1",
                      "description": "1: only leads from a Click-to-WhatsApp ad, 0: only others",
                      "disabled": true
                    },
                    {
                      "key": "q",
                      "value": "ravi",
                      "description": "Search by name or part of the number",
                      "disabled": true
                    },
                    {
                      "key": "created_from",
                      "value": "2026-09-01",
                      "description": "First seen on or after (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "created_to",
                      "value": "2026-09-30",
                      "description": "First seen on or before (ISO 8601)",
                      "disabled": true
                    }
                  ]
                },
                "description": "Every lead, newest first, a page at a time. Turn on the query parameters you need. To keep a copy in sync, pass the time of your last call as updated_since."
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"VALIDATION_FAILED\",\n    \"message\": \"Some fields need attention.\",\n    \"details\": {\n      \"per_page\": [\n        \"The per page field must not be greater than 100.\"\n      ]\n    }\n  }\n}"
            },
            {
              "name": "403 Key without leads:read",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads?verdict=qualified&per_page=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads"
                  ],
                  "query": [
                    {
                      "key": "verdict",
                      "value": "qualified",
                      "description": "new, in_progress, needs_human, qualified or disqualified"
                    },
                    {
                      "key": "per_page",
                      "value": "50",
                      "description": "1-100, default 25"
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number",
                      "disabled": true
                    },
                    {
                      "key": "updated_since",
                      "value": "2026-09-17T00:00:00+05:30",
                      "description": "Only leads changed after this time (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "tag",
                      "value": "vip",
                      "description": "Only leads with this tag",
                      "disabled": true
                    },
                    {
                      "key": "from_ad",
                      "value": "1",
                      "description": "1: only leads from a Click-to-WhatsApp ad, 0: only others",
                      "disabled": true
                    },
                    {
                      "key": "q",
                      "value": "ravi",
                      "description": "Search by name or part of the number",
                      "disabled": true
                    },
                    {
                      "key": "created_from",
                      "value": "2026-09-01",
                      "description": "First seen on or after (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "created_to",
                      "value": "2026-09-30",
                      "description": "First seen on or before (ISO 8601)",
                      "disabled": true
                    }
                  ]
                },
                "description": "Every lead, newest first, a page at a time. Turn on the query parameters you need. To keep a copy in sync, pass the time of your last call as updated_since."
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SCOPE\",\n    \"message\": \"This API key doesn't have the leads:read permission. Create a key that includes it.\",\n    \"details\": {\n      \"required_scope\": \"leads:read\"\n    }\n  }\n}"
            },
            {
              "name": "401 No, wrong or expired API key",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads?verdict=qualified&per_page=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads"
                  ],
                  "query": [
                    {
                      "key": "verdict",
                      "value": "qualified",
                      "description": "new, in_progress, needs_human, qualified or disqualified"
                    },
                    {
                      "key": "per_page",
                      "value": "50",
                      "description": "1-100, default 25"
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number",
                      "disabled": true
                    },
                    {
                      "key": "updated_since",
                      "value": "2026-09-17T00:00:00+05:30",
                      "description": "Only leads changed after this time (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "tag",
                      "value": "vip",
                      "description": "Only leads with this tag",
                      "disabled": true
                    },
                    {
                      "key": "from_ad",
                      "value": "1",
                      "description": "1: only leads from a Click-to-WhatsApp ad, 0: only others",
                      "disabled": true
                    },
                    {
                      "key": "q",
                      "value": "ravi",
                      "description": "Search by name or part of the number",
                      "disabled": true
                    },
                    {
                      "key": "created_from",
                      "value": "2026-09-01",
                      "description": "First seen on or after (ISO 8601)",
                      "disabled": true
                    },
                    {
                      "key": "created_to",
                      "value": "2026-09-30",
                      "description": "First seen on or before (ISO 8601)",
                      "disabled": true
                    }
                  ]
                },
                "description": "Every lead, newest first, a page at a time. Turn on the query parameters you need. To keep a copy in sync, pass the time of your last call as updated_since."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHENTICATED\",\n    \"message\": \"A valid API key is required.\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Get a lead",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/leads/{{waId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "leads",
                "{{waId}}"
              ]
            },
            "description": "One lead with everything known about them, including the whole chat (latest 500 messages). Same document as the lead webhooks."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads/{{waId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads",
                    "{{waId}}"
                  ]
                },
                "description": "One lead with everything known about them, including the whole chat (latest 500 messages). Same document as the lead webhooks."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"verdict\": \"qualified\",\n    \"contact\": {\n      \"id\": \"01a0b3d2-6c41-7a90-b2f5-7e1c3d9a4b20\",\n      \"name\": \"Ravi Kumar\",\n      \"wa_id\": \"919814100001\",\n      \"phone\": \"+919814100001\",\n      \"opt_in_status\": \"opted_in\",\n      \"tags\": [\n        \"qualified-lead\"\n      ],\n      \"lead_rating\": 4,\n      \"attributes\": {\n        \"preferred_time\": \"evening\"\n      },\n      \"created_at\": \"2026-09-17T06:02:11+00:00\"\n    },\n    \"qualification\": {\n      \"status\": \"qualified\",\n      \"reason\": \"Knee pain for two years; painkillers no longer help; wants a consultation this week.\",\n      \"turns\": 3,\n      \"fields\": {\n        \"concern\": \"Knee pain\",\n        \"duration\": \"2 years\",\n        \"city\": \"Jalandhar\"\n      },\n      \"source\": \"ai\",\n      \"completed_at\": \"2026-09-17T06:14:09+00:00\"\n    },\n    \"ad\": {\n      \"source_type\": \"ad\",\n      \"source_id\": \"120214455667788\",\n      \"headline\": \"Knee pain? Walk freely again\"\n    },\n    \"conversation\": {\n      \"id\": \"01a0b3d2-6c43-7b21-9a07-4c5d6e7f8091\",\n      \"status\": \"open\",\n      \"owner\": \"Priya Sharma\",\n      \"last_inbound_at\": \"2026-09-17T06:13:40+00:00\"\n    },\n    \"chat_history\": {\n      \"message_count\": 3,\n      \"truncated\": false,\n      \"messages\": [\n        {\n          \"id\": \"01a0b3d2-6c45-7d10-8e3a-1f2b3c4d5e61\",\n          \"at\": \"2026-09-17T06:02:11+00:00\",\n          \"from\": \"lead\",\n          \"sent_by\": {\n            \"type\": \"lead\",\n            \"name\": \"Ravi Kumar\"\n          },\n          \"type\": \"text\",\n          \"text\": \"Hi, I have knee pain for 2 years\"\n        },\n        {\n          \"id\": \"01a0b3d2-7a02-7c55-9d11-2a3b4c5d6e72\",\n          \"at\": \"2026-09-17T06:02:15+00:00\",\n          \"from\": \"business\",\n          \"sent_by\": {\n            \"type\": \"ai\",\n            \"name\": null\n          },\n          \"type\": \"quick_reply\",\n          \"text\": \"Sorry to hear that. Have painkillers or physiotherapy helped?\",\n          \"options\": [\n            \"Yes, a little\",\n            \"Not really\"\n          ],\n          \"status\": \"read\"\n        },\n        {\n          \"id\": \"01a0b3d2-9b18-7f02-a4c6-3b4c5d6e7f83\",\n          \"at\": \"2026-09-17T06:13:40+00:00\",\n          \"from\": \"lead\",\n          \"sent_by\": {\n            \"type\": \"lead\",\n            \"name\": \"Ravi Kumar\"\n          },\n          \"type\": \"text\",\n          \"text\": \"Not really\"\n        }\n      ]\n    }\n  }\n}"
            },
            {
              "name": "404 No such lead",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/leads/{{waId}}",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "leads",
                    "{{waId}}"
                  ]
                },
                "description": "One lead with everything known about them, including the whole chat (latest 500 messages). Same document as the lead webhooks."
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"CONTACT_NOT_FOUND\",\n    \"message\": \"No contact with that wa_id.\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create or update a contact",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/contacts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "contacts"
              ]
            },
            "description": "Add a lead from your own form or CRM, or update one, matched on wa_id. 201 when new, 200 when it existed. Safe to retry. opted_in: true records consent collected on your form.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"name\": \"Ravi Kumar\",\n  \"attributes\": {\n    \"preferred_time\": \"evening\",\n    \"source_form\": \"knee-pain-landing\"\n  },\n  \"opted_in\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ]
                },
                "description": "Add a lead from your own form or CRM, or update one, matched on wa_id. 201 when new, 200 when it existed. Safe to retry. opted_in: true records consent collected on your form.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"name\": \"Ravi Kumar\",\n  \"attributes\": {\n    \"preferred_time\": \"evening\",\n    \"source_form\": \"knee-pain-landing\"\n  },\n  \"opted_in\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"01a0b3d2-6c41-7a90-b2f5-7e1c3d9a4b20\",\n    \"wa_id\": \"919814100001\",\n    \"opt_in_status\": \"opted_in\"\n  }\n}"
            },
            {
              "name": "200 Updated",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ]
                },
                "description": "Add a lead from your own form or CRM, or update one, matched on wa_id. 201 when new, 200 when it existed. Safe to retry. opted_in: true records consent collected on your form.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"name\": \"Ravi Kumar\",\n  \"attributes\": {\n    \"preferred_time\": \"evening\",\n    \"source_form\": \"knee-pain-landing\"\n  },\n  \"opted_in\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"01a0b3d2-6c41-7a90-b2f5-7e1c3d9a4b20\",\n    \"wa_id\": \"919814100001\",\n    \"opt_in_status\": \"opted_in\"\n  }\n}"
            },
            {
              "name": "422 Invalid number",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ]
                },
                "description": "Add a lead from your own form or CRM, or update one, matched on wa_id. 201 when new, 200 when it existed. Safe to retry. opted_in: true records consent collected on your form.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"name\": \"Ravi Kumar\",\n  \"attributes\": {\n    \"preferred_time\": \"evening\",\n    \"source_form\": \"knee-pain-landing\"\n  },\n  \"opted_in\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"VALIDATION_FAILED\",\n    \"message\": \"Some fields need attention.\",\n    \"details\": {\n      \"wa_id\": [\n        \"The wa id field format is invalid.\"\n      ]\n    }\n  }\n}"
            },
            {
              "name": "403 Key without contacts:write",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ]
                },
                "description": "Add a lead from your own form or CRM, or update one, matched on wa_id. 201 when new, 200 when it existed. Safe to retry. opted_in: true records consent collected on your form.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"wa_id\": \"{{waId}}\",\n  \"name\": \"Ravi Kumar\",\n  \"attributes\": {\n    \"preferred_time\": \"evening\",\n    \"source_form\": \"knee-pain-landing\"\n  },\n  \"opted_in\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SCOPE\",\n    \"message\": \"This API key doesn't have the contacts:write permission. Create a key that includes it.\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\"\n    }\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Account",
      "description": "Your workspace and its templates.",
      "item": [
        {
          "name": "Get account",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/account",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "account"
              ]
            },
            "description": "The workspace this key belongs to: numbers, plan, subscription, wallet balance (paise) and lead qualifier set-up."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/account",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "account"
                  ]
                },
                "description": "The workspace this key belongs to: numbers, plan, subscription, wallet balance (paise) and lead qualifier set-up."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"01a0af11-2b3c-7d4e-8f50-6a7b8c9d0e1f\",\n    \"name\": \"Relief Pain & Metabolic Clinic\",\n    \"status\": \"active\",\n    \"industry\": \"pain_metabolic\",\n    \"created_at\": \"2026-09-17T10:40:02+00:00\",\n    \"whatsapp_numbers\": [\n      {\n        \"id\": \"01a0af11-3c4d-7e5f-9061-7b8c9d0e1f20\",\n        \"phone\": \"919876500001\",\n        \"status\": \"active\",\n        \"quality\": \"GREEN\",\n        \"tier\": \"TIER_1K\"\n      }\n    ],\n    \"plan\": {\n      \"id\": \"01a0a100-1111-7222-8333-944455566677\",\n      \"name\": \"Growth\",\n      \"monthly_fee_minor\": 299900,\n      \"is_trial\": false\n    },\n    \"subscription\": {\n      \"status\": \"active\",\n      \"current_end\": \"2026-10-17T10:40:02+00:00\",\n      \"trial_ends_at\": null\n    },\n    \"access\": {\n      \"state\": \"active\",\n      \"trial_ends_at\": null\n    },\n    \"wallet\": {\n      \"currency\": \"INR\",\n      \"available_minor\": 245000,\n      \"low_threshold_minor\": 50000\n    },\n    \"lead_qualifier\": {\n      \"enabled\": true,\n      \"only_from_ads\": true,\n      \"webhook\": {\n        \"configured\": true,\n        \"active\": true,\n        \"leads\": \"all\",\n        \"events\": [\n          \"lead.qualified\",\n          \"lead.disqualified\",\n          \"lead.created\",\n          \"lead.message\",\n          \"lead.message_status\"\n        ]\n      }\n    },\n    \"counts\": {\n      \"contacts\": 1842,\n      \"opted_in\": 1797\n    }\n  }\n}"
            },
            {
              "name": "403 Key without account:read",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/account",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "account"
                  ]
                },
                "description": "The workspace this key belongs to: numbers, plan, subscription, wallet balance (paise) and lead qualifier set-up."
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"INSUFFICIENT_SCOPE\",\n    \"message\": \"This API key doesn't have the account:read permission. Create a key that includes it.\",\n    \"details\": {\n      \"required_scope\": \"account:read\"\n    }\n  }\n}"
            },
            {
              "name": "401 No, wrong or expired API key",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/account",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "account"
                  ]
                },
                "description": "The workspace this key belongs to: numbers, plan, subscription, wallet balance (paise) and lead qualifier set-up."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"UNAUTHENTICATED\",\n    \"message\": \"A valid API key is required.\"\n  }\n}"
            }
          ]
        },
        {
          "name": "List templates",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/templates?status=approved",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "templates"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "approved",
                  "description": "approved, pending, rejected or paused"
                }
              ]
            },
            "description": "Your WhatsApp templates: exact name, language, status and how many variables each needs. Only approved ones can be sent."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/templates?status=approved",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "templates"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "approved",
                      "description": "approved, pending, rejected or paused"
                    }
                  ]
                },
                "description": "Your WhatsApp templates: exact name, language, status and how many variables each needs. Only approved ones can be sent."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"01a0af30-4d5e-7f60-8172-8c9d0e1f2031\",\n      \"name\": \"appointment_reminder\",\n      \"language\": \"en\",\n      \"category\": \"utility\",\n      \"status\": \"approved\",\n      \"rejection_reason\": null,\n      \"variable_count\": 2,\n      \"body\": {\n        \"header\": null,\n        \"text\": \"Hi {{1}}, this is a reminder of your appointment on {{2}}. Reply YES to confirm.\",\n        \"footer\": \"Relief Pain & Metabolic Clinic\",\n        \"buttons\": []\n      },\n      \"updated_at\": \"2026-09-15T09:02:44+00:00\"\n    }\n  ]\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Integrations",
      "description": "Zapier REST hooks, and carts reported from your own shop for the abandoned-cart trigger.",
      "item": [
        {
          "name": "Subscribe to an event (Zapier)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/hooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "hooks"
              ]
            },
            "description": "Start sending one event to a URL. Subscribing twice with the same URL and event returns the same subscription. The id in the reply is what unsubscribes it.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"target_url\": \"https://hooks.zapier.com/hooks/standard/1234567/abcdef/\",\n  \"event\": \"lead.qualified\"\n}"
            }
          }
        },
        {
          "name": "List subscriptions (Zapier)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/hooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "hooks"
              ]
            },
            "description": "The Zapier subscriptions this workspace has."
          }
        },
        {
          "name": "Unsubscribe (Zapier)",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/hooks/{{hook_id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "hooks",
                "{{hook_id}}"
              ]
            },
            "description": "Stop sending. Only removes a subscription this API created: webhooks added on the Integrations page are never deleted this way."
          }
        },
        {
          "name": "Sample data for an event",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/hooks/samples/lead.qualified",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "hooks",
                "samples",
                "lead.qualified"
              ]
            },
            "description": "Recent real payloads for the event, or a small canned example when none has fired yet. Zapier uses this to map fields."
          }
        },
        {
          "name": "Report a cart",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/carts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "carts"
              ]
            },
            "description": "Tell WABridge about a cart a shopper started, so one that goes quiet can start a journey with the abandoned-cart trigger. Post it again as the cart changes, keyed on your own external_id; send status \"recovered\" when they pay. The contact must exist already (POST /contacts).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_id\": \"cart_88213\",\n  \"wa_id\": \"919814100001\",\n  \"total_minor\": 249900,\n  \"currency\": \"INR\",\n  \"checkout_url\": \"https://shop.example.com/checkout/88213\",\n  \"items\": [\n    {\n      \"name\": \"Knee support brace\",\n      \"product_retailer_id\": \"KB-201\",\n      \"quantity\": 1,\n      \"item_price_minor\": 249900\n    }\n  ]\n}"
            }
          }
        }
      ]
    }
  ]
}
