Group message status
curl --request POST \
--url https://api.wppfy.com/message/status \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"id": "3EB0538DA65A59F6D8A251",
"limit": 100,
"offset": 0
}
'import requests
url = "https://api.wppfy.com/message/status"
payload = {
"id": "3EB0538DA65A59F6D8A251",
"limit": 100,
"offset": 0
}
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({id: '3EB0538DA65A59F6D8A251', limit: 100, offset: 0})
};
fetch('https://api.wppfy.com/message/status', 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/message/status",
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([
'id' => '3EB0538DA65A59F6D8A251',
'limit' => 100,
'offset' => 0
]),
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/message/status"
payload := strings.NewReader("{\n \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\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/message/status")
.header("token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wppfy.com/message/status")
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 \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"source": "memory",
"summary": {
"delivered": 123,
"read": 123
},
"receipts": [
{
"participant": "<string>",
"participant_pn": "<string>",
"participant_lid": "<string>",
"state": "Delivered",
"timestamp": 123
}
],
"pagination": {
"totalRecords": 123,
"limit": 123,
"offset": 123,
"hasMore": true,
"nextOffset": 123
}
}Message Actions and Search
Group message status
Shows who received and who read a message you sent in a group: first a summary with the totals, then the list of each participant. source tells where the response came from.
source: "memory": once this route is used for a group, the API starts tracking in memory the receipts of the instance’s groups, up to 24 hours after the last query. From then on, messages sent after that point and the ones the phone has already answered are served from there, instantly and without depending on the phone, with the receipts that arrived later added up. Each message stays in memory for up to 24 hours; on instances with heavy group sending, the oldest ones are evicted earlier.source: "phone": the first query for a message sent before that, or for any message after a server restart, asks the account’s phone. The phone must be on and connected to the internet. With WhatsApp open, the response comes in about 1 second; with the phone idle (an iPhone in the background, for example), it may not come. With no response within 40 seconds, the route returns504. The list is the one stored by the phone: right after being offline, it may respond before receiving the receipts that arrived in the meantime.summary: how many participants received (delivered) and read (read). Those who read also count as received, and those who listened to an audio or watched a video count as read.receipts: one item per participant and state, in time order and paginated, like the other API lists: for the next page, sendpagination.nextOffsetinoffsetwhilepagination.hasMoreistrue. The summary comes in all pages.- Those who read may come without the
Delivereditem, when the phone did not store the delivery time. statefilters the list by state:Delivered,ReadorPlayed. The summary keeps the message totals.idaccepts the full or short message ID, which must be in the instance’s history.- The API does not store receipts in a database. To track them live, use the
messages_updatewebhook withtype: "GroupReceipts".
POST
/
message
/
status
Group message status
curl --request POST \
--url https://api.wppfy.com/message/status \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"id": "3EB0538DA65A59F6D8A251",
"limit": 100,
"offset": 0
}
'import requests
url = "https://api.wppfy.com/message/status"
payload = {
"id": "3EB0538DA65A59F6D8A251",
"limit": 100,
"offset": 0
}
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({id: '3EB0538DA65A59F6D8A251', limit: 100, offset: 0})
};
fetch('https://api.wppfy.com/message/status', 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/message/status",
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([
'id' => '3EB0538DA65A59F6D8A251',
'limit' => 100,
'offset' => 0
]),
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/message/status"
payload := strings.NewReader("{\n \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\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/message/status")
.header("token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wppfy.com/message/status")
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 \"id\": \"3EB0538DA65A59F6D8A251\",\n \"limit\": 100,\n \"offset\": 0\n}"
response = http.request(request)
puts response.read_body{
"source": "memory",
"summary": {
"delivered": 123,
"read": 123
},
"receipts": [
{
"participant": "<string>",
"participant_pn": "<string>",
"participant_lid": "<string>",
"state": "Delivered",
"timestamp": 123
}
],
"pagination": {
"totalRecords": 123,
"limit": 123,
"offset": 123,
"hasMore": true,
"nextOffset": 123
}
}Authorizations
Body
application/json
Message ID (full or short).
Example:
"3EB0538DA65A59F6D8A251"
Only receipts in this state. Without it, all of them.
Available options:
Delivered, Read, Played Items per page. Values above 500 use 500.
Required range:
1 <= x <= 500Zero-based offset; use the pagination.nextOffset from the previous page.
Required range:
x >= 0Response
Summary and page of receipts, in chronological order.
Where the response came from: memory (confirmations the API tracked, added to the phone's previous response when there was one) or phone (the account's phone, in this query).
Available options:
memory, phone Participant totals; the same on every page.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
