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": "Invalid token.",
"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"
}Create quick reply
Stores a ready-made message of any type: text, file, contact, location, menu or PIX, for use in customer service.
The message uses the same body as the corresponding send; see the table in 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": "Invalid token.",
"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"
}Authorizations
Body
On creation, shortCut and message are required. On edit, only the fields sent change; message replaces the entire message.
Shortcut to find the reply (and what the AI uses to choose).
Reserved for automated support. Empty by default.
Only on creation and only with kind: text: also creates it in WhatsApp Business.
Stored message: kind plus the same body as the corresponding send, without number and without send fields (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Body same as | Note |
|---|---|---|
text | text | Accepts placeholders such as {{name}}. |
media | /send/media: type, file, text, docName | type: image, video, document, audio, ptt or myaudio. A file by URL is kept as sent; in base64, it is stored by the API (image 5 MB, audio and video 16 MB, document 20 MB; 50 MB per instance). |
contact | /send/contact | fullName and phoneNumber required. |
location | /send/location | latitude and longitude required. |
menu | /send/menu | type: button, button_legacy, list or poll (carousel not yet). The button media (file) only by URL. The options must be sendable, otherwise 400: poll with at least 2, list with at least one item (a [...] section does not count) and buttons with at least 1. |
pix | /send/pix-button | pixType and pixKey required. |
Show child attributes
Show child attributes
{
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
}
Response
Quick reply created
Shortcut to find the reply (and what the AI uses to choose).
Reserved for automated support. Empty by default.
Whether the reply is also in WhatsApp Business (text only).
Stored message: kind plus the same body as the corresponding send, without number and without send fields (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Body same as | Note |
|---|---|---|
text | text | Accepts placeholders such as {{name}}. |
media | /send/media: type, file, text, docName | type: image, video, document, audio, ptt or myaudio. A file by URL is kept as sent; in base64, it is stored by the API (image 5 MB, audio and video 16 MB, document 20 MB; 50 MB per instance). |
contact | /send/contact | fullName and phoneNumber required. |
location | /send/location | latitude and longitude required. |
menu | /send/menu | type: button, button_legacy, list or poll (carousel not yet). The button media (file) only by URL. The options must be sendable, otherwise 400: poll with at least 2, list with at least one item (a [...] section does not count) and buttons with at least 1. |
pix | /send/pix-button | pixType and pixKey required. |
Show child attributes
Show child attributes
{
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
}
