Skip to content

Commit ff286f2

Browse files
committed
[blog] add GET /messages guide
1 parent 538b584 commit ff286f2

File tree

4 files changed

+222
-4
lines changed

4 files changed

+222
-4
lines changed
96.6 KB
Loading

docs/blog/index.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ Welcome to the SMSGate blog! Here you'll find the latest news, updates, and tech
44

55
## Categories
66

7-
- **Features**: Deep dives into platform capabilities
8-
- **Tutorials**: Step-by-step implementation guides
9-
- **Updates**: Product release notes and announcements
7+
- [**API**](/blog/category/api/): Technical documentation and integration guides for RESTful API endpoints
8+
- [**Best Practices**](/blog/category/best-practices/): Recommended approaches and optimization techniques for common scenarios
9+
- [**Documentation**](/blog/category/documentation/): Comprehensive reference materials and detailed platform guides
10+
- [**Features**](/blog/category/features/): In-depth explorations of platform capabilities and advanced functionality
11+
- [**IoT**](/blog/category/iot/): Use cases and implementation strategies for Internet of Things applications
12+
- [**Tutorials**](/blog/category/tutorials/): Step-by-step implementation guides for specific workflows
1013

1114
---
1215

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
---
2+
title: "Mastering Message Retrieval: A Developer's Guide to GET /messages API"
3+
date: 2025-08-07
4+
categories:
5+
- API
6+
- Documentation
7+
description: "Comprehensive guide to implementing SMS API message history retrieval using the RESTful GET /messages API endpoint across local and cloud server environments for reliable message tracking."
8+
author: SMSGate Team LLM
9+
---
10+
# 📱 Mastering Message Retrieval: A Developer's Guide to GET /messages API
11+
12+
Have you ever faced a situation where a customer insisted they never received your critical SMS notification, but your logs showed it was sent? Message delivery tracking is a common pain point for developers integrating SMS functionality, leading to frustrated users and time-consuming debugging sessions. In today's mobile-first world, reliable message history isn't just a nice-to-have—it's essential for customer trust, and operational efficiency. The `GET /messages` API provides a robust RESTful solution for programmatically retrieving SMS message histories across both local server deployments and cloud services. In this comprehensive guide, we'll walk through the technical specifications, share real-world code examples in Python and JavaScript, and provide expert tips for optimizing your message retrieval implementation. By the end, you'll have everything needed to master SMS message history management in your applications.
13+
14+
<!-- more -->
15+
16+
<center>
17+
<img src="/assets/blog/get-messages-api-guide.png" alt="Message Retrieval Guide">
18+
</center>
19+
20+
## 📬 Endpoint Overview
21+
22+
The `GET /messages` endpoint serves as your central hub for accessing SMS message history. Whether you're building a message history dashboard, implementing auditing, or debugging delivery issues, this API provides structured access to your message data. Unlike basic SMS sending functionality, message retrieval requires careful handling of pagination, filtering, and authentication to ensure efficient and secure access to historical data.
23+
24+
This endpoint supports both [local server deployments](../../getting-started/local-server.md) and [cloud-hosted services](../../getting-started/public-cloud-server.md), with implementation differences that we'll explore throughout this guide. The consistent RESTful design ensures your integration remains maintainable whether you're running on-premises or using our scalable cloud infrastructure.
25+
26+
## 🔒 Technical Specifications
27+
28+
### HTTP Method and Path
29+
```http
30+
GET /messages
31+
```
32+
33+
### Authentication Requirements
34+
This endpoint requires Basic Authentication.
35+
36+
!!! tip "Credential Management"
37+
Store credentials securely using environment variables or secret management systems. Never hardcode credentials in your source code.
38+
39+
### Parameter Deep Dive
40+
41+
| Parameter | Type | Required | Default | Description | Validation |
42+
| ---------- | ------- | -------- | ------- | ------------------------ | ----------------------------------------------------- |
43+
| `state` | string | No | - | Message processing state | `Pending`, `Processed`, `Sent`, `Delivered`, `Failed` |
44+
| `offset` | integer | No | 0 | Pagination offset | ≥ 0 |
45+
| `limit` | integer | No | 50 | Results per page | 1-100 |
46+
| `from` | string | No | - | Start timestamp | RFC3339 format |
47+
| `to` | string | No | - | End timestamp | RFC3339 format |
48+
| `deviceId` | string | No | - | Filter by device ID | Cloud only: 21-character length |
49+
50+
### Response Format
51+
Successful requests return a JSON array of message objects with the `X-Total-Count` header indicating total available messages:
52+
53+
```json title="Example Response"
54+
[
55+
{
56+
"id": "I6gSljKlTN3Fe-BJpEcrE",
57+
"deviceId": "uCh54LY9eovMomc2Un2eU",
58+
"state": "Pending",
59+
"isHashed": false,
60+
"isEncrypted": false,
61+
"recipients": [
62+
{
63+
"phoneNumber": "+1234567890",
64+
"state": "Pending",
65+
"error": null
66+
}
67+
],
68+
"states": {
69+
"Pending": "2025-07-15T12:30:45Z"
70+
}
71+
}
72+
]
73+
```
74+
75+
## 💻 Code Examples
76+
77+
=== "Python"
78+
```python title="Message Retrieval with Python Requests"
79+
import requests
80+
from datetime import datetime, timedelta
81+
82+
# Configure for your environment
83+
BASE_URL = "http://localhost:8080" # Local
84+
# BASE_URL = "https://api.sms-gate.app/3rdparty/v1" # Cloud
85+
AUTH = ("your_username", "your_password")
86+
87+
# Get messages from last hour
88+
one_hour_ago = (datetime.utcnow() - timedelta(hours=1)).strftime("%Y-%m-%dT%H:%M:%SZ")
89+
params = {
90+
"from": one_hour_ago,
91+
"limit": 10
92+
}
93+
94+
response = requests.get(
95+
f"{BASE_URL}/messages",
96+
auth=AUTH,
97+
params=params
98+
)
99+
100+
if response.status_code == 200:
101+
messages = response.json()
102+
total = response.headers.get('X-Total-Count')
103+
print(f"Retrieved {len(messages)} of {total} messages")
104+
else:
105+
print(f"Error: {response.status_code} - {response.text}")
106+
```
107+
108+
=== "JavaScript"
109+
```javascript title="Message Retrieval with Node.js"
110+
const axios = require('axios');
111+
const { DateTime } = require('luxon');
112+
113+
// Configure for your environment
114+
const BASE_URL = 'http://localhost:8080'; // Local
115+
// const BASE_URL = 'https://api.sms-gate.app/3rdparty/v1'; // Cloud
116+
const auth = { username: 'your_username', password: 'your_password' };
117+
118+
// Get messages from last hour
119+
const oneHourAgo = DateTime.utc().minus({ hours: 1 }).toISO();
120+
const params = {
121+
from: oneHourAgo,
122+
limit: 10
123+
};
124+
125+
axios.get(`${BASE_URL}/messages`, { auth, params })
126+
.then(response => {
127+
console.log(`Retrieved ${response.data.length} of ${response.headers['x-total-count']} messages`);
128+
// Process messages
129+
})
130+
.catch(error => {
131+
console.error(`Error ${error.response?.status}: ${error.response?.data}`);
132+
});
133+
```
134+
135+
=== "cURL"
136+
```bash title="Basic Message Retrieval"
137+
# Local server example
138+
curl -u user:pass "http://localhost:8080/messages?limit=10"
139+
140+
# Cloud service example with time filtering
141+
curl -u user:pass \
142+
"https://api.sms-gate.app/3rdparty/v1/messages?from=$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)"
143+
```
144+
## 🧪 Error Handling
145+
146+
| Status Code | Error Type | Description | Troubleshooting Guidance |
147+
| ----------- | ------------ | ----------------------- | ------------------------------------------------------------------ |
148+
| 400 | Bad Request | Invalid parameters | Check parameter values against validation rules in the table above |
149+
| 401 | Unauthorized | Invalid credentials | Verify your username/password |
150+
| 500 | Server Error | Unexpected server error | Contact support |
151+
152+
!!! failure "Common 401 Scenarios"
153+
1. Using cloud credentials with local server (or vice versa)
154+
2. Special characters in password not properly encoded
155+
156+
## 💡 Use Cases
157+
158+
159+
### 1. Message History Dashboard
160+
Build a real-time dashboard showing message delivery status across your user base. Filter by `state` and time ranges to identify delivery bottlenecks. The `X-Total-Count` header enables accurate pagination controls for large datasets. With the actual response structure showing recipient-level states, you can create detailed visualizations of delivery success rates.
161+
162+
### 2. Auditing
163+
Retrieve messages within specific date ranges (`from`/`to` parameters) and verify delivery status for audit trails. The consistent message structure with `states` object ensures reliable data extraction for reporting.
164+
165+
### 3. Customer Support Integration
166+
When customers report missing messages, quickly retrieve their message history using phone number filters. The detailed recipient information in the response allows you to pinpoint exactly which recipients had delivery issues and when.
167+
168+
## 🚀 Performance Tips
169+
170+
### Pagination Best Practices
171+
172+
```python
173+
import requests
174+
175+
def get_all_messages(base_url, auth):
176+
offset = 0
177+
limit = 50
178+
all_messages = []
179+
with requests.Session() as s:
180+
s.auth = auth
181+
while True:
182+
params = {"offset": offset, "limit": limit}
183+
r = s.get(f"{base_url}/messages", params=params, timeout=10)
184+
if r.status_code != 200:
185+
raise RuntimeError(f"GET /messages failed: {r.status_code} {r.text}")
186+
messages = r.json()
187+
if not messages:
188+
break
189+
all_messages.extend(messages)
190+
total = int(r.headers.get("X-Total-Count") or 0)
191+
offset += len(messages)
192+
# Stop when we’ve reached the reported total (if provided) or page is short.
193+
if (total and offset >= total) or len(messages) < limit:
194+
break
195+
return all_messages
196+
```
197+
198+
!!! tip "Optimization Strategies"
199+
- **Time-based filtering**: Always use `from`/`to` parameters when querying historical data
200+
- **Batch processing**: Process messages in chunks of 20-50 (avoid max `limit` values)
201+
- **Selective fields**: Only request necessary data to reduce payload size
202+
- **Caching**: Implement client-side caching for frequently accessed message ranges
203+
204+
## 🎉 Conclusion
205+
206+
Mastering the `GET /messages` API unlocks powerful capabilities for managing your SMS communication flow. By implementing proper pagination, error handling, and environment-specific configurations, you can build robust systems that maintain message history integrity while meeting performance requirements.
207+
208+
Ready to implement message retrieval in your application? Start by exploring our [API documentation](../../integration/api.md) and [client libraries](../../integration/client-libraries.md). For advanced use cases, check out our guide on [webhooks for real-time message notifications](../../features/webhooks.md).
209+
210+
What message retrieval challenges have you faced? Share your experiences in the [discussion section](https://github.com/capcom6/android-sms-gateway/discussions)—we'd love to hear how you're using this API in your projects!
211+
212+
## 🔗 Related Posts
213+
214+
- [Targeting Messages to Specific Devices](./2025-07-20_targeting-messages-to-specific-devices.md)
215+
- [Beyond Plain Text: Unlocking the Hidden Power of Data SMS](./2025-07-12_beyond-plain-text-unlocking-data-sms.md)

docs/getting-started/public-cloud-server.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ sequenceDiagram
8484
- Fallback mechanism
8585
- Ensures message delivery
8686

87-
=== "📡 Custom Ping"
87+
=== ":ping_pong: Custom Ping"
8888
<center>
8989
<img src="/assets/features-ping-settings.png" alt="Custom Ping settings interface">
9090
</center>

0 commit comments

Comments
 (0)