Sparrow Instagram connects your professional account to an inbox shared by your teams: direct messages, story replies and comments all arrive in the same place, routine requests answer themselves, and the history stays attached to the contact in your CRM.
Click a use case to see in detail how Sparrow Instagram sets it up for your business.
On Instagram a sales enquiry takes three forms: a direct message, a story reply, a comment under a post. They arrive here in the same inbox, assigned to an agent, tagged and tracked — with the contact's full history in view.
A well-watched story produces dozens of replies that get lost in someone's phone. Here, each one opens an identified conversation with the story that triggered it. The same goes for comments: a public reply under the post, and a private message to continue.
On Instagram the sale is often closed in the private message: the customer asks for a size, a price, availability, and expects an immediate answer. Your agents send the images, check stock and pass on a payment link, without switching tools.
Price, sizes in stock, delivery time, shop address: these questions make up most of the volume. A guided journey answers them instantly and hands over as soon as the request falls outside the script. Your applications, meanwhile, write directly through the API.
Every conversation carries its first response time, its source — message, story, comment, ad — and its outcome. You can see which posts generate enquiries, which hours are understaffed, and which questions would be worth answering automatically.
One channel, different rules: within twenty-four hours of a customer's message you write freely; beyond that, only a human agent may resume the conversation, and only for a limited time.
Questions, complaints and price enquiries handled by your agents from a shared inbox.
24-hour windowEvery reaction to a story opens a conversation attached to the post that triggered it.
Story attachedA comment gets a public reply and a private message to continue.
Public and privatePrice, sizes, delivery times, address: a guided journey answers without involving anyone.
Available 24/7Images, stock and a payment link passed on in the conversation, right through to the order.
Catalogue built inThe ad opens a private message instead of a landing page, and the source stays attached to the contact.
Campaign source keptA customer who mentions your account appears in the inbox; you thank them or reshare.
Built-in monitoringBeyond twenty-four hours, an agent can resume the conversation for seven days.
Human agent tagAfter a purchase, a review request sent within the permitted window, with no nagging.
Within the permitted windowThe shared inbox, automation and the API in one subscription, with no extra tool to plug in.
Direct messages, story replies, mentions and comments on one screen, assigned, tagged and tracked. Internal notes and handover without losing the thread.
Ice breakers, quick replies and keyword replies on comments. Routine requests settle themselves and an agent takes over whenever needed.
The Instagram profile, the conversation history and your CRM data on one screen. The agent knows who they are talking to before replying.
The platform shows how long you have left to reply freely and flags when a human agent handover becomes necessary. No Meta rule broken by accident.
First response time, contact source, the posts that generate the most enquiries. CSV export, weekly report, API feed.
Your applications send and receive messages without going through the interface. One token per application, a test environment, and examples in the main languages.
No proprietary library to install. The REST API is called from any language, and the shared inbox remains available for conversations handled by your agents.
POST /api/v1/login with your credentials returns a token
(api_token) that you then place in the
Authorization: Bearer {api_token} header of every request.
One account can hold several applications, each with its own token:
statistics stay separate, application by application.
| Operation | Method | URL |
|---|---|---|
| Get a token | POST | https://app.sparrowmessage.com/api/v1/login |
| Send a message | POST | https://app.sparrowmessage.com/api/v1/instagram/send/one |
| Receive a message | POST inbound | https://your-site.com/sparrow/webhook |
| Message status | POST | https://app.sparrowmessage.com/api/v1/instagram/status |
| Status of a list | POST | https://app.sparrowmessage.com/api/v1/instagram/status/bulk |
SEMS
Amplitude HR
1 — Get the token, then send a message.
<?php
$base = 'https://app.sparrowmessage.com/api/v1';
// — Authentication: keep the token, don't request a new one for every send
$ch = curl_init("$base/login");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Accept: application/json', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'email' => 'you@company.com',
'password' => 'your-password',
]),
]);
$token = json_decode(curl_exec($ch), true)['api_token'];
curl_close($ch);
// — Send a message
$ch = curl_init("$base/instagram/send/one");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Content-Type: application/json',
"Authorization: Bearer $token",
],
CURLOPT_POSTFIELDS => json_encode([
'recipient' => '718294106203941',
'text' => 'Your verification code is 385 214.',
// Optional: Sparrow will post status changes here
'notifyurl' => 'https://your-site.com/sparrow/status',
]),
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);
// Every response carries a code field: OK or KO
echo $reponse['code'] === 'OK' ? "Message envoyé\n" : "Échec : {$reponse['error']}\n";
Single send, then bulk send.
import requests
base = 'https://app.sparrowmessage.com/api/v1'
# — Authentication
token = requests.post(f'{base}/login', json={
'email': 'you@company.com',
'password': 'your-password',
}).json()['api_token']
headers = {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}
# — Send a message
r = requests.post(f'{base}/instagram/send/one', headers=headers, json={
'recipient': '718294106203941',
'text': 'Your verification code is 385 214.',
'notifyurl': 'https://your-site.com/sparrow/status',
}).json()
print('Message envoyé' if r['code'] == 'OK' else f"Échec : {r['error']}")
# — Bulk send: one request, several recipients
requests.post(f'{base}/instagram/send/bulk', headers=headers, json={
'phones': ['718294106203941', '+2126YYYYYYYY'],
'text': 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
})
# — Delivery status, from the identifier returned
status = requests.post(f'{base}/instagram/status', headers=headers, json={
'message_id': '8f21c4',
}).json()
print(status['result'])
Node 18 or later: fetch is built in.
const base = 'https://app.sparrowmessage.com/api/v1';
// — Authentication
const { api_token } = await fetch(`${base}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify({
email: 'you@company.com',
password: 'your-password',
}),
}).then(r => r.json());
const headers = {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: `Bearer ${api_token}`,
};
// — Send a message
const reponse = await fetch(`${base}/instagram/send/one`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
phone: '718294106203941',
text: 'Your verification code is 385 214.',
notifyurl: 'https://your-site.com/sparrow/status',
}),
}).then(r => r.json());
console.log(reponse.code === 'OK' ? 'Message envoyé' : `Échec : ${reponse.error}`);
// — Bulk send
await fetch(`${base}/instagram/send/bulk`, {
method: 'POST',
headers: headers,
body: JSON.stringify({
phones: ['718294106203941', '+2126YYYYYYYY'],
text: 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
}),
});
.NET 6 or later.
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://app.sparrowmessage.com/api/v1/") };
// — Authentication
var auth = await http.PostAsJsonAsync("login", new {
email = "you@company.com",
password = "your-password",
});
var token = (await auth.Content.ReadFromJsonAsync<Dictionary<string, string>>())["api_token"];
http.DefaultRequestHeaders.Authorization = new("Bearer", token);
// — Send a message
var msg = await http.PostAsJsonAsync("sms/send/one", new {
phone = "718294106203941",
text = "Your verification code is 385 214.",
notifyurl = "https://your-site.com/sparrow/status",
});
var result = await msg.Content.ReadFromJsonAsync<Dictionary<string, object>>();
Console.WriteLine(result["code"].ToString() == "OK" ? "Message envoyé" : $"Échec : {result["error"]}");
// — Bulk send
await http.PostAsJsonAsync("sms/send/bulk", new {
phones = new[] { "718294106203941", "+2126YYYYYYYY" },
text = "Soldes : -20 % jusqu'à dimanche. STOP au 36000",
});
Java 11 or later, native HTTP client.
import java.net.URI;
import java.net.http.*;
var client = HttpClient.newHttpClient();
var base = "https://app.sparrowmessage.com/api/v1";
// — Authentication
var auth = HttpRequest.newBuilder(URI.create(base + "/login"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{"email":"you@company.com","password":"your-password"}"""))
.build();
var token = extract(client.send(auth, HttpResponse.BodyHandlers.ofString()).body(), "api_token");
// — Send a message
var msg = HttpRequest.newBuilder(URI.create(base + "/instagram/send/one"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString("""
{"recipient":"718294106203941",
"text":"Your verification code is 385 214.",
"notifyurl":"https://your-site.com/sparrow/status"}"""))
.build();
System.out.println(client.send(msg, HttpResponse.BodyHandlers.ofString()).body());
Copy and paste into a terminal.
# — 1. Get the token
curl -X POST https://app.sparrowmessage.com/api/v1/login \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"you@company.com","password":"your-password"}'
# Response: {"code":"OK","api_token":"eyJ0eXAiOiJKV1Qi..."}
# — 2. Send a message
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/send/one \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"recipient":"718294106203941",
"text":"Your verification code is 385 214.",
"notifyurl":"https://your-site.com/sparrow/status"}'
# — 3. Receive inbound messages
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/send/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"phones":["718294106203941","+2126YYYYYYYY"],
"text":"Reminder: your appointment is tomorrow at 2:30 pm."}'
# — 4. Delivery status
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/status \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"message_id":"8f21c4"}'
# — 5. Status of a batch
curl -X POST https://app.sparrowmessage.com/api/v1/instagram/status/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"messages_id":["8f21c4","8f21c5"]}'
Every response carries a code field set to OK ou
KO. On anOK, result — or results
for bulk calls — carries the detail; on a KO,
error gives the reason.
Full documentation and a sandbox are provided when your account opens.
Enterprises, institutions and public bodies, in Morocco and abroad. The same organisations, whatever the channel.

Employee, supplier and customer communication

Customer and employee communication

Customer and employee communication

Supplier communication

Customer and employee communication

Candidate and employer communication

Member and partner communication

Member communication

Partner and donor communication

Customer communication

Customer notifications from the CRM

Customer communication

Candidate and employer communication

Member communication

Customer and partner communication

Supplier communication

Student and partner communication

Tourism industry communication

Customer communication

Member communication

Customer and user communication

Student and administration communication

Student and administration communication

Customer and store communication

Employee communication

Customer and prospect communication

Customer and prospect communication

Customer communication

Customer communication

Customer communication

Customer notifications and relations

Customer and supplier notifications

Customer notifications and campaigns
Sizes in stock, product advice, order closed in the conversation.
Price, stock, in-store availability, order tracking.
Booking from a story, today's menu, table confirmation.
Appointment booking, treatments and prices, reminder the day before.
Qualification of enquiries from posts, viewing appointments.
Programme enquiries, term start dates, enrolments.
Opening hours, memberships, class and event registrations.
Bespoke orders, production times, sending images.
Instagram is not billed per message like SMS: the cost depends on the conversation, the number of agents and what you automate. We therefore build a tailored proposal after a thirty-minute conversation.
How many conversations open each month, and how many resolve without a human. This is the main cost driver.
How many people log into the shared inbox, and during which hours. An extra agent can be added at any time.
Guided journeys, catalogue connection, CRM or ERP integration: setup is quoted once, then running costs apply.
Tell us your current volume and your most frequent requests. We come back with a costed proposal and a rollout schedule, with no commitment.
Yes. Instagram's business messaging is only open to professional or creator accounts linked to a Facebook page and a Meta Business account. The switch is made in the app settings and takes a few minutes; it changes nothing about your posts or your followers, and gives you access to account analytics.
As soon as a customer writes to you — direct message, story reply or comment — you have twenty-four hours to reply freely. Each new message from them restarts the clock. Once that time passes, free exchange stops. The platform shows the time left on each conversation, so your agents never have to work it out.
Instagram provides for a human agent handover: if the request could not be handled within the window, someone on your team may continue the conversation for seven days. That handover exists to resolve an open request, not to send a commercial message. For promotion, you must wait until the customer gets back in touch.
Yes, and attached to the story concerned: the agent sees what the customer is reacting to before replying. That is what makes the difference on Instagram, where most commercial volume comes from stories rather than unprompted messages. Story mentions of your account also come into the inbox.
Yes. A comment containing a keyword you have defined — "price", "in stock", "link" — triggers a public reply under the post and a private message to continue. It is the most effective way to turn a post's audience into conversations, without anyone having to watch the comments.
Yes — that is exactly what the shared inbox is for. Each conversation is assigned to one agent, visible to the others, and cannot receive two competing replies. Handover takes one click, internal notes included, and the history stays attached to the contact whichever agent replied.
Yes, and it is the most common use. Your agents send the images, check stock in your catalogue and pass on an order or payment link in the message. The order then flows into your management system, along with the source of the conversation.
Yes, through the REST API and webhooks. Every inbound message can be pushed to your system, and your system can write into the conversation. Connectors exist for the most widely used CRMs and e-commerce platforms; for an in-house tool, integration through the API takes a few days.
Yes, with the full history attached to the contact: a customer who comes back six months later is recognised, and the agent sees what was said. Retention is configurable to match your data policy, and export is available at any time.
In Morocco, personal data processing falls under Law 09-08 and the CNDP: Instagram conversations contain personal data and must appear in your declaration. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent, to resolve an open request. Consent withdrawals and deletion requests are kept and exportable. We are not lawyers: have your setup and your CNDP declaration reviewed by your counsel.
The GDPR applies to Instagram conversations as to any processing of personal data: legal basis, informing the customer, retention period and the right to erasure. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent, to resolve an open request. Consent withdrawals and deletion requests are kept and exportable, ready to feed your record of processing activities. We are not lawyers: have your setup reviewed by your counsel.
In the United States, commercial solicitation by message falls under the CAN-SPAM Act for email and the TCPA for phone messaging, both enforced by the FTC and the FCC; messaging is treated by analogy and carries the same requirement of consent and easy opt-out. Meta's rules apply on top, limiting free exchange to twenty-four hours and reserving any later handover to a human agent. Opt-outs are kept and exportable. We are not lawyers: have your setup reviewed by your counsel before any campaign.
The account is connected and the shared inbox usable within twenty-four hours. Automated journeys take one to two weeks depending on their complexity: you have to list the frequent requests, write the answers, then test them on real cases before going live.
Your Instagram channel live in 4 phases
From connecting your account to the first automated journey, a mapped-out path and a single point of contact.
Typical timeline: account connected within 24 hours, first automated journeys live within one to two weeks depending on their complexity.