curl --request POST \
--url https://api.wppfy.com/quick-replies \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"shortCut": "endereco",
"message": {
"kind": "location",
"name": "Loja Centro",
"latitude": -23.5614,
"longitude": -46.6559
}
}
'import requests
url = "https://api.wppfy.com/quick-replies"
payload = {
"shortCut": "endereco",
"message": {
"kind": "location",
"name": "Loja Centro",
"latitude": -23.5614,
"longitude": -46.6559
}
}
headers = {
"token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {token: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
shortCut: 'endereco',
message: {kind: 'location', name: 'Loja Centro', latitude: -23.5614, longitude: -46.6559}
})
};
fetch('https://api.wppfy.com/quick-replies', 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.wppfy.com/quick-replies",
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([
'shortCut' => 'endereco',
'message' => [
'kind' => 'location',
'name' => 'Loja Centro',
'latitude' => -23.5614,
'longitude' => -46.6559
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"token: <api-key>"
],
]);
$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.wppfy.com/quick-replies"
payload := strings.NewReader("{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("token", "<api-key>")
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.wppfy.com/quick-replies")
.header("token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wppfy.com/quick-replies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"shortCut": "<string>",
"aiDescription": "<string>",
"onWhatsApp": true,
"message": {
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
},
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"code": 401,
"message": "Token inválido.",
"data": {}
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}Crear respuesta rápida
Guarda un mensaje predefinido de cualquier tipo: texto, archivo, contacto, ubicación, menú o PIX, para usarlo en la atención.
El mensaje usa el mismo cuerpo del envío correspondiente; consulte la tabla en message.
curl --request POST \
--url https://api.wppfy.com/quick-replies \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"shortCut": "endereco",
"message": {
"kind": "location",
"name": "Loja Centro",
"latitude": -23.5614,
"longitude": -46.6559
}
}
'import requests
url = "https://api.wppfy.com/quick-replies"
payload = {
"shortCut": "endereco",
"message": {
"kind": "location",
"name": "Loja Centro",
"latitude": -23.5614,
"longitude": -46.6559
}
}
headers = {
"token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {token: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
shortCut: 'endereco',
message: {kind: 'location', name: 'Loja Centro', latitude: -23.5614, longitude: -46.6559}
})
};
fetch('https://api.wppfy.com/quick-replies', 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.wppfy.com/quick-replies",
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([
'shortCut' => 'endereco',
'message' => [
'kind' => 'location',
'name' => 'Loja Centro',
'latitude' => -23.5614,
'longitude' => -46.6559
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"token: <api-key>"
],
]);
$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.wppfy.com/quick-replies"
payload := strings.NewReader("{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("token", "<api-key>")
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.wppfy.com/quick-replies")
.header("token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wppfy.com/quick-replies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"shortCut\": \"endereco\",\n \"message\": {\n \"kind\": \"location\",\n \"name\": \"Loja Centro\",\n \"latitude\": -23.5614,\n \"longitude\": -46.6559\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"shortCut": "<string>",
"aiDescription": "<string>",
"onWhatsApp": true,
"message": {
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
},
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"code": 401,
"message": "Token inválido.",
"data": {}
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}{
"error": "temperature must be between 0 and 2",
"code": "validation_failed"
}Autorizaciones
Cuerpo
En la creación, shortCut y message son obligatorios. En la edición, solo cambian los campos enviados; message reemplaza el mensaje completo.
Atajo para encontrar la respuesta (y lo que la IA usa para elegir).
Reservado para la atención automática. Vacío por defecto.
Solo en la creación y solo con kind: text: también lo crea en WhatsApp Business.
Mensaje guardado: kind más el mismo cuerpo del envío correspondiente, sin number y sin campos de envío (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Cuerpo igual a | Observación |
|---|---|---|
text | text | Acepta placeholders como {{name}}. |
media | /send/media: type, file, text, docName | type: image, video, document, audio, ptt o myaudio. Un file por URL se conserva tal como se envió; en base64, la API lo guarda (imagen 5 MB, audio y video 16 MB, documento 20 MB; 50 MB por instancia). |
contact | /send/contact | fullName y phoneNumber obligatorios. |
location | /send/location | latitude y longitude obligatorias. |
menu | /send/menu | type: button, button_legacy, list o poll (carrusel todavía no). El medio del botón (file) solo por URL. Las opciones deben poder enviarse, de lo contrario 400: encuesta con al menos 2, lista con al menos un elemento (la sección [...] no cuenta) y botones con al menos 1. |
pix | /send/pix-button | pixType y pixKey obligatorios. |
Show child attributes
Show child attributes
{
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
}
Respuesta
Respuesta rápida creada
Atajo para encontrar la respuesta (y lo que la IA usa para elegir).
Reservado para la atención automática. Vacío por defecto.
Si la respuesta también está en WhatsApp Business (solo texto).
Mensaje guardado: kind más el mismo cuerpo del envío correspondiente, sin number y sin campos de envío (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Cuerpo igual a | Observación |
|---|---|---|
text | text | Acepta placeholders como {{name}}. |
media | /send/media: type, file, text, docName | type: image, video, document, audio, ptt o myaudio. Un file por URL se conserva tal como se envió; en base64, la API lo guarda (imagen 5 MB, audio y video 16 MB, documento 20 MB; 50 MB por instancia). |
contact | /send/contact | fullName y phoneNumber obligatorios. |
location | /send/location | latitude y longitude obligatorias. |
menu | /send/menu | type: button, button_legacy, list o poll (carrusel todavía no). El medio del botón (file) solo por URL. Las opciones deben poder enviarse, de lo contrario 400: encuesta con al menos 2, lista con al menos un elemento (la sección [...] no cuenta) y botones con al menos 1. |
pix | /send/pix-button | pixType y pixKey obligatorios. |
Show child attributes
Show child attributes
{
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
}
