{"openapi":"3.0.3","info":{"title":"WaMark Public API","version":"1.0.0","description":"WhatsApp messaging, OTP, contacts, labels, templates, conversations, chatbots and catalog for external integrations. Authenticate with a `wam_…` API key (Settings → Developer) sent as `Authorization: Bearer wam_…` or the `x-api-key` header."},"servers":[{"url":"https://api.wamark.in/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"wam_…","description":"Your WaMark API key."}}},"security":[{"apiKey":[]}],"tags":[{"name":"Messaging"},{"name":"OTP"},{"name":"Contacts"},{"name":"Labels"},{"name":"Templates"},{"name":"Conversations"},{"name":"Chatbots"},{"name":"Catalog"},{"name":"Account"}],"paths":{"/messages":{"post":{"tags":["Messaging"],"summary":"Send a text or media message","security":[{"apiKey":[]}],"description":"Requires an API key with the `messages` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567","body":"Hello 👋"}}}}}},"/messages/bulk":{"post":{"tags":["Messaging"],"summary":"Bulk send a template or interactive buttons (≤200 recipients). Per recipient, `variables` fill the template body; `buttonUrl` (or a `buttons` array for finer control) injects a dynamic value into the template button.","security":[{"apiKey":[]}],"description":"Requires an API key with the `messages` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"template":"order_update","language":"en","fallback":"","recipients":[{"to":"15551234567","variables":{"1":"BK-1029"},"buttonUrl":"1029"},{"to":"15551234568","variables":{"1":"BK-1030"},"buttons":[{"index":0,"subtype":"url","value":"1030"}]}]}}}}}},"/messages/{id}/status":{"get":{"tags":["Messaging"],"summary":"Get delivery status by message id or wamid","security":[{"apiKey":[]}],"description":"Requires an API key with the `messages` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Our message id or the WhatsApp wamid"}]}},"/media":{"post":{"tags":["Messaging"],"summary":"Upload a file → returns a public mediaUrl","security":[{"apiKey":[]}],"description":"Requires an API key with the `messages` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}}}},"/otp/send":{"post":{"tags":["OTP"],"summary":"Send a WhatsApp OTP code","security":[{"apiKey":[]}],"description":"Requires an API key with the `otp` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567","brand":"WaMark","codeLength":6}}}}}},"/otp/verify":{"post":{"tags":["OTP"],"summary":"Verify a WhatsApp OTP code","security":[{"apiKey":[]}],"description":"Requires an API key with the `otp` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567","code":"123456"}}}}}},"/contacts":{"get":{"tags":["Contacts"],"summary":"List contacts","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"search","in":"query","schema":{"type":"string"}},{"name":"stage","in":"query","schema":{"type":"string"}}]},"post":{"tags":["Contacts"],"summary":"Create a contact","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"fullName":"Jane Doe","phone":"15551234567","email":"jane@example.com"}}}}}},"/contacts/{id}":{"get":{"tags":["Contacts"],"summary":"Get a contact","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Contact id"}]},"patch":{"tags":["Contacts"],"summary":"Update a contact (partial)","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Contact id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"fullName":"Jane D.","attributes":{"plan":"pro"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete a contact","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Contact id"}]}},"/contacts/{id}/labels":{"post":{"tags":["Labels"],"summary":"Assign labels to a contact (merges)","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Contact id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"labelIds":["<label-id>"]}}}}},"delete":{"tags":["Labels"],"summary":"Remove labels from a contact","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Contact id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"labelIds":["<label-id>"]}}}}}},"/labels":{"get":{"tags":["Labels"],"summary":"List labels (tags)","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}}},"post":{"tags":["Labels"],"summary":"Create a label","security":[{"apiKey":[]}],"description":"Requires an API key with the `contacts` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"VIP","color":"#22c55e"}}}}}},"/templates":{"get":{"tags":["Templates"],"summary":"List message templates","security":[{"apiKey":[]}],"description":"Requires an API key with the `templates` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"status","in":"query","schema":{"type":"string","example":"approved"}}]}},"/conversations":{"get":{"tags":["Conversations"],"summary":"List conversations","security":[{"apiKey":[]}],"description":"Requires an API key with the `conversations` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"search","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer"}}]}},"/conversations/{id}/messages":{"get":{"tags":["Conversations"],"summary":"Get conversation message history","security":[{"apiKey":[]}],"description":"Requires an API key with the `conversations` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Conversation id"},{"name":"limit","in":"query","schema":{"type":"integer"}},{"name":"before","in":"query","schema":{"type":"string"}}]}},"/conversations/{id}/assign":{"post":{"tags":["Conversations"],"summary":"Assign a chat to a team member (userId null = unassign)","security":[{"apiKey":[]}],"description":"Requires an API key with the `conversations` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Conversation id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"userId":"<user-id>"}}}}}},"/chatbots":{"get":{"tags":["Chatbots"],"summary":"List chatbots","security":[{"apiKey":[]}],"description":"Requires an API key with the `chatbots` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}}}},"/chatbots/{id}/trigger":{"post":{"tags":["Chatbots"],"summary":"Run a chatbot flow for a phone number","security":[{"apiKey":[]}],"description":"Requires an API key with the `chatbots` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Chatbot id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567"}}}}}},"/catalogs":{"get":{"tags":["Catalog"],"summary":"List commerce catalogs","security":[{"apiKey":[]}],"description":"Requires an API key with the `catalog` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}}}},"/catalogs/{id}/products":{"get":{"tags":["Catalog"],"summary":"List products in a catalog","security":[{"apiKey":[]}],"description":"Requires an API key with the `catalog` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Catalog id"},{"name":"after","in":"query","schema":{"type":"string"}}]}},"/sequences":{"get":{"tags":["Sequences"],"summary":"List drip sequences","security":[{"apiKey":[]}],"description":"Requires an API key with the `sequences` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}}},"post":{"tags":["Sequences"],"summary":"Create a drip sequence","security":[{"apiKey":[]}],"description":"Requires an API key with the `sequences` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Welcome","status":"active","steps":[{"afterMinutes":0,"type":"template","template":"welcome","language":"en"},{"afterMinutes":1440,"type":"text","body":"Any questions? 😊"}]}}}}}},"/sequences/{id}/enroll":{"post":{"tags":["Sequences"],"summary":"Enrol a contact into a sequence","security":[{"apiKey":[]}],"description":"Requires an API key with the `sequences` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567"}}}}}},"/sequences/{id}/unenroll":{"post":{"tags":["Sequences"],"summary":"Remove a contact from a sequence","security":[{"apiKey":[]}],"description":"Requires an API key with the `sequences` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Sequence id"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"},"example":{"to":"15551234567"}}}}}},"/me":{"get":{"tags":["Account"],"summary":"Account plan + messaging/AI quota","security":[{"apiKey":[]}],"description":"Requires an API key with the `account` scope.","responses":{"200":{"description":"Success"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope"}}}}}}