curl -X GET "https://app.heyfred.nl/api/user/whatsapp/session-status?sender_id=12&recipient_phone=+1234567890" \
-H "Authorization: Bearer YOUR_API_KEY"
const params = new URLSearchParams({
sender_id: '12',
recipient_phone: '+1234567890'
});
const response = await fetch(
`https://app.heyfred.nl/api/user/whatsapp/session-status?${params}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const data = await response.json();
if (data.session_status.can_send_freeform) {
console.log('Session is active — freeform messages allowed');
} else {
console.log('Session expired — use a template message');
}
import requests
response = requests.get(
'https://app.heyfred.nl/api/user/whatsapp/session-status',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'sender_id': 12,
'recipient_phone': '+1234567890'
}
)
data = response.json()
session = data['session_status']
if session['can_send_freeform']:
print('Session is active — freeform messages allowed')
else:
print('Session expired — use a template message')
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-24T10:30:00+00:00",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-22T14:00:00+00:00",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T14:00:00+00:00"
}
}
{
"success": true,
"has_conversation": false,
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "No conversation exists with this recipient. Send a template message first."
}
}
{
"success": false,
"error": "Sender not found",
"error_code": "SENDER_NOT_FOUND"
}
WhatsApp
Get Session Status
Check the 24-hour messaging window status for a WhatsApp conversation
GET
/
user
/
whatsapp
/
session-status
curl -X GET "https://app.heyfred.nl/api/user/whatsapp/session-status?sender_id=12&recipient_phone=+1234567890" \
-H "Authorization: Bearer YOUR_API_KEY"
const params = new URLSearchParams({
sender_id: '12',
recipient_phone: '+1234567890'
});
const response = await fetch(
`https://app.heyfred.nl/api/user/whatsapp/session-status?${params}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const data = await response.json();
if (data.session_status.can_send_freeform) {
console.log('Session is active — freeform messages allowed');
} else {
console.log('Session expired — use a template message');
}
import requests
response = requests.get(
'https://app.heyfred.nl/api/user/whatsapp/session-status',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'sender_id': 12,
'recipient_phone': '+1234567890'
}
)
data = response.json()
session = data['session_status']
if session['can_send_freeform']:
print('Session is active — freeform messages allowed')
else:
print('Session expired — use a template message')
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-24T10:30:00+00:00",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-22T14:00:00+00:00",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T14:00:00+00:00"
}
}
{
"success": true,
"has_conversation": false,
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "No conversation exists with this recipient. Send a template message first."
}
}
{
"success": false,
"error": "Sender not found",
"error_code": "SENDER_NOT_FOUND"
}
This endpoint checks whether an active 24-hour messaging window exists between your WhatsApp sender and a specific recipient. Use this to determine whether you can send freeform messages or need to use a template message.
Query Parameters
integer
required
The ID of the WhatsApp sender (obtained from the Get Senders endpoint)
string
required
The recipient’s phone number in international format (e.g.,
+1234567890)Response Fields
boolean
Whether the request was successful
boolean
Whether a conversation exists with this recipient
integer
The conversation ID (only present when
has_conversation is true)string
The customer’s name if available (only present when
has_conversation is true)string
ISO 8601 timestamp of the customer’s last message (only present when
has_conversation is true)object
Show Session status properties
Show Session status properties
boolean
Whether the 24-hour messaging window is currently open
boolean
Whether freeform (non-template) messages can be sent right now
boolean
Whether a template message is required to message this recipient
string
Human-readable description of the current session state
integer
Minutes remaining in the 24-hour window (only present when session is open)
string
ISO 8601 timestamp when the session expires (present when session is open or no customer message exists)
string
ISO 8601 timestamp when the session expired (only present when session has expired)
Error Responses
curl -X GET "https://app.heyfred.nl/api/user/whatsapp/session-status?sender_id=12&recipient_phone=+1234567890" \
-H "Authorization: Bearer YOUR_API_KEY"
const params = new URLSearchParams({
sender_id: '12',
recipient_phone: '+1234567890'
});
const response = await fetch(
`https://app.heyfred.nl/api/user/whatsapp/session-status?${params}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const data = await response.json();
if (data.session_status.can_send_freeform) {
console.log('Session is active — freeform messages allowed');
} else {
console.log('Session expired — use a template message');
}
import requests
response = requests.get(
'https://app.heyfred.nl/api/user/whatsapp/session-status',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'sender_id': 12,
'recipient_phone': '+1234567890'
}
)
data = response.json()
session = data['session_status']
if session['can_send_freeform']:
print('Session is active — freeform messages allowed')
else:
print('Session expired — use a template message')
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-24T10:30:00+00:00",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": true,
"has_conversation": true,
"conversation_id": 1234,
"customer_name": "John Doe",
"last_customer_message_at": "2026-02-22T14:00:00+00:00",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T14:00:00+00:00"
}
}
{
"success": true,
"has_conversation": false,
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "No conversation exists with this recipient. Send a template message first."
}
}
{
"success": false,
"error": "Sender not found",
"error_code": "SENDER_NOT_FOUND"
}
Typical Workflow
Use this endpoint as part of a message-sending flow:- Check session status before sending a message
- If
can_send_freeformistrue→ use Send Freeform Message - If
requires_templateistrue→ use Send Template Message
Notes
- The 24-hour window is based on the customer’s last inbound message timestamp.
- Each new customer message resets the 24-hour timer.
- This endpoint does not consume any balance — it’s a read-only status check.

