Messages
Send a message (API key)
Send a WhatsApp or Instagram message on a channel with your hmok_ API key.
The body is the Meta message content object including the recipient
(to for WhatsApp, recipient.id for Instagram). HookMyApp resolves the
channel token server-side. Accepts an API key scoped to messages.send
or channel.manage. Delivery is at-least-once: do not retry a request
whose response you did not receive without checking first.
POST
/
channels
/
{ch}
/
messages
Send a message (API key)
curl --request POST \
--url https://api.hookmyapp.com/channels/{ch}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"message": {
"to": "15551234567",
"type": "text",
"text": {
"body": "Hello"
}
}
}
'import requests
url = "https://api.hookmyapp.com/channels/{ch}/messages"
payload = { "message": {
"to": "15551234567",
"type": "text",
"text": { "body": "Hello" }
} }
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({
message: {to: '15551234567', type: 'text', text: {body: JSON.stringify('Hello')}}
})
};
fetch('https://api.hookmyapp.com/channels/{ch}/messages', 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.hookmyapp.com/channels/{ch}/messages",
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([
'message' => [
'to' => '15551234567',
'type' => 'text',
'text' => [
'body' => 'Hello'
]
]
]),
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.hookmyapp.com/channels/{ch}/messages"
payload := strings.NewReader("{\n \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\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.hookmyapp.com/channels/{ch}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hookmyapp.com/channels/{ch}/messages")
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 \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"channelId": "<string>",
"messageId": "<string>",
"status": "sent"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}Use
Authorization: Bearer hmok_... (an API key, or a dashboard session) instead of a channel token. Accepted scopes are messages.send or channel.manage.
Delivery is at-least-once: don’t automatically retry after an ambiguous failure (timeout, dropped connection). Check the recipient’s thread first to see whether the message already went out.
If you need the raw Graph request, see the hmat_ gateway twin.Authorizations
Authorization: Bearer hmok_... API key or a dashboard session token
Path Parameters
ch_ channel id
Body
application/json
Meta message content object, recipient included
⌘I
Send a message (API key)
curl --request POST \
--url https://api.hookmyapp.com/channels/{ch}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"message": {
"to": "15551234567",
"type": "text",
"text": {
"body": "Hello"
}
}
}
'import requests
url = "https://api.hookmyapp.com/channels/{ch}/messages"
payload = { "message": {
"to": "15551234567",
"type": "text",
"text": { "body": "Hello" }
} }
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({
message: {to: '15551234567', type: 'text', text: {body: JSON.stringify('Hello')}}
})
};
fetch('https://api.hookmyapp.com/channels/{ch}/messages', 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.hookmyapp.com/channels/{ch}/messages",
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([
'message' => [
'to' => '15551234567',
'type' => 'text',
'text' => [
'body' => 'Hello'
]
]
]),
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.hookmyapp.com/channels/{ch}/messages"
payload := strings.NewReader("{\n \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\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.hookmyapp.com/channels/{ch}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hookmyapp.com/channels/{ch}/messages")
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 \"message\": {\n \"to\": \"15551234567\",\n \"type\": \"text\",\n \"text\": {\n \"body\": \"Hello\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"channelId": "<string>",
"messageId": "<string>",
"status": "sent"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}{
"statusCode": 403,
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}