API to place voice calls from your applications over https requests. The system calls the recipient, reads out the message you provide converted to speech and, if you want, collects the answer of the recipient: key presses (IVR menu), a PIN or a transfer to another phone.
Your user account holds the API User and the API Token, and both are needed to make REST API requests to the functions of this API. For security reasons requests must be made with POST over HTTPS.
To use Basic Authentication include a header of the form: Authorization: Basic Base64StringAPI where Base64StringAPI is the Base64 encoding of the string APIUser:APIToken. You will find your API User and API Token in your account under Your data -> Configure account.
BULK MARKETING CALLS ARE NOT ALLOWED.
This API is designed for services that add value for the person receiving the call: PIN/OTP codes, urgent alerts, notices and confirmations, automated calls to employees and, in general, any transactional communication. Generating calls that the recipient may regard as spam is strictly forbidden.
Any complaint on those grounds may lead to the temporary blocking of the calling number and to an investigation. By using the service, the holder of the number (the owning company) undertakes not to use it for those purposes and takes full responsibility for its use.
Calling number:
Calls ALWAYS go out from a voice number you have with the platform. You can get one from your panel (VOICE calls -> My numbers) in Spain, Portugal, Mexico and other countries. Showing a number that is not yours is not possible: regulation and the carrier reject it.
Credits:
Calls are charged per minute started: the first minute is reserved when the call is queued and, when it ends, the charge is adjusted to how long it actually lasted. A call cancelled before it is placed returns its credits in full.
Calling hours:
HORAINICIODIARIA and HORALIMITEDIARIA define the window in which calls MAY be placed. A call scheduled outside that window is not lost: it is rescheduled for the next start time. Please observe the rules of the destination country on business calling hours.
Recording:
With GRABAR=1 the whole call is recorded from the moment it is answered; the recording is kept in your account (VOICE calls -> Recordings) and is charged per minute recorded. Telling the recipient that the call is being recorded is your responsibility: say so in the MENSAJE itself.
Empty connections:
Repeatedly connecting with wrong data will be treated by the system as spam and may end up blocking the connection temporarily. Avoid repeated requests with wrong data or 'empty' queries of the same report.
Response of the requests:
Every function accepts the 'RESP' parameter, which sets the format of the response: TXT, JSON or XML. We recommend always setting it; if you do not, the response comes back as plain text (TXT).
The text of the MENSAJE parameter is converted to speech in the language you set in LENGUAJE. Besides plain text it accepts:
- Variables: write (Nombre) in the text and send its value in VARIABLES for each recipient. You may use any variable names you like.
- (PAUSA:n) n seconds of silence. Example: Your appointment is tomorrow (PAUSA:1) at ten. (WAIT:n) does the same.
- (SPELL:text) spells the text out character by character, for codes and references.
- (MP3:name.mp3) plays, at that point, an audio file from your account library (the ones you upload from the panel; get the list with GetPlantillasVOZ). An audio file that is not in your library is skipped and the message carries on: audio hosted on other websites is not accepted.
Markers go inside brackets and can be mixed with the text as many times as you need.
With the IVR parameter you can ask the recipient for an answer:
IVR=1 (key menu): after the message, the menu prompt is read out ('press 1 to confirm, 2 to talk to an agent...') and, depending on the key pressed, the system runs the action you configured: repeat the message, notify a URL of yours, send an email, transfer the call to another phone, opt the recipient out or hang up. Each option can also carry a prompt before and after the action, and can return to the menu instead of hanging up.
IVR=2 (PIN request): the system asks for a code of several digits ending with the hash key and, once the recipient enters it, sends it to the URL or the email address you indicate. This is the usual way of validating an operation over the phone.
IVR=3 (AI assistant): as soon as the message ends, the call moves on to a conversation with the AI assistant trained with the information in your account: the recipient speaks normally, the assistant understands and answers. If it cannot solve the query, it transfers the call to the phone you indicate. Each minute of conversation with the AI has an additional cost in credits.
Key presses also reach you as a report (status 503), with the key or the PIN in the Digitos field.
You do not need to send the whole menu on every request, nor to record your audio files again:
- Saved menus: those you built with the IVR editor of the panel are used by giving their name or their identifier in PLANTILLAIVR.
- Scenarios: a scenario can be given in ESCENARIO, but bear in mind that scenarios belong to inbound calls (entry mode, opening hours, voicemail, hold music...): from a scenario, only its menu is used here, which is the only part that means the same thing on an outgoing call. The rest is ignored on purpose.
- Audio files: the mp3 files you uploaded to your account library are played by writing (MP3:name.mp3) inside the MENSAJE.
The GetPlantillasVOZ function returns all of that exactly as you have it saved and, on top of it, the numbers you can use as REMITENTE and the extensions and ring groups with their values already spelled out for menu actions 8 and 9. One call before you start and there is nothing left to guess.
If you have the Virtual PBX, the LlamarVOZ function does something different from everything above: it does not play a message, it puts one of your agents through to a number. The phone of the agent rings first (every device of their extension) and, as soon as they pick up, the destination is dialled and both calls are bridged. This is what lets you call from your CRM without installing anything: the call goes out from the PBX with the company number, is kept in the call history and is charged like any other outgoing call. If the agent does not pick up, nobody is dialled and nothing is charged.
In your panel (Configuration -> Development API) set the URL of your server where you want to receive status changes. From then on you will get a POST request for every status change of every call you sent with REPORT=1: when it rings, when it is answered, when a key is pressed, when the message is left on an answering machine and when it ends, with the real duration. The format is described at the end of this document.
This is the way to follow your calls: set the URL up and leave it running before you start calling. Reports always go to that URL, so that there is a single place to look at when something does not arrive.
Every example is the JSON body of a POST request with basic authentication. They all go to https://api.mensatek.com/v7/EnviarVOZ except the last four, which state their function. The phone numbers are made up: use your own calling number and your own recipients.
A.1 The bare minimum: a notice and nothing else. An alert that is read out and hung up. This is how a whole call is sent, headers included:
curl -X POST https://api.mensatek.com/v7/EnviarVOZ \
-u "APIUser:APIToken" \
-H "Content-Type: application/json" \
-d '{"RESP":"JSON","REMITENTE":"34910123456","LENGUAJE":"en-GB:1","MENSAJE":"Notice from your alarm system: an opening has been detected at the main door.","REPORT":"1","DESTINATARIOS":[{"Telefono":"34600123456"}]}'
And this is what comes back:
{
"Res": 1,
"idEnvio": 1228853777,
"Destinatarios": 1,
"Encoladas": [
{ "Telefono": "34600123456", "idMensaje": 108366478 }
],
"NoEncoladas": "",
"FueraDeHorario": 0,
"Duplicados": 0,
"ListaNegra": 0,
"Cred": 1250.5
}
Keep the idMensaje of each recipient: it is the one that travels in every report of that call, and the one used to cancel it.
A.2 PIN / OTP code over the phone. The code is spelled out so that it is understood first time, and then repeated. No interactivity: the call hangs up when it ends.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"REFERENCIAUSUARIO": "OTP-88421",
"MENSAJE": "Your verification code is (PAUSA:1) (SPELL:481902) (PAUSA:1) I repeat: (SPELL:481902)",
"DESTINATARIOS": [
{ "Telefono": "34600123456" }
]
}
A.3 Urgent alert with acknowledgement. The alert is read out and an answer is requested: key 1 notifies your URL so you can record who took notice, and key 2 repeats the alert in case it was not heard properly. With retries every five minutes and a short ring, to find out quickly that nobody is there.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"REFERENCIAUSUARIO": "ALERT-DC-2026-09-15",
"MENSAJE": "Attention (Nombre). Alert at the data centre: temperature out of range.",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Press 1 to confirm that you are handling the alert, or 2 to hear it again",
"1": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/alerts/ok", "LOCUCIONFINAL": "Thank you, it has been recorded" },
"2": { "ACCION": 1, "REPETIRMENU": 1 }
},
"TIMBRADO": "20",
"DETECTARCONTESTADOR": "1",
"REINTENTOS": "3",
"INTERVALO": "5",
"DESTINATARIOS": [
{ "Nombre": "Luis", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Luis" } ] },
{ "Nombre": "Marta", "Telefono": "34600123457", "Variables": [ { "Nombre": "Nombre", "Valor": "Marta" } ] }
]
}
With DETECTARCONTESTADOR=1 an answering machine does not count as a delivered notice: the call is hung up and tried again.
A.4 If a person does not take it, leave it on the answering machine. With DETECTARCONTESTADOR=3 the system waits for the beep and leaves the message after it; you will get report 511.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "This is your garage calling: your vehicle is ready for collection.",
"DETECTARCONTESTADOR": "3",
"DESTINATARIOS": [
{ "Telefono": "34600123456" }
]
}
A.5 Make sure a person hears the message. The opposite of the previous one: with DETECTARCONTESTADOR=2 the call is hung up when an answering machine is detected and tried again; only if the machine answers again once the retries are exhausted is the message left on it.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "Hello (Nombre), we need to confirm your appointment with the specialist tomorrow.",
"DETECTARCONTESTADOR": "2",
"REINTENTOS": "4",
"INTERVALO": "30",
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" } ] }
]
}
A.6 Validating an operation with a PIN. The recipient types the code your application gave them and you receive it at your URL right away, on top of report 503.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"REFERENCIAUSUARIO": "SIGN-TRANSFER-7781",
"MENSAJE": "We are calling to confirm a transfer of (Importe).",
"IVR": "2",
"MENUIVR": {
"LOCUCION": "Enter your six digit code and finish with the hash key",
"LONGPIN": 6,
"ACCIONPIN": 2,
"VALORACCIONPIN": "https://www.yourdomain.com/pin/received",
"LOCUCIONFINALPIN": "Thank you, we have received your code"
},
"DESTINATARIOS": [
{ "Telefono": "34600123456", "Variables": [ { "Nombre": "Importe", "Valor": "1,250 euros" } ] }
]
}
A.7 One question answered from 1 to 5. Each key notifies a different URL (or the same one with another parameter) and the key also reaches you in report 503, in the Digitos field.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"REFERENCIAUSUARIO": "SURVEY-SEP",
"MENSAJE": "Hello (Nombre), thank you for trusting us.",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Please rate the service from 1 to 5, where 5 is very satisfied",
"1": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/survey?score=1" },
"2": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/survey?score=2" },
"3": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/survey?score=3" },
"4": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/survey?score=4" },
"5": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/survey?score=5", "LOCUCIONFINAL": "Many thanks for your feedback" }
},
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" } ] }
]
}
A.8 Letting them ask not to be called again. Action 5 puts the recipient on your blacklist: they will not be called again in any of your calls, and those left out are counted in ListaNegra. An exit like this is good practice in any automated notice.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "This is a reminder that your policy expires on (Dia).",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Press 1 to have an agent call you, or 9 if you do not wish to receive further notices",
"1": { "ACCION": 4, "VALOR": "34910654321", "LOCUCIONPREVIA": "I am putting you through to an agent" },
"9": { "ACCION": 5, "LOCUCIONFINAL": "Understood, we will not call you again" }
},
"DESTINATARIOS": [
{ "Telefono": "34600123456", "Variables": [ { "Nombre": "Dia", "Valor": "the 30th of September" } ] }
]
}
A.9 A notice that can end up talking to a person. Key 1 passes the call to extension 101 of your PBX (all of its devices ring and the first one to pick up keeps the call) and key 2 to ring group 4, the support team. Whatever is said with the sales rep is recorded.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "Hello (Nombre), your order (Pedido) leaves our warehouse today.",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Press 1 to talk to your sales rep, 2 for technical support, or 3 if you need nothing else",
"1": { "ACCION": 8, "VALOR": "ext:101", "LOCUCIONPREVIA": "I am putting you through to your sales rep", "GRABAR": 1 },
"2": { "ACCION": 9, "VALOR": "grupo:4", "LOCUCIONPREVIA": "I am putting you through to technical support" },
"3": { "ACCION": 6, "LOCUCIONFINAL": "Thank you for your business" }
},
"MAXDURACION": "1800",
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" }, { "Nombre": "Pedido", "Valor": "A-4421" } ] }
]
}
If nobody answers the extension, its configured destination for when it is unavailable applies; the call is never left in silence. When a person takes it you get a report with status 512 and the extension in Detalle. The values for actions 8 and 9 (ext:101, grupo:4) are handed to you ready made by GetPlantillasVOZ.
A.10 Recording the whole call. GRABAR=1 records from the moment the call is answered, the answers of the recipient included. Warning them that the call is recorded is up to you: say it in the message itself, as here.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"GRABAR": "1",
"MENSAJE": "This is (Empresa) calling to confirm your order. This call is being recorded.",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Press 1 to confirm the order or 2 to cancel it",
"1": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/order/confirmed" },
"2": { "ACCION": 2, "VALOR": "https://www.yourdomain.com/order/cancelled" }
},
"DESTINATARIOS": [
{ "Telefono": "34600123456", "Variables": [ { "Nombre": "Empresa", "Valor": "Aguado Furniture" } ] }
]
}
A.11 A conversation with the AI assistant. Once the message ends, the recipient speaks normally and the assistant, trained with the information in your account, answers; if it cannot solve the query, it passes the call to the phone you set in VALORFALLBACK.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "Hello (Nombre), we are calling about the renewal of your service.",
"IVR": "3",
"MENUIVR": {
"LOCUCION": "Tell me, how can I help you",
"VALORFALLBACK": "34910654321"
},
"MAXDURACION": "900",
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" } ] }
]
}
A.12 Calling a company and dialling the extension. If a switchboard answers asking for an extension, EXTENSION dials it with tones and the message is played afterwards, already at the right desk. With a longer ring, because offices take their time to pick up.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"EXTENSION": "204",
"TIMBRADO": "60",
"MENSAJE": "Notice for the accounts department: your invoice (Factura) is available.",
"DESTINATARIOS": [
{ "Telefono": "34911223344", "Variables": [ { "Nombre": "Factura", "Valor": "F-2026-118" } ] }
]
}
A.13 A scheduled reminder, with retries and calling hours. Scheduled for a date, retried every hour up to four times and only placed between 09:00 and 20:00: whatever falls outside waits for the next day. A phone repeated in the list is called only once.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "Hello (Nombre), this is a reminder of your appointment on (Dia) at (Hora).",
"FECHA": "2026-09-20 09:30",
"REINTENTOS": "4",
"INTERVALO": "60",
"FECHALIMITE": "2026-09-21 20:00",
"HORAINICIODIARIA": "09:00",
"HORALIMITEDIARIA": "20:00",
"ELIMINADUPLICADOS": "1",
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" }, { "Nombre": "Dia", "Valor": "Monday the 21st" }, { "Nombre": "Hora", "Valor": "ten" } ] }
]
}
A.14 Spreading a large list over time. Notices whose menu can pass the call to a team of five: at 20 calls per minute the team can keep up. Whatever does not fit at that rate before 20:00 is not queued (it comes back in NoEncoladas and counted in FueraDeHorario).
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "Hello (Nombre), your annual service is due this month.",
"VELOCIDAD": "20",
"HORALIMITEDIARIA": "20:00",
"IVR": "1",
"MENUIVR": {
"LOCUCION": "Press 1 if you would like an agent to take your call now",
"1": { "ACCION": 9, "VALOR": "grupo:4", "LOCUCIONPREVIA": "I am putting you through to an agent" }
},
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" } ] }
]
}
A.15 Reusing a menu and an audio file you already have. No need to send the menu on every request nor to write the prompt text: the saved menu is given by its name and your own audio with its marker.
{
"RESP": "JSON",
"REMITENTE": "34910123456",
"LENGUAJE": "en-GB:1",
"REPORT": "1",
"MENSAJE": "(MP3:welcome.mp3) (PAUSA:1) Hello (Nombre), you have a pending matter with us.",
"PLANTILLAIVR": "Appointment confirmation",
"DESTINATARIOS": [
{ "Nombre": "Ana", "Telefono": "34600123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Ana" } ] }
]
}
A.16 The same notice in another language. The language and the gender of the voice go in LENGUAJE; the text, in that language. One request per language.
{
"RESP": "JSON",
"REMITENTE": "351210123456",
"LENGUAJE": "pt-PT:2",
"REPORT": "1",
"MENSAJE": "Ola (Nombre), a sua encomenda sai hoje do nosso armazem.",
"PAIS": "PT",
"TIMEZONE": "Europe/Lisbon",
"DESTINATARIOS": [
{ "Nombre": "Joao", "Telefono": "351910123456", "Variables": [ { "Nombre": "Nombre", "Valor": "Joao" } ] }
]
}
A.17 Asking for the configuration of your account. To https://api.mensatek.com/v7/GetPlantillasVOZ, once when your integration starts: this is where the REMITENTE you may use and the values for actions 8 and 9 come from.
{
"RESP": "JSON"
}
Response (trimmed):
{
"Res": 1,
"Numeros": [
{ "Numero": "34910123456", "Alias": "Customer care", "Pais": "ES", "Tipo": "local" }
],
"PlantillasIVR": [
{ "idPlantilla": 12, "Nombre": "Appointment confirmation", "Tipo": "MENU", "IVR": 1, "Teclas": [ "1", "2" ] }
],
"Audios": [
{ "Fichero": "welcome.mp3", "Marcador": "(MP3:welcome.mp3)" }
],
"Extensiones": [
{ "idExtension": 7, "Extension": "101", "Nombre": "James", "Valor": "ext:101", "Presencia": "disponible" }
],
"Grupos": [
{ "idGrupo": 4, "Nombre": "Technical support", "Numero": "600", "Valor": "grupo:4", "Estrategia": "todos" }
]
}
A.18 Cancelling what has not gone out yet. To https://api.mensatek.com/v7/CancelarVOZ, with the idEnvio of the batch (or the idMensaje of a single call). What already went out is not cancelled and comes back with its status.
{
"RESP": "JSON",
"IDENVIO": "1228853777"
}
Response:
{
"Res": 1,
"Canceladas": [
{ "idMensaje": 108366479, "Movil": "34600123457" }
],
"NoCanceladas": [
{ "idMensaje": 108366478, "Movil": "34600123456", "Resultado": 510, "Estado": "Finalizada" }
],
"CreditosDevueltos": 1,
"Cred": 1249.5
}
A.19 Calling from the CRM (click-to-call). To https://api.mensatek.com/v7/LlamarVOZ: the extension of the agent rings and, as soon as they pick up, the customer is dialled and both calls are bridged. If the agent does not pick up, nobody is called.
{
"RESP": "JSON",
"EXTENSION": "101",
"DESTINO": "34600123456"
}
Response:
{
"Res": 1,
"Extension": "101",
"Destino": "34600123456",
"idLlamada": "9f2c41a7b8d05e6a",
"Info": "We are calling your extension 101. When you pick up, we dial the number.",
"Cred": 1249.5
}
A.20 What to do with errors. A negative Res always carries the reason in Error. It pays to tell three cases apart in your integration: -2 (out of credits) is one to warn whoever runs the account about, -19 (the calling number is not yours) and -3 (bad data) are programming mistakes that repeating the request will not fix, and a 5XX can indeed be retried later.
What you receive at your URL, in order, depending on how the call ends (with REPORT=1):
| HOW IT ENDS | SEQUENCE OF RESULTADO |
| Answered, message heard, hung up | 501 → 502 → 510 |
| Answered and a menu key pressed | 501 → 502 → 503 (one per key press) → 510 |
| Answered, key pressed and taken by an agent of your PBX | 501 → 502 → 503 → 512 (Detalle `ext:101`) → 510 |
| The PIN is entered | 501 → 502 → 503 (Detalle `pin`, the code in Digitos) → 510 |
| An answering machine picks up and you asked to leave the message | 501 → 502 → 511 → 510 |
| An answering machine picks up, you asked not to leave it, with retries | 501 → 502 → 1004 (Detalle `machine`) → ... and the whole sequence again on the retry |
| No answer and retries left | 501 → 1004 → ... and again on the retry |
| No answer and no retries left | 501 → 551 |
| The number gives no line | 553 (no further events: it is not retried) |
Status 510 is the only one that carries the real Duracion and the final Creditos. If you only care about the outcome, process 510, 511, 551 and 553.
Bear this in mind when writing your receiver: events may arrive more than once if your server did not answer in time (discard them by idReport, which is unique), and a call with retries repeats the whole sequence on every attempt (always with the same idMensaje).
HTTP Basic authentication. Use your API User as the username and your API Token as the password (you will find them in your panel, under Your Data → Configure Account). The resulting header is Authorization: Basic base64(APIUser:APIToken). Most HTTP libraries build it automatically (curl -u, requests auth=, Ruby's basic_auth, etc.) without needing to encode the base64 by hand.
basicFunction to place voice calls from your applications. It queues one call per recipient and returns the identifier of each one.
PLEASE NOTE: set the reception of reports up in your panel if you want to receive the status of the calls and the key presses of the recipient in real time on a script of your website.
| Mensaje required | string Example: Mensaje=Hello (Nombre), this is a reminder of your appointment tomorrow (PAUSA:1) at ten in the morning. Text that is converted to speech and read out to the recipient. It accepts variables of the form |
| Remitente required | string Example: Remitente=34910123456 Number shown as the caller, in international format without the + sign and without spaces. It must be a voice number of your account (VOICE calls -> My numbers). If the number is not yours the request is rejected with Res=-19. |
| Destinatarios required | Array of arrays Example: Destinatarios=[{"Nombre":"Peter Perez","Telefono":"34600123456","Variables":[{"Nombre":"Nombre","Valor":"Peter"},{"Nombre":"Importe","Valor":"120 euros"}]}] JSON array with the recipients of the call. Each element accepts NOMBRE (optional), TELEFONO (required, in international format without + and without spaces) and VARIABLES (optional) to personalise the message for each recipient. |
| Fecha | string Example: Fecha=2026-09-15 10:30 Date the call is scheduled for. Empty by default, which means call right away. Format Year-Month-day hour:minute. The time reference is CET/CEST (time zone of Spain). |
| Lenguaje | string Example: Lenguaje=en-GB:1 Language and voice of the speech, in the form |
| Detectarcontestador | string Enum: 0 1 2 3 Example: Detectarcontestador=0 What to do when the call is answered by an answering machine:
|
| Reintentos | integer Example: Reintentos=3 Number of times the call is retried when there is no answer (0 to 10). With 0 it is not retried. |
| Intervalo | integer Example: Intervalo=60 Minutes to wait between retries (5 to 1440). |
| Fechalimite | string Example: Fechalimite=2026-09-30 20:00 Deadline for the retries: after that date the number is not called again. One month from the request by default. Format Year-Month-day hour:minute. |
| Horainiciodiaria | string Example: Horainiciodiaria=10:00 Time from which calls MAY be placed each day, in HH:MM format. A call falling outside the allowed window is rescheduled for this time. |
| Horalimitediaria | string Example: Horalimitediaria=22:00 Time from which calls are NOT placed each day, in HH:MM format. |
| Ivr | string Enum: 0 1 2 3 Example: Ivr=0 Interactivity of the call:
|
| Menuivr | Array of strings Example: Menuivr={"LOCUCION":"Press 1 to confirm the appointment or 2 to talk to an agent","1":{"ACCION":2,"VALOR":"https://www.yourdomain.com/confirmed","LOCUCIONFINAL":"Thank you, your appointment is confirmed"},"2":{"ACCION":4,"VALOR":"34910654321"}} Definition of the key menu (IVR=1) or of the PIN request (IVR=2).
|
| Plantillaivr | string Example: Plantillaivr=Appointment confirmation Name or identifier of a menu saved in your account with the IVR editor of the panel. It is used instead of MENUIVR and saves you from sending the menu on every request; if you send both, MENUIVR wins. If you do not set IVR, the type (menu, PIN or assistant) is taken from the saved menu itself. Get the list with GetPlantillasVOZ. |
| Escenario | string Example: Escenario=vip-support Key or identifier of a scenario of your account. Scenarios belong to inbound calls: on an outgoing call only their menu is used (entry mode, opening hours, voicemail or hold music make no sense when you are the one calling). If the scenario has no menu, the request is rejected. Get the list with GetPlantillasVOZ. |
| Referenciausuario | string Example: Referenciausuario=APPOINTMENTS-2026-09-15 Free reference you assign to the batch. You will get it back in every report in the Referencia field, so that you can match it with your own system. |
| Extension | string Example: Extension=204 Digits dialled with tones (DTMF) as soon as the call is answered, before the message is played. It is there to get through the switchboard of the recipient and leave the notice at a specific desk: if the switchboard answers with a 'please dial the extension you want', put that number here. Digits only. |
| Timbrado | integer Example: Timbrado=30 Seconds the phone rings before the call is given up as unanswered, from 5 to 180. With 0 the value of the system is used: 30 seconds, or 25 if you asked for answering machine detection.
|
| Maxduracion | integer Example: Maxduracion=0 Safety cut: maximum seconds the call may last, from 30 to 14400 (four hours). When it is reached, the call is hung up and you receive the finished report with |
| Grabar | string Enum: 0 1 Example: Grabar=0 1 to record the whole call from the moment it is answered, including the answers of the recipient and the conversation if the call ends up with an agent. The recording is kept in your account (VOICE calls -> Recordings) and is charged per minute recorded. Warning the recipient that the call is being recorded is your responsibility: say so in the MENSAJE. |
| Velocidad | integer Example: Velocidad=0 Calls per minute: instead of placing the whole list at once, the output is spread over time from the FECHA of the request. It is there so that you do not overwhelm your team when the menu ends up passing calls to an extension or to a ring group. With 0 (default) there is no limit.
|
| Eliminaduplicados | string Enum: 0 1 Example: Eliminaduplicados=0 1 to call only once a phone number that appears more than once in DESTINATARIOS. The repeated ones that were not called come back in the Duplicados counter. With 0 it is called as many times as it appears. |
| Pais | string Example: Pais=ES Two letter country code of the destination, used as a reference of the batch. |
| Timezone | string Example: Timezone=Europe/Madrid Time zone HORAINICIODIARIA and HORALIMITEDIARIA refer to. |
| Report | string Enum: 0 1 Example: Report=1 1 to receive the status changes of the calls at the URL configured in your panel (Configuration -> Development API). 0 not to receive them. |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Format of the response: TXT, JSON or XML. |
Parameters are sent in the body of the POST request, either as a JSON object (Content-Type application/json, RECOMMENDED) or as an application/x-www-form-urlencoded form. In the form format, array or object parameters are sent as a JSON-encoded string. Parameter names are case-insensitive. The detailed description of each parameter is in the parameters section of this operation.
| Mensaje required | string |
| Remitente required | string |
| Destinatarios required | Array of any |
| Fecha | string |
| Lenguaje | string |
| Detectarcontestador | string |
| Reintentos | integer |
| Intervalo | integer |
| Fechalimite | string |
| Horainiciodiaria | string |
| Horalimitediaria | string |
| Ivr | string |
| Menuivr | Array of any |
| Plantillaivr | string |
| Escenario | string |
| Referenciausuario | string |
| Extension | string |
| Timbrado | integer |
| Maxduracion | integer |
| Grabar | string |
| Velocidad | integer |
| Eliminaduplicados | string |
| Pais | string |
| Timezone | string |
| Report | string |
| Resp | string |
| Res required | integer <int32> Response of the requested function
|
| Error | string When Res is negative, description of the problem. |
| idEnvio | integer Identifier of the batch. You will get it in every report and it lets you query or cancel the whole batch. |
| Destinatarios | integer Number of recipients processed. |
| Encoladas | Array of arrays Calls queued successfully. The idMensaje identifies each call: it is the one that travels in the reports and the one used in CancelarVOZ. |
| NoEncoladas | Array of arrays Recipients that could not be queued (invalid number, no voice coverage, no credits or, if you used VELOCIDAD, because they did not fit in the calling window). |
| FueraDeHorario | integer Calls not queued because, at the rate asked for in VELOCIDAD, they do not fit before HORALIMITEDIARIA. Raise the rate, widen the window or split the batch into several requests. |
| Duplicados | integer Repeated phone numbers that were not called twice. It can only be other than 0 if you sent ELIMINADUPLICADOS=1. |
| ListaNegra | integer Recipients not called because they are on your blacklist (they opted out on a previous call). |
| Cred | number Credits left in your account after the operation. |
"{\n \"RESP\": \"JSON\",\n \"MENSAJE\": \"Hello (Nombre), this is a reminder of your appointment tomorrow (PAUSA:1) at ten.\",\n \"REMITENTE\": \"34910123456\",\n \"LENGUAJE\": \"en-GB:1\",\n \"REPORT\": \"1\",\n \"REFERENCIAUSUARIO\": \"APPOINTMENTS-2026-09-15\",\n \"DETECTARCONTESTADOR\": \"0\",\n \"REINTENTOS\": \"2\",\n \"INTERVALO\": \"60\",\n \"IVR\": \"1\",\n \"MENUIVR\": {\n \"LOCUCION\": \"Press 1 to confirm the appointment or 2 to talk to an agent\",\n \"1\": {\"ACCION\": 2, \"VALOR\": \"https://www.yourdomain.com/confirmed\", \"LOCUCIONFINAL\": \"Thank you, your appointment is confirmed\"},\n \"2\": {\"ACCION\": 4, \"VALOR\": \"34910654321\"}\n },\n \"DESTINATARIOS\": [\n {\"Nombre\": \"Peter Perez\", \"Telefono\": \"34600123456\", \"Variables\": [{\"Nombre\": \"Nombre\", \"Valor\": \"Peter\"}]},\n {\"Nombre\": \"Anne Aguado\", \"Telefono\": \"34600123457\", \"Variables\": [{\"Nombre\": \"Nombre\", \"Valor\": \"Anne\"}]}\n ]\n}\n"[- {
- "Res": "2",
- "Error": "REMITENTE is not a voice number of this account",
- "idEnvio": "1228853777",
- "Destinatarios": "2",
- "Encoladas": "[{\"Telefono\": \"34600123456\",\"idMensaje\": \"108366478\"}]",
- "NoEncoladas": "[{\"Telefono\": \"34600123457\",\"Nombre\": \"Anne Aguado\",\"Res\": -2}]",
- "FueraDeHorario": "0",
- "Duplicados": "0",
- "ListaNegra": "0",
- "Cred": "1250.50"
}
]Returns everything you have saved in your account and can use in your calls, so that you do not have to guess: the numbers valid as REMITENTE, the menus built with the IVR editor (for PLANTILLAIVR), the scenarios (for ESCENARIO, of which only the menu is used), the audio files of your library (to write them in the MENSAJE as (MP3:name.mp3)) and the extensions and ring groups with the value already built for menu actions 8 and 9.
Call it once when your integration starts and keep the result: this is configuration data, it does not change from call to call.
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Format of the response: TXT, JSON or XML. |
Parameters are sent in the body of the POST request, either as a JSON object (Content-Type application/json, RECOMMENDED) or as an application/x-www-form-urlencoded form. In the form format, array or object parameters are sent as a JSON-encoded string. Parameter names are case-insensitive. The detailed description of each parameter is in the parameters section of this operation.
| Resp | string |
| Res required | integer <int32> Response of the requested function
|
| Numeros | Array of arrays Numbers you can put in REMITENTE: the voice numbers of your account and the numeric senders already validated. This is exactly what EnviarVOZ accepts, so any other number will give you Res=-19. Tipo |
| PlantillasIVR | Array of arrays Menus saved with the IVR editor. Use the Nombre or the idPlantilla in the PLANTILLAIVR parameter of EnviarVOZ; the IVR field tells you which value matches that menu (1 key menu, 2 PIN, 3 assistant). |
| Escenarios | Array of arrays Scenarios of your account. Use the Clave or the idEscenario in the ESCENARIO parameter of EnviarVOZ. Only those with TieneMenu = 1 are of any use: from a scenario, on an outgoing call, only the menu is used. |
| Audios | Array of arrays Audio files of your account library. Write the Marcador inside the MENSAJE at the point where you want it to play. |
| Extensiones | Array of arrays Active extensions of your PBX. Copy the Valor field into MENUIVR[key][VALOR] with ACCION=8, and use them in LlamarVOZ as well. Presencia tells you whether the extension is available or paused: a paused extension does not ring, the call would go to its destination for when it is unavailable. |
| Grupos | Array of arrays Active ring groups. Copy the Valor field into MENUIVR[key][VALOR] with ACCION=9. The Estrategia is the one configured in the panel (all at once, one after another, and so on). |
"{\n \"RESP\": \"JSON\"\n}\n"[- {
- "Res": "1",
- "Numeros": "[{\"Numero\":\"34910123456\",\"Alias\":\"Customer care\",\"Pais\":\"ES\",\"Tipo\":\"local\"}]",
- "PlantillasIVR": "[{\"idPlantilla\":12,\"Nombre\":\"Appointment confirmation\",\"Tipo\":\"MENU\",\"IVR\":1,\"Teclas\":[\"1\",\"2\"]}]",
- "Escenarios": "[{\"idEscenario\":3,\"Clave\":\"vip-support\",\"Nombre\":\"VIP support\",\"TieneMenu\":1}]",
- "Audios": "[{\"Fichero\":\"welcome.mp3\",\"Marcador\":\"(MP3:welcome.mp3)\"}]",
- "Extensiones": "[{\"idExtension\":7,\"Extension\":\"101\",\"Nombre\":\"James\",\"Valor\":\"ext:101\",\"Presencia\":\"disponible\"}]",
- "Grupos": "[{\"idGrupo\":4,\"Nombre\":\"Technical support\",\"Numero\":\"600\",\"Valor\":\"grupo:4\",\"Estrategia\":\"todos\"}]"
}
]Cancels scheduled calls that have not been placed yet, one by one or the whole batch. Calls that already went out or are in progress are not cancelled: they come back in NoCanceladas with their status. The credits reserved for the calls actually cancelled go back to your balance.
| Idmensaje | integer Example: Idmensaje=108366478 Identifier of the call to cancel. You must give either IDMENSAJE or IDENVIO. |
| Idenvio | integer Example: Idenvio=1228853777 Identifier of the batch: cancels all of its pending calls. |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Format of the response: TXT, JSON or XML. |
Parameters are sent in the body of the POST request, either as a JSON object (Content-Type application/json, RECOMMENDED) or as an application/x-www-form-urlencoded form. In the form format, array or object parameters are sent as a JSON-encoded string. Parameter names are case-insensitive. The detailed description of each parameter is in the parameters section of this operation.
| Idmensaje | integer |
| Idenvio | integer |
| Resp | string |
| Res required | integer <int32> Response of the requested function
|
| Canceladas | Array of arrays Calls cancelled. |
| NoCanceladas | Array of arrays Calls that could no longer be cancelled, with the status they are in. |
| CreditosDevueltos | number Credits returned to your balance for the cancelled calls. |
| Cred | number Credits left in your account after the operation. |
"{\n \"RESP\": \"JSON\",\n \"IDENVIO\": \"1228853777\"\n}\n"[- {
- "Res": "2",
- "Canceladas": "[{\"idMensaje\":108366478,\"Movil\":\"34600123456\"}]",
- "NoCanceladas": "[{\"idMensaje\":108366479,\"Movil\":\"34600123457\",\"Resultado\":510,\"Estado\":\"Finalizada\"}]",
- "CreditosDevueltos": "2",
- "Cred": "1250.50"
}
]Puts one of your agents through to a number (what is known as click-to-call). The phone of the agent rings first - every device of their extension at the same time: softphone, mobile app and browser - and, as soon as any of them picks up, the destination is dialled and both calls are bridged.
The call goes out from your PBX showing the number of the company (never the mobile of the agent), is kept in the call history and is charged like any other outgoing call, per minute started. If the agent does not pick up, nobody is called and nothing is charged.
The destination may be a phone number or another extension of the account, which is the way to put two colleagues through to each other.
Requires the Virtual PBX with extensions created (VOICE calls -> Extensions); get the list with GetPlantillasVOZ. An authorised user can only call from the extensions assigned to them.
| Extension required | string Example: Extension=101 Extension of the agent the call is made from: it is the one that rings first. The number of the extension only. |
| Destino required | string Example: Destino=34600123456 Who is called: a phone number in international format without the + sign and without spaces, or the number of another extension of your account (internal call). |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Format of the response: TXT, JSON or XML. |
Parameters are sent in the body of the POST request, either as a JSON object (Content-Type application/json, RECOMMENDED) or as an application/x-www-form-urlencoded form. In the form format, array or object parameters are sent as a JSON-encoded string. Parameter names are case-insensitive. The detailed description of each parameter is in the parameters section of this operation.
| Extension required | string |
| Destino required | string |
| Resp | string |
| Res required | integer <int32> Response of the requested function
|
| Error | string When Res is negative, description of the problem. |
| Extension | string Extension the call is being made from. |
| Destino | string Destination that will be dialled once the agent picks up. |
| idLlamada | string Internal identifier of this call. Keep it in your log: it is what allows us to find the call if you ever need to ask us about it. |
| Info | string Text ready to be shown to the agent in your application. |
| Cred | number Credits left in your account. |
"{\n \"RESP\": \"JSON\",\n \"EXTENSION\": \"101\",\n \"DESTINO\": \"34600123456\"\n}\n"[- {
- "Res": "1",
- "Error": "That extension does not exist or is not active.",
- "Extension": "101",
- "Destino": "34600123456",
- "idLlamada": "9f2c41a7b8d05e6a",
- "Info": "We are calling your extension 101. When you pick up, we dial the number.",
- "Cred": "1250.50"
}
]REAL TIME RECEPTION OF THE STATUS OF YOUR CALLS ON A SCRIPT OF YOUR SERVER.
By setting the URL of your script in your user panel (Configuration -> Development API), you will receive a POST request every time a call sent with REPORT=1 changes status.
You can choose to receive the requests with basic authentication and in JSON or FORM-DATA format.
You will get one request per status change, not only at the end of the call: that way you know whether it rang, whether it was answered, which key was pressed and how it ended. All of them carry Servicio = VOZ.
{"Servicio":"VOZ","Resultado":"510","Fecha":"2026-09-15 10:31:04","Movil":"34600123456","Prefijo":"34","Remitente":"34910123456","idMensaje":"108366478","idReport":"3497","idEnvio":"1228853777","Duracion":"34","Digitos":"1","Detalle":"normal_clearing","Referencia":"APPOINTMENTS-2026-09-15"}
The numeric status code travels in the Resultado field. If you only care about the outcome of the call, process statuses 510, 511, 551 and 553 and ignore the rest.
Parámetros recibidos en su script en petición POST con la configuración especificada en su panel de usuario/configuración API.
| Servicio required | string Type of report you are receiving, so that you can tell it apart from the ones of the other services. On voice calls it is always | |||||||||||||||||||||||||||||||||||||||
| Resultado required | integer Status of the call at the moment of the event. The possible statuses are:
| |||||||||||||||||||||||||||||||||||||||
| Fecha required | string Date and time of the event (CET/CEST). | |||||||||||||||||||||||||||||||||||||||
| Movil required | string Phone number of the recipient of the call. | |||||||||||||||||||||||||||||||||||||||
| Prefijo | string International dialling code of the recipient. | |||||||||||||||||||||||||||||||||||||||
| Remitente | string Calling number the call was made from. | |||||||||||||||||||||||||||||||||||||||
| idMensaje required | integer Identifier of the call, the one EnviarVOZ returned in Encoladas. | |||||||||||||||||||||||||||||||||||||||
| idReport | integer Unique identifier of this event. Use it to discard duplicates if your server did not answer in time and the delivery was retried. | |||||||||||||||||||||||||||||||||||||||
| idEnvio | integer Identifier of the batch the call belongs to. | |||||||||||||||||||||||||||||||||||||||
| Duracion | integer Seconds of conversation. It is only filled in on the final event (status 510). | |||||||||||||||||||||||||||||||||||||||
| Digitos | string Key pressed or PIN entered in this event (status 503). One report arrives per key press, with the key of that press. | |||||||||||||||||||||||||||||||||||||||
| Detalle | string Nuance of the event. What it carries depends on the status:
On statuses 501, 502 and 511 this field comes empty. The hangup causes are reported by the carrier, so others may show up now and then ( | |||||||||||||||||||||||||||||||||||||||
| Creditos | string Credits used by the call. They are known when the call ends, so on intermediate events it may come as 0; the final event carries the definitive cost. | |||||||||||||||||||||||||||||||||||||||
| Referencia | string The REFERENCIAUSUARIO you set when sending the call. |
{- "Servicio": "VOZ",
- "Resultado": "510",
- "Fecha": "2026-09-15 10:31:04",
- "Movil": "34600123456",
- "Prefijo": "34",
- "Remitente": "34910123456",
- "idMensaje": "108366478",
- "idReport": "3497",
- "idEnvio": "1228853777",
- "Duracion": "34",
- "Digitos": "1",
- "Detalle": "normal_clearing",
- "Creditos": "2",
- "Referencia": "APPOINTMENTS-2026-09-15"
}