{"openapi":"3.1.0","info":{"title":"WA Client API Documentation","version":"1.0.0","description":"Live API reference generated from this backend. Use API keys from the API Docs page to integrate WhatsApp sending into your own system. Before testing send APIs, make sure one WhatsApp number is connected."},"servers":[{"url":"https://waflowbackend.smartitbox.in/api","description":"Production"}],"tags":[{"name":"Auth"},{"name":"API Keys"},{"name":"Messages"},{"name":"WhatsApp"},{"name":"Inbox"},{"name":"Contacts"},{"name":"Templates"},{"name":"Campaigns"},{"name":"System"}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"Error":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}},"User":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"company":{"type":"string"},"role":{"type":"string","enum":["owner","admin","agent","viewer"]},"timezone":{"type":"string"},"plan":{"type":"string","enum":["free","starter","professional","business"]}}},"AuthResponse":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"},"token":{"type":"string"}}},"ApiKey":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"prefix":{"type":"string","example":"wf_live_abcd"},"key":{"type":"string","description":"Only returned once when the key is created."},"defaultAccountId":{"type":"string","description":"WhatsApp account/channel this key sends from by default."},"defaultAccountName":{"type":"string","example":"Sales WhatsApp"},"defaultAccountPhone":{"type":"string","example":"+919876543210"},"scopes":{"type":"array","items":{"type":"string","enum":["messages:write","contacts:read","contacts:write","templates:read","templates:write","campaigns:read","campaigns:write","whatsapp:read"]}},"environment":{"type":"string","enum":["test","live"]},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time"},"revokedAt":{"type":"string","format":"date-time"},"requests30d":{"type":"integer"}}},"WhatsAppSendSettings":{"type":"object","properties":{"hourlyCap":{"type":"integer","minimum":1,"maximum":400,"example":120},"dailyCap":{"type":"integer","minimum":1,"maximum":10000,"example":1000},"warmupHourlyCap":{"type":"integer","minimum":1,"maximum":400,"example":60},"warmupDailyCap":{"type":"integer","minimum":1,"maximum":10000,"example":500},"minDelayMs":{"type":"integer","minimum":500,"maximum":600000,"example":3000},"maxDelayMs":{"type":"integer","minimum":500,"maximum":600000,"example":12000},"warmupMinDelayMs":{"type":"integer","minimum":500,"maximum":600000,"example":8000},"warmupMaxDelayMs":{"type":"integer","minimum":500,"maximum":600000,"example":25000}}},"WhatsAppAccount":{"type":"object","properties":{"id":{"type":"string"},"state":{"type":"string","enum":["DISCONNECTED","CONNECTING","QR_REQUIRED","CONNECTED","DISCONNECTING","SESSION_EXPIRED","ERROR"]},"phone":{"type":"string","example":"+919876543210"},"displayName":{"type":"string"},"accountType":{"type":"string","enum":["business","personal"]},"messagesSentToday":{"type":"integer"},"sessionStatus":{"type":"string","enum":["active","stale","expired"]},"sendSettings":{"$ref":"#/components/schemas/WhatsAppSendSettings"}}},"Contact":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","example":"Kashif Ahmad"},"phone":{"type":"string","example":"+916387850049"},"email":{"type":"string","format":"email"},"tags":{"type":"array","items":{"type":"string"}},"source":{"type":"string","enum":["Manual","CSV Import","Website Form","API","WhatsApp"]},"status":{"type":"string","enum":["active","inactive","blocked"]},"notes":{"type":"string"},"customFields":{"type":"object","additionalProperties":{"type":"string"}}}},"TemplateAttachment":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","document"]},"bucket":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"integer"}}},"Template":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","enum":["Marketing","Transactional","Reminder","Welcome","Follow-up","Other"]},"language":{"type":"string"},"status":{"type":"string","enum":["draft","active","inactive"]},"body":{"type":"string"},"attachment":{"$ref":"#/components/schemas/TemplateAttachment"},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/TemplateAttachment"}},"usageCount":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"Campaign":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["draft","scheduled","running","paused","completed","failed"]},"accountId":{"type":"string"},"templateId":{"type":"string"},"audienceType":{"type":"string","enum":["all","tag","contacts"]},"audienceTag":{"type":"string"},"recipients":{"type":"integer"},"sent":{"type":"integer"},"delivered":{"type":"integer"},"read":{"type":"integer"},"failed":{"type":"integer"},"scheduledAt":{"type":"string","format":"date-time"},"ratePerMinute":{"type":"integer","description":"Stored legacy field; UI treats this value as messages per hour."}}},"Conversation":{"type":"object","properties":{"id":{"type":"string"},"accountId":{"type":"string"},"accountName":{"type":"string"},"contactName":{"type":"string"},"phone":{"type":"string"},"lastMessage":{"type":"string"},"lastMessageAt":{"type":"string","format":"date-time"},"unreadCount":{"type":"integer"}}},"Message":{"type":"object","properties":{"id":{"type":"string"},"conversationId":{"type":"string"},"body":{"type":"string"},"direction":{"type":"string","enum":["inbound","outbound"]},"status":{"type":"string","enum":["pending","sent","delivered","read","failed"]},"at":{"type":"string","format":"date-time"}}},"SendMessageRequest":{"type":"object","required":["to"],"properties":{"to":{"type":"string","example":"+916387850049"},"body":{"type":"string","maxLength":4000,"example":"Hello from WAFlow API"},"accountId":{"type":"string","description":"Optional connected WhatsApp account id. Defaults to first connected account."},"attachment":{"$ref":"#/components/schemas/TemplateAttachment"},"attachments":{"type":"array","maxItems":10,"items":{"$ref":"#/components/schemas/TemplateAttachment"}}}},"PublicCreateMessageRequest":{"type":"object","properties":{"receiverMobileNo":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"example":"9999999999, +919876543210","description":"One or more mobile numbers. A 10 digit number is treated as India by default."},"recipientIds":{"type":"array","items":{"type":"string"},"example":["919999999999@c.us","919876543210-1541088027@g.us"],"description":"Direct chat ids or group ids."},"message":{"type":"array","items":{"type":"string"},"example":["Hello"],"description":"One or more text messages. With randomizeItems=true, one text is picked randomly per receiver."},"filePathUrl":{"type":"array","items":{"type":"string","format":"uri"},"example":["https://example.com/invoice.pdf"],"description":"Public HTTP/HTTPS file URLs to send as attachments."},"base64File":{"type":"array","items":{"type":"object","required":["name","body"],"properties":{"name":{"type":"string","example":"invoice.pdf"},"mimeType":{"type":"string","example":"application/pdf"},"body":{"type":"string","description":"Base64 encoded file body."}}}},"caption":{"type":"array","items":{"type":"string"},"example":["caption for first image",""],"description":"Captions apply to image/video attachments in the same file order. Documents do not support captions."},"randomizeItems":{"type":"boolean","default":false},"channelId":{"type":"string","description":"Optional connected WhatsApp channel id. If the API key is bound to a WhatsApp number, omit this field and that default number is used. If supplied, it must match the key's bound WhatsApp account."},"accountId":{"type":"string","description":"Alias of channelId for this WAFlow backend."},"button":{"type":"object","properties":{"title":{"type":"string","maxLength":20,"example":"Button title"},"body":{"type":"string","maxLength":1024,"example":"Button main body"},"footer":{"type":"string","maxLength":60,"example":"Footer"},"buttons":{"type":"array","minItems":1,"maxItems":3,"items":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":20,"example":"Button 1"}}}}}}}},"PublicCreateMessageResponse":{"type":"object","properties":{"status":{"type":"integer","example":200},"message":{"type":"string","example":"success"},"result":{"type":"object","properties":{"id":{"type":"string"},"groupId":{"type":"string"},"creationTime":{"type":"string","format":"date-time"},"recipients":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string","example":"919999999999@c.us"},"retryCount":{"type":"integer","example":-1},"status":{"type":"string","enum":["PENDING","SENT","DELIVERED","READ","FAILED"]},"lastUpdateTime":{"type":"string","format":"date-time"}}}}}}}}}},"paths":{"/health":{"get":{"tags":["System"],"summary":"Check API health","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"message":{"type":"string"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/auth/register":{"post":{"tags":["Auth"],"summary":"Create an account","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","password"],"properties":{"name":{"type":"string","minLength":2},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6},"company":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"$ref":"#/components/schemas/AuthResponse"}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/auth/login":{"post":{"tags":["Auth"],"summary":"Log in and receive a bearer token","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"$ref":"#/components/schemas/AuthResponse"}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/auth/me":{"get":{"tags":["Auth"],"summary":"Get current user","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"user":{"$ref":"#/components/schemas/User"}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/api-keys":{"get":{"tags":["API Keys"],"summary":"List API keys","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"tags":["API Keys"],"summary":"Create API key","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["label"],"properties":{"label":{"type":"string","minLength":2,"maxLength":80,"example":"Production website"},"environment":{"type":"string","enum":["test","live"],"default":"live"},"defaultAccountId":{"type":"string","description":"Bind this API key to one WhatsApp account id. Recommended when multiple WhatsApp numbers are connected."},"scopes":{"type":"array","items":{"type":"string","enum":["messages:write","contacts:read","contacts:write","templates:read","templates:write","campaigns:read","campaigns:write","whatsapp:read"]}}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ApiKey"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/api-keys/{id}":{"delete":{"tags":["API Keys"],"summary":"Revoke API key","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"API key id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"204":{"description":"Deleted successfully"},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/message/create":{"post":{"tags":["Messages"],"summary":"Create a WhatsApp message","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateMessageRequest"},"examples":{"text":{"summary":"One number and one message","value":{"receiverMobileNo":"9999999999","message":["Hello"]}},"boundKey":{"summary":"Recommended: send using the API key default WhatsApp number","value":{"receiverMobileNo":"9999999999","message":["Hello from the WhatsApp number bound to this API key"]}},"multiple":{"summary":"Multiple numbers, files and captions","value":{"receiverMobileNo":"9999999999,+919876543210","message":["Please check these files"],"filePathUrl":["https://example.com/photo.jpg","https://example.com/invoice.pdf"],"caption":["Product photo"]}},"channel":{"summary":"Send from a selected WhatsApp connection","value":{"channelId":"66d0f0d68c2a85063c9f2b11","receiverMobileNo":"9999999999","message":["Hello from selected channel"]}},"base64":{"summary":"Base64 PDF","value":{"receiverMobileNo":"+919999999999","base64File":[{"name":"dummy.pdf","mimeType":"application/pdf","body":"JVBERi0xLjQK..."}]}},"button":{"summary":"Button message","value":{"receiverMobileNo":"9999999999","button":{"title":"Button title","body":"Button main body","footer":"Footer","buttons":[{"text":"Button 1"},{"text":"Button 2"}]}}}}},"multipart/form-data":{"schema":{"type":"object","properties":{"receiverMobileNo":{"type":"string","example":"9999999999,+919876543210"},"recipientIds":{"type":"array","items":{"type":"string"}},"message":{"type":"array","items":{"type":"string"}},"uploadFile":{"type":"array","items":{"type":"string","format":"binary"}},"caption":{"type":"array","items":{"type":"string"}},"randomizeItems":{"type":"boolean"},"channelId":{"type":"string"},"accountId":{"type":"string"},"button.title":{"type":"string"},"button.body":{"type":"string"},"button.footer":{"type":"string"},"button.buttons[0].text":{"type":"string"},"button.buttons[1].text":{"type":"string"},"button.buttons[2].text":{"type":"string"}}}}}},"responses":{"200":{"description":"Message successfully created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateMessageResponse"}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/message/createFromTemplate":{"post":{"tags":["Messages"],"summary":"Create WhatsApp message from saved template","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["templateId"],"properties":{"templateId":{"type":"string"},"receiverMobileNo":{"type":"string","example":"9999999999,+919876543210"},"recipientIds":{"type":"array","items":{"type":"string"}},"placeHolders":{"type":"object","additionalProperties":{"type":"string"},"example":{"name":"Kashif","order_id":"AB123456"}},"channelId":{"type":"string","description":"Optional. Omit to use the API key's bound WhatsApp number."},"accountId":{"type":"string"}}}}}},"responses":{"200":{"description":"Message successfully created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateMessageResponse"}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/message/status":{"get":{"tags":["Messages"],"summary":"Get message status","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"messageId","in":"query","required":true,"schema":{"type":"string"}},{"name":"api_key","in":"query","schema":{"type":"string"},"description":"Optional API key query parameter. Prefer X-API-Key header."}],"responses":{"200":{"description":"Message status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateMessageResponse"}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/account/detail":{"get":{"tags":["WhatsApp"],"summary":"Get integration account detail and connected channels","security":[{"apiKeyAuth":[]}],"responses":{"200":{"description":"Account detail","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"integer","example":200},"message":{"type":"string","example":"success"},"result":{"type":"object"}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/contacts":{"get":{"tags":["Contacts"],"summary":"List contacts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"search","in":"query","schema":{"type":"string"}},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","enum":["active","inactive","blocked","all"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"$ref":"#/components/schemas/Contact"}},"total":{"type":"integer"},"page":{"type":"integer"},"limit":{"type":"integer"},"pages":{"type":"integer"},"tags":{"type":"array","items":{"type":"string"}},"stats":{"type":"object"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"tags":["Contacts"],"summary":"Create contact","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"contact":{"$ref":"#/components/schemas/Contact"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"tags":["Contacts"],"summary":"Bulk delete contacts","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"deleted":{"type":"integer"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/contacts/import":{"post":{"tags":["Contacts"],"summary":"Import contacts from CSV/XLS/XLSX","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"total":{"type":"integer"},"created":{"type":"integer"},"updated":{"type":"integer"},"skipped":{"type":"integer"},"errors":{"type":"array","items":{"type":"object"}}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/contacts/{id}":{"get":{"tags":["Contacts"],"summary":"Get contact","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"contact":{"$ref":"#/components/schemas/Contact"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"tags":["Contacts"],"summary":"Update contact","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"contact":{"$ref":"#/components/schemas/Contact"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete contact","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"204":{"description":"Deleted successfully"},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/templates":{"get":{"tags":["Templates"],"summary":"List templates","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"search","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","enum":["draft","active","inactive","all"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/Template"}}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"tags":["Templates"],"summary":"Create template","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/Template"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/templates/attachments":{"post":{"tags":["Templates"],"summary":"Upload template attachment","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"attachment":{"$ref":"#/components/schemas/TemplateAttachment"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/templates/{id}":{"get":{"tags":["Templates"],"summary":"Get template","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Template id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/Template"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"tags":["Templates"],"summary":"Update template","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Template id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/Template"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"tags":["Templates"],"summary":"Delete template","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Template id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"204":{"description":"Deleted successfully"},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/templates/{id}/duplicate":{"post":{"tags":["Templates"],"summary":"Duplicate template","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Template id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/Template"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/inbox/conversations":{"get":{"tags":["Inbox"],"summary":"List inbox conversations for currently connected WhatsApp numbers","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"filter","in":"query","schema":{"type":"string","enum":["all","unread","assigned","starred"]}},{"name":"search","in":"query","schema":{"type":"string"}},{"name":"cursor","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":75}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"conversations":{"type":"array","items":{"$ref":"#/components/schemas/Conversation"}},"nextCursor":{"type":"string","nullable":true}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/inbox/conversations/{id}/messages":{"get":{"tags":["Inbox"],"summary":"List messages in a conversation","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":75}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"nextCursor":{"type":"string","nullable":true}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"tags":["Inbox"],"summary":"Send text reply","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"properties":{"body":{"type":"string","minLength":1,"maxLength":4000}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/Message"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns":{"get":{"tags":["Campaigns"],"summary":"List campaigns","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"search","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","enum":["draft","scheduled","running","paused","completed","failed","all"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaigns":{"type":"array","items":{"$ref":"#/components/schemas/Campaign"}}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"tags":["Campaigns"],"summary":"Create campaign","security":[{"apiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","templateId"],"properties":{"name":{"type":"string","minLength":3,"maxLength":140},"description":{"type":"string"},"accountId":{"type":"string"},"templateId":{"type":"string"},"audienceType":{"type":"string","enum":["all","tag","contacts"],"default":"all"},"audienceTag":{"type":"string"},"contactIds":{"type":"array","items":{"type":"string"}},"scheduledAt":{"type":"string","format":"date-time"},"sendNow":{"type":"boolean","default":false},"ratePerMinute":{"type":"integer","minimum":1,"maximum":400,"default":120}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns/stream":{"get":{"tags":["Campaigns"],"summary":"Server-sent campaign update stream","security":[{"apiKeyAuth":[]}],"responses":{"200":{"description":"SSE stream"},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns/{id}":{"get":{"tags":["Campaigns"],"summary":"Get campaign","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update campaign","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete campaign","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"204":{"description":"Deleted successfully"},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns/{id}/recipients":{"get":{"tags":["Campaigns"],"summary":"List campaign recipients","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"recipients":{"type":"array","items":{"type":"object"}}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns/{id}/rerun":{"post":{"tags":["Campaigns"],"summary":"Rerun campaign","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/campaigns/{id}/status":{"patch":{"tags":["Campaigns"],"summary":"Change campaign status","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id","schema":{"type":"string","pattern":"^[a-f\\d]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["running","paused","scheduled","draft"]},"scheduledAt":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign"}}}}}}}},"400":{"description":"Validation or bad request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid API key/session token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}}