curl --request POST \
--url https://api.bookliftagent.com/v1/negocios/{negocioId}/chat \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sesion": "cliente-34600111222",
"mensajes": [
{
"rol": "cliente",
"contenido": "Hola, quiero cita para un corte esta semana"
}
]
}
'import requests
url = "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat"
payload = {
"sesion": "cliente-34600111222",
"mensajes": [
{
"rol": "cliente",
"contenido": "Hola, quiero cita para un corte esta semana"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sesion: 'cliente-34600111222',
mensajes: [{rol: 'cliente', contenido: 'Hola, quiero cita para un corte esta semana'}]
})
};
fetch('https://api.bookliftagent.com/v1/negocios/{negocioId}/chat', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sesion' => 'cliente-34600111222',
'mensajes' => [
[
'rol' => 'cliente',
'contenido' => 'Hola, quiero cita para un corte esta semana'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat"
payload := strings.NewReader("{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bookliftagent.com/v1/negocios/{negocioId}/chat")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bookliftagent.com/v1/negocios/{negocioId}/chat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"respuesta": "¡Hola! Tengo hueco el jueves a las 16:00 o el viernes a las 11:30. ¿Cuál te viene mejor?",
"calendario_url": null,
"negocio_id": "peluqueria-sol"
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}{
"error": {
"codigo": "clave_invalida",
"mensaje": "La clave de API no es válida o fue revocada."
}
}{
"error": {
"codigo": "sin_creditos",
"mensaje": "Has agotado los créditos de este mes. Amplía tu plan para seguir.",
"limite_mes": 25000,
"periodo": "2026-08-01"
}
}{
"error": {
"codigo": "negocio_no_encontrado",
"mensaje": "Ese negocio no existe en tu organización."
}
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}Conversar con un agente
Envía el historial de la conversación y recibe la respuesta del agente, que aplica los servicios, precios y horarios de ese negocio y puede cerrar una reserva en su calendario.
Consume 1 crédito por llamada con éxito. Si el agente falla, el crédito se devuelve automáticamente.
Manda el historial completo (o los últimos mensajes) para que el agente
no pierda el hilo. Si repites sesion entre llamadas, recordamos la
conversación por ti.
curl --request POST \
--url https://api.bookliftagent.com/v1/negocios/{negocioId}/chat \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sesion": "cliente-34600111222",
"mensajes": [
{
"rol": "cliente",
"contenido": "Hola, quiero cita para un corte esta semana"
}
]
}
'import requests
url = "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat"
payload = {
"sesion": "cliente-34600111222",
"mensajes": [
{
"rol": "cliente",
"contenido": "Hola, quiero cita para un corte esta semana"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sesion: 'cliente-34600111222',
mensajes: [{rol: 'cliente', contenido: 'Hola, quiero cita para un corte esta semana'}]
})
};
fetch('https://api.bookliftagent.com/v1/negocios/{negocioId}/chat', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sesion' => 'cliente-34600111222',
'mensajes' => [
[
'rol' => 'cliente',
'contenido' => 'Hola, quiero cita para un corte esta semana'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bookliftagent.com/v1/negocios/{negocioId}/chat"
payload := strings.NewReader("{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bookliftagent.com/v1/negocios/{negocioId}/chat")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bookliftagent.com/v1/negocios/{negocioId}/chat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sesion\": \"cliente-34600111222\",\n \"mensajes\": [\n {\n \"rol\": \"cliente\",\n \"contenido\": \"Hola, quiero cita para un corte esta semana\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"respuesta": "¡Hola! Tengo hueco el jueves a las 16:00 o el viernes a las 11:30. ¿Cuál te viene mejor?",
"calendario_url": null,
"negocio_id": "peluqueria-sol"
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}{
"error": {
"codigo": "clave_invalida",
"mensaje": "La clave de API no es válida o fue revocada."
}
}{
"error": {
"codigo": "sin_creditos",
"mensaje": "Has agotado los créditos de este mes. Amplía tu plan para seguir.",
"limite_mes": 25000,
"periodo": "2026-08-01"
}
}{
"error": {
"codigo": "negocio_no_encontrado",
"mensaje": "Ese negocio no existe en tu organización."
}
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}{
"error": {
"codigo": "<string>",
"mensaje": "<string>"
}
}Autorizaciones
Tu clave de API (bk_live_... o bk_test_...).
Encabezados
Identificador único de esta llamada. Un reintento con el mismo valor no vuelve a cobrar.
200Parámetros de ruta
Identificador del negocio dentro de tu organización.
Cuerpo
Historial de la conversación, del más antiguo al más reciente.
1Show child attributes
Show child attributes
Identificador estable de la conversación (por ejemplo, el teléfono del cliente). Si lo repites, recordamos el hilo y los datos del cliente entre llamadas y entre días. Si lo omites, cada llamada empieza de cero.
"cliente-34600111222"