{"openapi":"3.0.0","paths":{"/srmain/cdr":{"get":{"operationId":"CdrController_findAll","summary":"List call detail records","description":"Returns paginated CDR records. All query filters are optional.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of records to return (default: 10)","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip (default: 0)","schema":{"type":"number"}},{"name":"reqId","required":false,"in":"query","description":"Filter by request/call ID","schema":{"type":"string"}},{"name":"startTime","required":false,"in":"query","description":"Filter start time (ISO). If set, endTime is also required.","schema":{"type":"string"}},{"name":"endTime","required":false,"in":"query","description":"Filter end time (ISO). If set, startTime is also required.","schema":{"type":"string"}},{"name":"clientId","required":false,"in":"query","description":"Filter by client ID","schema":{"type":"string"}},{"name":"callerId","required":false,"in":"query","description":"Filter by caller ID","schema":{"type":"string"}},{"name":"toNumber","required":false,"in":"query","description":"Filter by destination number","schema":{"type":"string"}},{"name":"dialedNumber","required":true,"in":"query","schema":{"type":"string"}},{"name":"callPath","required":false,"in":"query","description":"Filter by call path","schema":{"type":"string"}},{"name":"obdType","required":false,"in":"query","description":"Filter by OBD type","schema":{"type":"string"}},{"name":"answerStatus","required":false,"in":"query","description":"Filter by answer status","schema":{"enum":["answered","missed"],"type":"string"}},{"name":"recordingPurpose","required":false,"in":"query","description":"Filter by recording purpose","schema":{"enum":["call","voicemail"],"type":"string"}},{"name":"dispositionLevel1Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"dispositionLevel2Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"dispositionLevel3Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"agentName","required":false,"in":"query","description":"Filter by agent name (comma-separated for multiple)","schema":{"type":"string"}}],"responses":{"200":{"description":"Call detail records retrieved successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/cdr/export":{"post":{"operationId":"CdrController_exportCdr","summary":"Export call detail records","description":"Exports CDR data using the same optional filters as the list endpoint.","parameters":[{"name":"reqId","required":false,"in":"query","description":"Filter by request/call ID","schema":{"type":"string"}},{"name":"startTime","required":false,"in":"query","description":"Filter start time (ISO). If set, endTime is also required.","schema":{"type":"string"}},{"name":"endTime","required":false,"in":"query","description":"Filter end time (ISO). If set, startTime is also required.","schema":{"type":"string"}},{"name":"clientId","required":false,"in":"query","description":"Filter by client ID","schema":{"type":"string"}},{"name":"callerId","required":false,"in":"query","description":"Filter by caller ID","schema":{"type":"string"}},{"name":"toNumber","required":false,"in":"query","description":"Filter by destination number","schema":{"type":"string"}},{"name":"dialedNumber","required":true,"in":"query","schema":{"type":"string"}},{"name":"callPath","required":false,"in":"query","description":"Filter by call path","schema":{"type":"string"}},{"name":"obdType","required":false,"in":"query","description":"Filter by OBD type","schema":{"type":"string"}},{"name":"answerStatus","required":false,"in":"query","description":"Filter by answer status","schema":{"enum":["answered","missed"],"type":"string"}},{"name":"recordingPurpose","required":false,"in":"query","description":"Filter by recording purpose","schema":{"enum":["call","voicemail"],"type":"string"}},{"name":"dispositionLevel1Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"dispositionLevel2Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"dispositionLevel3Id","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of records to return (default: 10)","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip (default: 0)","schema":{"type":"number"}},{"name":"agentName","required":false,"in":"query","description":"Filter by agent name (comma-separated for multiple)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCdrDto"}}}},"responses":{"200":{"description":"CDR export started successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/cdr/me/today-stats":{"get":{"operationId":"CdrController_getMyTodayStats","summary":"Get my today call stats","description":"Returns call statistics for the authenticated agent for today.","parameters":[],"responses":{"200":{"description":"Agent today call stats retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/cdr/customer-history":{"get":{"operationId":"CdrController_findCustomerHistory","parameters":[{"name":"number","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/cdr/{id}":{"get":{"operationId":"CdrController_findOne","summary":"Get call detail record by ID","parameters":[{"name":"id","required":true,"in":"path","description":"Call detail record request ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Call detail record retrieved successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Call detail record not found"}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/cdr/{prefix}/getClientIds":{"get":{"operationId":"CdrController_getClientIds","summary":"Get client IDs by prefix","parameters":[{"name":"prefix","required":true,"in":"path","description":"Client ID prefix to search","schema":{"type":"string"}}],"responses":{"200":{"description":"Client IDs retrieved successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Call Detail Records"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/upload":{"post":{"operationId":"ContactUploadController_uploadFile","summary":"Upload contact list file","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"CSV or Excel file to upload"},"data":{"type":"string","description":"JSON string containing upload metadata","example":"{\"name\":\"Contact List Name\",\"description\":\"My contact list\",\"isDefault\":false,\"isActive\":true}"}},"required":["file","data"]}}}},"responses":{"201":{"description":"File uploaded successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/map-fields/{contactListId}":{"post":{"operationId":"ContactUploadController_mapFields","summary":"Map CSV fields to contact fields","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mappings":{"type":"object","additionalProperties":{"type":"string"},"example":{"First Name":"fName","Last Name":"lName","Phone Number":"phoneNumber","Email":"email"},"description":"Field mappings for CSV columns to contact fields"}},"required":["mappings"]}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/process-file/{contactListId}":{"post":{"operationId":"ContactUploadController_processList","summary":"Process uploaded contact list file","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","description":"Duplicate handling strategy when processing the file","schema":{"enum":["skip","update"],"type":"string"}}],"responses":{"200":{"description":"File processing started"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/delete-file/{contactListId}":{"delete":{"operationId":"ContactUploadController_deleteList","summary":"Delete contact list file","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list deleted successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/get-contactList-by-Id/{contactListId}":{"get":{"operationId":"ContactUploadController_getContactById","summary":"Get contact list by ID","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list retrieved successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/get-contact/{contactListId}":{"get":{"operationId":"ContactUploadController_getListContact","summary":"Get contacts in a contact list","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip","schema":{"type":"number"}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tag IDs to filter by","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact lists retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/contactlists":{"get":{"operationId":"ContactUploadController_getContactListDetails","summary":"Get all contact lists","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip","schema":{"type":"number"}},{"name":"name","required":false,"in":"query","description":"Filter by contact list name","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string"}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tag IDs to filter contact pools by","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact lists retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/contactlists/{contactListId}":{"get":{"operationId":"ContactUploadController_getContactListById","summary":"Get contact list by ID","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list retrieved successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/download-requests":{"post":{"operationId":"ContactUploadController_createDownloadRequest","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDownloadRequestDto"}}}},"responses":{"201":{"description":""}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]},"get":{"operationId":"ContactUploadController_getDownloadRequests","parameters":[],"responses":{"200":{"description":""}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/download-requests/{id}/download":{"get":{"operationId":"ContactUploadController_downloadRequestFile","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/all-contacts":{"get":{"operationId":"ContactUploadController_getContactsWithSystemFields","summary":"Get all contacts with system fields","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip","schema":{"type":"number"}},{"name":"fName","required":false,"in":"query","description":"Filter by first name","schema":{"type":"string"}},{"name":"lName","required":false,"in":"query","description":"Filter by last name","schema":{"type":"string"}},{"name":"phNumber","required":false,"in":"query","description":"Filter by phone number","schema":{"type":"string"}},{"name":"email","required":false,"in":"query","description":"Filter by email","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact lists retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/viewmore/{id}":{"get":{"operationId":"ContactUploadController_getContactViewMoreById","summary":"Get detailed contact view by ID","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list retrieved successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/contact/{contactId}":{"patch":{"operationId":"ContactUploadController_update","summary":"Update a contact","parameters":[{"name":"contactId","required":true,"in":"path","description":"Contact ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"callStatus":{"type":"string","example":"answered","description":"Status of the call"}}}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/updatecontactlist/{contactListId}":{"patch":{"operationId":"ContactUploadController_updateContactList","summary":"Update contact list with new file","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"New CSV or Excel file to replace existing one"},"data":{"type":"string","description":"JSON string containing update metadata","example":"{\"name\":\"Updated Contact List Name\",\"description\":\"Updated description\",\"status\":\"MAPPING_DONE\"}"}}}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/{contactListId}/tags":{"patch":{"operationId":"ContactUploadController_updatePoolTags","summary":"Add or remove tags on a contact list","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagsToAdd":{"type":"array","items":{"type":"string"},"description":"Tag IDs to add"},"tagsToRemove":{"type":"array","items":{"type":"string"},"description":"Tag IDs to remove"}}}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/{contactListId}/export":{"get":{"operationId":"ContactUploadController_exportContactsCSV","summary":"Export contacts to CSV and send via email","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contacts exported successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/viewContacts/{contactListId}":{"get":{"operationId":"ContactUploadController_getContactByCoId","summary":"View contacts by contact list ID","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip","schema":{"type":"number"}},{"name":"number","required":false,"in":"query","description":"Filter by phone number","schema":{"type":"string"}},{"name":"fName","required":false,"in":"query","description":"Filter by first name","schema":{"type":"string"}},{"name":"lName","required":false,"in":"query","description":"Filter by last name","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","description":"Filter by contact ID","schema":{"type":"string"}},{"name":"crm","required":false,"in":"query","description":"Set to 1, true, or yes to enable CRM context","schema":{"type":"string"}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tag IDs to filter by","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact lists retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/contactNumber":{"post":{"operationId":"ContactUploadController_createContact","summary":"Create a new contact","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fName":{"type":"string","example":"John","description":"First name of the contact"},"lName":{"type":"string","example":"Doe","description":"Last name of the contact"},"phoneNumber":{"type":"string","example":"9876543210","description":"Phone number of the contact"},"email":{"type":"string","example":"john.doe@example.com","description":"Email address of the contact"},"contactListId":{"type":"string","example":"683d593d9fca093a5c09467d","description":"ID of the contact list"},"addToRunningCampaign":{"type":"boolean","example":false,"description":"When true, adds the contact to running campaigns linked to this pool. Defaults to false."}},"required":["phoneNumber","contactListId"]}}}},"responses":{"201":{"description":"Contact list created successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/contactNumber/{contactId}":{"patch":{"operationId":"ContactUploadController_updateContact","summary":"Update contact by ID","parameters":[{"name":"contactId","required":true,"in":"path","description":"Contact ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fName":{"type":"string","example":"John","description":"First name of the contact"},"lName":{"type":"string","example":"Doe","description":"Last name of the contact"},"phoneNumber":{"type":"string","example":"9876543210","description":"Phone number of the contact"},"email":{"type":"string","example":"john.doe@example.com","description":"Email address of the contact"},"contactListId":{"type":"string","example":"683d593d9fca093a5c09467d","description":"ID of the contact list"},"addToRunningCampaign":{"type":"boolean","example":false,"description":"When true, adds the contact to running campaigns linked to this pool. Defaults to false."}},"required":["phoneNumber","contactListId"]}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]},"delete":{"operationId":"ContactUploadController_deleteContact","summary":"Delete a contact","parameters":[{"name":"contactId","required":true,"in":"path","description":"Contact ID","schema":{"type":"string"}},{"name":"contactPoolId","required":true,"in":"query","description":"Contact list (pool) ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list deleted successfully"},"401":{"description":"User not authenticated"},"404":{"description":"Contact list not found"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/{contactListId}/manage-tags":{"patch":{"operationId":"ContactUploadController_manageTags","summary":"Replace tags on contacts in a contact list","parameters":[{"name":"contactListId","required":true,"in":"path","description":"Contact list ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"removeTag":{"type":"string","description":"Tag ID to remove"},"insertTag":{"type":"string","description":"Tag ID to insert"}}}}}},"responses":{"200":{"description":"Contact list updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/contacts_list/inbound-contact-list":{"post":{"operationId":"ContactUploadController_createInboundContactList","summary":"Create inbound contact list without file","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Inbound Contact List"},"description":{"type":"string","example":"Inbound list created without file upload"},"assignedFields":{"type":"array","items":{"type":"string"},"example":["683d593d9fca093a5c09467d"]},"additionalFields":{"type":"array","items":{"type":"string"},"example":["683d593d9fca093a5c09467d"],"deprecated":true}},"required":["name","description"]}}}},"responses":{"201":{"description":"Contact list created successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Contact Lists"],"security":[{"Authorization":[]}]}},"/srmain/dnc/subscribe/{token}":{"get":{"operationId":"DncController_addPhoneNo","summary":"Subscribe phone number to DNC","description":"Adds a phone number to the Do Not Call list using a subscription token.","parameters":[{"name":"token","required":true,"in":"path","description":"DNC subscription token","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDncDto"}}}},"responses":{"201":{"description":"Phone number subscribed to DNC successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Do Not Call (DNC)"]}},"/srmain/dnc/unsubscribe/{token}":{"get":{"operationId":"DncController_removePhoneNo","summary":"Unsubscribe phone number from DNC","description":"Removes a phone number from the Do Not Call list using a subscription token.","parameters":[{"name":"token","required":true,"in":"path","description":"DNC subscription token","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDncDto"}}}},"responses":{"200":{"description":"Phone number unsubscribed from DNC successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["Do Not Call (DNC)"]}},"/srmain/voice/call":{"post":{"operationId":"CpaasController_initiate","summary":"Initiate a click-to-call","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Caller-id provided by us"},"to":{"type":"string","description":"First originate number"},"action":{"oneOf":[{"type":"object","description":"Action object with type and data","properties":{"type":{"type":"string","example":"dial","enum":["dial","flow"]},"timeout":{"type":"number","description":"Timeout in seconds (optional)"},"data":{"type":"object","description":"Action data - can include additional custom fields","properties":{"number":{"type":"string","description":"Number to dial (for dial action)"},"flowId":{"type":"string","description":"Flow ID (for flow action)"},"agent_id":{"type":"string","description":"Optional: Agent ID for tracking (returned in statusCallbackUrl webhook)"},"reference_id":{"type":"string","description":"Optional: Reference ID for tracking (returned in statusCallbackUrl webhook)"}}}}},{"type":"string","description":"URL that returns action JSON"}]},"timeout":{"type":"number"},"recordCall":{"type":"boolean"},"flowId":{"type":"string","description":"Flow ID from flowbuilder (optional)"},"contact":{"type":"object","description":"Contact data for flowbuilder (optional)"},"statusCallbackUrl":{"type":"string","description":"Status callback target: \"auto-set\" (internal gRPC), grpc://..., or a valid Api Request (apinode) ObjectId. Direct http(s) URLs are rejected."},"customData":{"type":"object","description":"Optional JSON object passed to all action endpoints and status callback"}},"required":["from","to"]}}}},"responses":{"201":{"description":"Call initiated"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/mute":{"post":{"operationId":"CpaasController_mute","summary":"Mute a call channel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuteUnmuteDto"}}}},"responses":{"200":{"description":"Muted"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/unmute":{"post":{"operationId":"CpaasController_unmute","summary":"Unmute a call channel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuteUnmuteDto"}}}},"responses":{"200":{"description":"Unmuted"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/hold":{"post":{"operationId":"CpaasController_hold","summary":"Hold a call channel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldUnholdDto"}}}},"responses":{"200":{"description":"Held"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/unhold":{"post":{"operationId":"CpaasController_unhold","summary":"Unhold a call channel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldUnholdDto"}}}},"responses":{"200":{"description":"Unheld"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/dial":{"post":{"operationId":"CpaasController_dial","summary":"Dial a new leg from an existing channel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialDto"}}}},"responses":{"200":{"description":"Dial started"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/hangup":{"post":{"operationId":"CpaasController_hangup","summary":"Hang up a call","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HangupDto"}}}},"responses":{"200":{"description":"Hung up"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/active-call-details":{"get":{"operationId":"CpaasController_getStatus","summary":"Get call details","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaDataDto"}}}},"responses":{"200":{"description":"Get call details"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/call-details/{callId}":{"get":{"operationId":"CpaasController_getCallDetails","summary":"Get call details by callId","parameters":[{"name":"callId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Get call details by callId"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/transfer/init":{"post":{"operationId":"CpaasController_transferInit","summary":"Initiate a call transfer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferInitDto"}}}},"responses":{"200":{"description":"Transfer initiated"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/transfer/complete":{"post":{"operationId":"CpaasController_transferComplete","summary":"Complete a call transfer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferCompleteDto"}}}},"responses":{"200":{"description":"Transfer completed"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/transfer/cancel":{"post":{"operationId":"CpaasController_transferCancel","summary":"Cancel a call transfer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferCancelDto"}}}},"responses":{"200":{"description":"Transfer cancelled"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/transfer/status":{"post":{"operationId":"CpaasController_transferStatus","summary":"Get call transfer status","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferStatusDto"}}}},"responses":{"200":{"description":"Transfer status returned"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/conference/add-members":{"post":{"operationId":"CpaasController_conferenceAddMembers","summary":"Add members to a conference","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConferenceAddMembersDto"}}}},"responses":{"200":{"description":"Members invited"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/conference/kick":{"post":{"operationId":"CpaasController_conferenceKickMember","summary":"Kick a member from a conference","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConferenceKickMemberDto"}}}},"responses":{"200":{"description":"Member kicked"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/conference/leave":{"post":{"operationId":"CpaasController_conferenceLeave","summary":"Leave a conference","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConferenceLeaveDto"}}}},"responses":{"200":{"description":"Left conference"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/conference/members":{"post":{"operationId":"CpaasController_conferenceGetMembers","summary":"Get conference members","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConferenceGetMembersDto"}}}},"responses":{"200":{"description":"Conference members returned"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/voice/conference/my":{"get":{"operationId":"CpaasController_conferenceGetMyMembers","summary":"Get my active conference members","description":"Uses the authenticated agent from the JWT token. Read-only snapshot (GET).","parameters":[],"responses":{"200":{"description":"Conference members returned"}},"tags":["Voice"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp-numbers":{"post":{"operationId":"WhatsappNumberRecordsController_create","summary":"Create a WhatsApp number record","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWhatsappNumberRecordDto"}}}},"responses":{"201":{"description":"WhatsApp number record created successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Numbers"],"security":[{"Authorization":[]}]},"get":{"operationId":"WhatsappNumberRecordsController_findAll","summary":"Get all WhatsApp number records","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of records to return (default: 100)","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip (default: 0)","schema":{"type":"number"}}],"responses":{"200":{"description":"WhatsApp number records retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Numbers"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp-numbers/{id}":{"patch":{"operationId":"WhatsappNumberRecordsController_update","summary":"Update a WhatsApp number record","parameters":[{"name":"id","required":true,"in":"path","description":"WhatsApp number record ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWhatsappNumberRecordDto"}}}},"responses":{"200":{"description":"WhatsApp number record updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Numbers"],"security":[{"Authorization":[]}]},"delete":{"operationId":"WhatsappNumberRecordsController_remove","summary":"Delete a WhatsApp number record","parameters":[{"name":"id","required":true,"in":"path","description":"WhatsApp number record ID","schema":{"type":"string"}}],"responses":{"200":{"description":"WhatsApp number record deleted successfully"},"401":{"description":"User not authenticated"},"404":{"description":"WhatsApp number record not found"}},"tags":["WhatsApp Numbers"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp_templates":{"post":{"operationId":"WhatsappTemplateController_create","summary":"Create a WhatsApp template","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWhatsappTemplateDto"}}}},"responses":{"201":{"description":"WhatsApp template created successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]},"get":{"operationId":"WhatsappTemplateController_findAll","summary":"Get all WhatsApp templates","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of records to skip","schema":{"type":"number"}},{"name":"phoneNumberId","required":false,"in":"query","description":"Filter templates by WhatsApp phone number ID","schema":{"type":"string"}},{"name":"name","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"WhatsApp templates retrieved successfully"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp_templates/upload-header-media":{"post":{"operationId":"WhatsappTemplateController_uploadHeaderMedia","summary":"Upload WhatsApp template header media","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","mediaKind"],"properties":{"file":{"type":"string","format":"binary","description":"Header media file"},"mediaKind":{"type":"string","description":"Media kind (e.g. image, video, document)"}}}}}},"responses":{"200":{"description":"Header media uploaded successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp_templates/test-send":{"post":{"operationId":"WhatsappTemplateController_testSend","summary":"Send a test WhatsApp template message","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendWhatsappTemplateDto"}}}},"responses":{"200":{"description":"Test template sent successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp_templates/sync-status":{"post":{"operationId":"WhatsappTemplateController_syncStatus","summary":"Sync WhatsApp template statuses from Meta Graph API","description":"Fetches message templates for the admin WABA and updates stale local status / statusReason fields.","parameters":[],"responses":{"200":{"description":"WhatsApp template statuses synced from Meta"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]}},"/srmain/whatsapp_templates/{id}":{"get":{"operationId":"WhatsappTemplateController_findOne","summary":"Get a WhatsApp template by ID","parameters":[{"name":"id","required":true,"in":"path","description":"WhatsApp template ID","schema":{"type":"string"}}],"responses":{"200":{"description":"WhatsApp template retrieved successfully"},"401":{"description":"User not authenticated"},"404":{"description":"WhatsApp template not found"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]},"patch":{"operationId":"WhatsappTemplateController_update","summary":"Update a WhatsApp template","parameters":[{"name":"id","required":true,"in":"path","description":"WhatsApp template ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWhatsappTemplateDto"}}}},"responses":{"200":{"description":"WhatsApp template updated successfully"},"400":{"description":"Invalid input data"},"401":{"description":"User not authenticated"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]},"delete":{"operationId":"WhatsappTemplateController_remove","summary":"Delete a WhatsApp template","parameters":[{"name":"id","required":true,"in":"path","description":"WhatsApp template ID","schema":{"type":"string"}}],"responses":{"200":{"description":"WhatsApp template deleted successfully"},"401":{"description":"User not authenticated"},"404":{"description":"WhatsApp template not found"}},"tags":["WhatsApp Templates"],"security":[{"Authorization":[]}]}}},"info":{"title":"CPaaS Services API","description":"Public CPaaS APIs for voice, SMS, WhatsApp, contact lists, Do Not Call (DNC), and call detail records.\n\n**Base URL:** `https://api.exafone.com`\n\nPaths in this reference are relative to that host. For example, list call detail records at:\n\n`https://api.exafone.com/srmain/cdr`\n\n### Authentication\nSend a JWT (or API key) in the `Authorization` header. Tokens are issued by the [Authentication API](https://docs.exafone.com/auth-api/).\n\nThis document does not include authentication endpoints.","version":"1.0","contact":{"name":"ExaFone","url":"https://exafone.com","email":""}},"tags":[{"name":"Call Detail Records","description":"Search, filter, and export call detail records (CDRs). Retrieve individual CDRs, list CDRs with optional filters, export data, and fetch client IDs or daily stats."},{"name":"Contact Lists","description":"Manage contact lists and contacts. Upload lists, add or update contacts, apply tags, filter contacts, and manage pool tags for outbound campaigns."},{"name":"Do Not Call (DNC)","description":"Subscribe or unsubscribe phone numbers from the Do Not Call registry using a secure token. Use these endpoints to honour opt-out requests."},{"name":"Voice","description":"Control live voice calls. Transfer calls, start conferences, and manage mute, hold, and dial actions on active sessions."},{"name":"WhatsApp Templates","description":"Create and manage WhatsApp message templates. List templates, fetch template details, and update template metadata for approved messaging."},{"name":"WhatsApp Numbers","description":"Manage WhatsApp business numbers linked to your account. Register numbers, list records, and update number configuration."}],"servers":[{"url":"https://api.exafone.com","description":"Production"}],"components":{"securitySchemes":{"Authorization":{"type":"apiKey","in":"header","name":"Authorization"}},"schemas":{"ExportCdrDto":{"type":"object","properties":{"includeTimeline":{"type":"boolean","description":"Include call timeline data in the export","example":false}}},"CreateDownloadRequestDto":{"type":"object","properties":{}},"CreateDncDto":{"type":"object","properties":{"phoneNo":{"type":"string","example":"9876541234","description":"Phone number to add or remove from DNC"},"provider":{"type":"string","example":"bsnl","description":"Telecom provider identifier"},"accountId":{"type":"string","description":"Account ID (optional)"},"isActive":{"type":"boolean","description":"Whether the DNC entry is active"}},"required":["phoneNo","provider"]},"MuteUnmuteDto":{"type":"object","properties":{"callId":{"type":"string","description":"Call ID (sticky telephony node owner routing)"},"channelId":{"type":"string","description":"Channel ID to mute or unmute"}},"required":["callId","channelId"]},"HoldUnholdDto":{"type":"object","properties":{"callId":{"type":"string","description":"Call ID (sticky telephony node owner routing)"},"channelId":{"type":"string","description":"Channel ID to hold or unhold"}},"required":["callId","channelId"]},"DialDto":{"type":"object","properties":{"callId":{"type":"string","description":"Active call ID"},"target":{"type":"string","description":"Destination number or endpoint to dial"}},"required":["callId","target"]},"HangupDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique call ID"},"agentId":{"type":"string","description":"Initiating agent id (optional; server may derive from auth)"},"channelId":{"type":"string","description":"Optional agent channel hint"}},"required":["callId"]},"MetaDataDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique call ID"}},"required":["callId"]},"TransferTargetDto":{"type":"object","properties":{"kind":{"type":"string","description":"Transfer target kind","enum":["agent","number"]},"agentId":{"type":"string","description":"Target agent id (required when kind=agent)"},"number":{"type":"string","description":"Target number (required when kind=number)"},"agentName":{"type":"string","description":"Target agent display name for CDR (PartyInfo.name; optional)"}},"required":["kind"]},"TransferInitDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_zwO5345HeaQJ8JcQIEA7t"},"transferMode":{"type":"string","description":"Transfer mode","enum":["blind","attended"]},"sourceAgentId":{"type":"string","description":"Source agent id who initiated transfer"},"customerChannelId":{"type":"string","description":"Customer channel id"},"sourceChannelId":{"type":"string","description":"Source agent channel id"},"target":{"$ref":"#/components/schemas/TransferTargetDto"},"mohAudioUrl":{"type":"string","description":"Optional custom MOH URL"}},"required":["callId","transferMode","sourceAgentId","customerChannelId","sourceChannelId","target"]},"TransferCompleteDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_zwO5345HeaQJ8JcQIEA7t"},"transferSessionId":{"type":"string","description":"Transfer session id returned by TransferInit"},"completedByAgentId":{"type":"string","description":"Agent id completing the transfer"},"reason":{"type":"string","enum":["source_hangup_intentional","manual_complete"]}},"required":["callId","transferSessionId","completedByAgentId","reason"]},"TransferCancelDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_zwO5345HeaQJ8JcQIEA7t"},"transferSessionId":{"type":"string","description":"Transfer session id returned by TransferInit"},"cancelledByAgentId":{"type":"string","description":"Agent id cancelling the transfer"},"reason":{"type":"string","enum":["target_no_answer","source_cancel","target_reject"]}},"required":["callId","transferSessionId","cancelledByAgentId","reason"]},"TransferStatusDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_zwO5345HeaQJ8JcQIEA7t"},"transferSessionId":{"type":"string","description":"Transfer session id returned by TransferInit"}},"required":["callId","transferSessionId"]},"ConferenceAddMembersDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_123"},"requestedByAgentId":{"type":"string","description":"Agent id requesting the add"},"conferenceSessionId":{"type":"string","description":"Conference session id (optional; backend may create if empty)"},"customerChannelId":{"type":"string","description":"Customer channel id (explicit)","example":"chnl_xxx"},"sourceChannelId":{"type":"string","description":"Source agent channel id (explicit)","example":"chnl_xxx"},"sourceAgentId":{"type":"string","description":"Source agent id (initiator agent id)","example":"agentId_1"},"targetAgentIds":{"description":"Target agent ids (exactly one when used; omit when targetExternalNumber is set)","type":"array","items":{"type":"string"}},"targetAgentNames":{"type":"object","description":"Display names for invited agents by agentId (CDR / PartyInfo.name). Keys must match targetAgentIds."},"targetExternalNumber":{"type":"string","description":"External number to invite"},"mohAudioUrl":{"type":"string","description":"Optional custom MOH audio URL"}},"required":["callId","requestedByAgentId","customerChannelId","sourceChannelId","sourceAgentId"]},"ConferenceKickMemberDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_123"},"conferenceSessionId":{"type":"string","description":"Conference session id"},"requesterAgentId":{"type":"string","description":"Agent id requesting kick"},"targetAgentId":{"type":"string","description":"Target agent id to kick"},"targetChannelId":{"type":"string","description":"Target channel id to kick"}},"required":["callId","conferenceSessionId","requesterAgentId"]},"ConferenceLeaveDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_123"},"conferenceSessionId":{"type":"string","description":"Conference session id"},"agentId":{"type":"string","description":"Agent id leaving"},"channelId":{"type":"string","description":"Agent channel id leaving"},"asteriskIp":{"type":"string","description":"Optional asterisk IP override"}},"required":["callId","conferenceSessionId","agentId","channelId"]},"ConferenceGetMembersDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique Call ID","example":"call_123"}},"required":["callId"]},"CreateWhatsappNumberRecordDto":{"type":"object","properties":{"businessName":{"type":"string","example":"Acme Corp","description":"Business display name"},"phoneNumberId":{"type":"string","example":"123456789012345","description":"Meta WhatsApp phone number ID"},"businessWhatsappNumber":{"type":"string","example":"+919876543210","description":"Business WhatsApp number"},"flowbuilderId":{"type":"string","example":"68ba993b54be0949f55e4a9a","description":"CX Flow id. Only Message-type CX Flows are allowed."},"verified":{"type":"boolean","description":"Whether the number is verified"},"isActive":{"type":"boolean","description":"Whether the number record is active"},"via":{"type":"string","enum":["add","register"],"description":"How the number was added"},"source":{"type":"string","enum":["register","add"],"deprecated":true,"description":"Deprecated. Prefer `via`."}},"required":["businessName","phoneNumberId","businessWhatsappNumber"]},"UpdateWhatsappNumberRecordDto":{"type":"object","properties":{"businessName":{"type":"string","example":"Acme Corp","description":"Business display name"},"phoneNumberId":{"type":"string","example":"123456789012345","description":"Meta WhatsApp phone number ID"},"businessWhatsappNumber":{"type":"string","example":"+919876543210","description":"Business WhatsApp number"},"flowbuilderId":{"type":"string","example":"68ba993b54be0949f55e4a9a","description":"CX Flow id. Only Message-type CX Flows are allowed."},"verified":{"type":"boolean","description":"Whether the number is verified"},"isActive":{"type":"boolean","description":"Whether the number record is active"},"via":{"type":"string","enum":["add","register"],"description":"How the number was added"},"source":{"type":"string","enum":["register","add"],"deprecated":true,"description":"Deprecated. Prefer `via`."}}},"CreateWhatsappTemplateDto":{"type":"object","properties":{"name":{"type":"string","example":"order_update","description":"Template name"},"language":{"type":"string","example":"en_US","description":"Template language code"},"category":{"type":"string","example":"MARKETING","description":"Template category"},"parameter_format":{"type":"string","enum":["POSITIONAL","NAMED"]},"sub_category":{"type":"string","description":"Template sub-category"},"metaTemplateId":{"type":"string","description":"Meta template ID from Graph API"},"is_primary_device_delivery_only":{"type":"boolean","description":"Restrict delivery to primary device only"},"components":{"description":"Template components (header, body, buttons, etc.)","type":"array","items":{"type":"string"}},"headerText":{"type":"string","description":"Header text shortcut"},"bodyText":{"type":"string","description":"Body text shortcut"},"footerText":{"type":"string","description":"Footer text shortcut"},"phoneNumberId":{"type":"string","description":"WhatsApp phone number ID this template belongs to"}},"required":["name","language","category","phoneNumberId"]},"TestSendWhatsappTemplateDto":{"type":"object","properties":{"templateId":{"type":"string","description":"Template ID to send"},"phoneNumber":{"type":"string","example":"919876543210","description":"Recipient phone number"},"variableValues":{"type":"object","description":"Template variable values keyed by placeholder index (\"1\", \"2\", ...)","example":{"1":"John"}},"senderPhoneNumberId":{"type":"string","description":"Sender WhatsApp phone number ID (optional override)"}},"required":["templateId","phoneNumber"]},"UpdateWhatsappTemplateDto":{"type":"object","properties":{}}}},"externalDocs":{"description":"ExaFone website","url":"https://exafone.com"}}