Live Data From Your API
Show live prices, stock, order status and free slots in your chatbot. Connect a Shopify or WooCommerce store with its keys, or build one endpoint that answers in our JSON format; the chatbot shows the answer as cards.
In short
A visitor asks "red shoes under 2000?". Our server recognises the question, reads your store or calls your endpoint with ?action=product_search&q=red+shoes&price_max=2000, checks the answer and shows product cards in the chat. Your keys and URL never reach the visitor's browser. It only reads: nothing is booked or changed. Each answer uses 1 credit, on the Starter plan and above.
Shopify and WooCommerce: no code
Open Dashboard > your chatbot > Live data and choose your store. A connected store answers product search, product details, categories and order status. For a private lookup the chatbot checks the visitor's phone or email against the order itself, and shows only the status, total and payment state: never a name or address.
- WooCommerce: in WordPress go to WooCommerce > Settings > Advanced > REST API, add a key with Read permission, and paste the consumer key and secret. Your site must use https. Order lookups use the WooCommerce order ID; a plugin that changes order numbers is not supported yet.
- Shopify: in the Shopify Dev Dashboard, under the organization your store belongs to, create an app with only
read_productsandread_orders, allow it customer data access so it can check the phone or email, release it and install it on your store. Paste its Client ID and secret. An older custom app's access token also works. By default Shopify lets an app read only the last 60 days of orders.
Anything else, including delivery to a pincode and your own actions, needs your own endpoint, described below.
Your own endpoint: set it up
- Open Dashboard > your chatbot > Live data, paste your endpoint's https URL and choose your business type. Saving creates your secret, shown once.
- Build the endpoint from the starter code below and press Verify endpoint.
- Open each action, read the format it expects, and press Run test to see the card a visitor would see, with every problem named by its field.
- Switch on the actions you built. For private ones, first set allowed domains.
What we send you
One URL handles everything: the action name is in ?action=. Public actions are a GET with the params in the URL. Private actions are a POST with the params in the JSON body, because a phone number in a URL ends up in access logs.
GET /rsflowhub?action=product_search&q=red+shoes&price_max=2000&limit=5 HTTP/1.1
Host: shop.example.com
Accept: application/json
User-Agent: RSFlowHub-LiveData/1
X-RSFlowHub-Contract: 1.0
X-RSFlowHub-Action: product_search
X-RSFlowHub-Request-Id: ld_8f2c61d0a7b14e09
X-RSFlowHub-Timestamp: 1793923200
X-RSFlowHub-Signature: sha256=<hex hmac>
POST /rsflowhub?action=order_status HTTP/1.1
Content-Type: application/json
(the same headers)
{"params":{"order_id":"ORD-10482","phone":"+919876543210"}}
Check the signature on every call. It is sha256= + HMAC-SHA256 of {timestamp}.{METHOD}.{path and query}.{sha256 of the body} with your secret. Refuse a timestamp older than 5 minutes. The visitor's IP, cookies and browser details are never forwarded. If your API needs its own token too, add it under Extra login.
Starter code
This checks the signature and answers the verify call. Add one block per action. Treat every param as untrusted text and use prepared statements.
<?php
// rsflowhub.php: put this on your site and paste its https URL into RSFlowHub.
$secret = getenv('RSFLOWHUB_SECRET'); // the lds_... secret from your dashboard
$body = file_get_contents('php://input');
$time = $_SERVER['HTTP_X_RSFLOWHUB_TIMESTAMP'] ?? '';
$sent = $_SERVER['HTTP_X_RSFLOWHUB_SIGNATURE'] ?? '';
$signed = $time . '.' . $_SERVER['REQUEST_METHOD'] . '.' . $_SERVER['REQUEST_URI'] . '.' . hash('sha256', $body);
$expected = 'sha256=' . hash_hmac('sha256', $signed, $secret);
header('Content-Type: application/json');
// Refuse anything not signed by RSFlowHub in the last 5 minutes.
if (abs(time() - (int) $time) > 300 || ! hash_equals($expected, $sent)) {
http_response_code(401);
exit(json_encode(['rsflowhub' => '1.0', 'status' => 'error']));
}
$action = $_GET['action'] ?? '';
// Public actions send params in the URL, private ones in the JSON body.
$params = $_SERVER['REQUEST_METHOD'] === 'POST' ? (json_decode($body, true)['params'] ?? []) : $_GET;
// The verify button: prove you hold the secret.
if ($action === 'ping') {
exit(json_encode([
'rsflowhub' => '1.0',
'status' => 'ok',
'type' => 'ping',
'data' => ['challenge_response' => hash_hmac('sha256', $params['challenge'] ?? '', $secret)],
]));
}
// Add one block per action: read your database and answer in the format shown under that action.
// Use prepared statements: treat every param as untrusted text.
exit(json_encode(['rsflowhub' => '1.0', 'status' => 'error', 'message' => 'Not set up yet']));
// Express. Paste this route's https URL into RSFlowHub.
const crypto = require('crypto');
const express = require('express');
const app = express();
const secret = process.env.RSFLOWHUB_SECRET; // the lds_... secret from your dashboard
const hmac = (text) => crypto.createHmac('sha256', secret).update(text).digest('hex');
// Raw body: the signature covers the exact bytes we sent.
app.all('/rsflowhub', express.raw({ type: '*/*' }), (req, res) => {
const body = Buffer.isBuffer(req.body) ? req.body : Buffer.alloc(0);
const time = req.get('X-RSFlowHub-Timestamp') || '';
const sent = Buffer.from(req.get('X-RSFlowHub-Signature') || '');
const bodyHash = crypto.createHash('sha256').update(body).digest('hex');
const expected = Buffer.from('sha256=' + hmac(`${time}.${req.method}.${req.originalUrl}.${bodyHash}`));
// Refuse anything not signed by RSFlowHub in the last 5 minutes.
const fresh = Math.abs(Date.now() / 1000 - Number(time)) <= 300;
if (!fresh || sent.length !== expected.length || !crypto.timingSafeEqual(sent, expected)) {
return res.status(401).json({ rsflowhub: '1.0', status: 'error' });
}
const action = req.query.action;
// Public actions send params in the URL, private ones in the JSON body.
const params = req.method === 'POST' ? JSON.parse(body.toString() || '{}').params || {} : req.query;
// The verify button: prove you hold the secret.
if (action === 'ping') {
return res.json({
rsflowhub: '1.0',
status: 'ok',
type: 'ping',
data: { challenge_response: hmac(String(params.challenge || '')) },
});
}
// Add one block per action: read your database and answer in the format shown under that action.
// Use prepared statements: treat every param as untrusted text.
res.json({ rsflowhub: '1.0', status: 'error', message: 'Not set up yet' });
});
app.listen(3000);
What you answer
Always HTTP 200 (404 and 422 are also read if the body is in this format). Only rsflowhub and status are always required. Fields we do not know are ignored and never reach a visitor.
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"message": "A short line above the cards",
"data": {
"items": [
{
"title": "Only the title is required"
}
]
},
"meta": {
"total": 14,
"next_cursor": "p2",
"cache_seconds": 120
},
"suggestions": [
"Quick reply chips"
],
"buttons": [
{
"label": "View all",
"url": "https://shop.example.com/shoes"
}
]
}
meta.next_cursoradds a Show more button; we send it back ascursor.meta.cache_secondslets us reuse a public answer, up to 60 minutes. Private answers are never cached.
Every status, and what the visitor sees
| status | When | Visitor sees |
|---|---|---|
ok | Found it. Needs type and data. | The cards |
empty | The search worked and nothing matched. | Your message, or "I could not find anything for that" |
not_found | Unknown id, or the order and phone do not match. Answer the same for both. | The same fixed words for both, so nobody can guess orders |
invalid_input | A bad param, with fields: {"pincode":"Enter a 6-digit pincode"}. | Asks for that field again, in your words |
closed | Closed now, no delivery there, sold out, admissions shut. | Your message |
needs_human | A person should take over. | Your message, then the Talk to Human flow |
error | Something failed on your side. | The normal chatbot, or your "contact us" text for a private lookup |
A 401, 403, 429, 5xx, a redirect, a slow answer (over 4 seconds), a body over 256 KB or broken JSON counts as a failure. It is logged for you and never shown to the visitor.
The 5 card types
Every action answers with one of these (or type: "text" with data.text). Each industry's sample below shows them with real fields.
| type | What it is | Used for |
|---|---|---|
items | A list of cards | Products, dishes, courses, doctors, flats, packages, cars, plans, offers, branches. |
detail | One thing in full | One product, property, package or vehicle. |
status | Where something stands | Order, return, appointment, booking, application, filing, service job. |
slots | What is free and when | Tables, appointments, site visits, demo classes, test drives, departures. |
facts | A yes/no or a small table | Delivery check, gold rates, fee breakup, EMI, on-road price, open now. |
Limits: 10 items, 12 slots, 8 attributes and 4 buttons per card, title 120 characters, description 400. Over a limit is cut, not an error, and the tester warns you. Links must be https (buttons may also use mailto: and tel:), images https. HTML is removed from all text.
Actions for your industry
You build only the ones you switch on. Private ones are POSTed and ask the visitor for a reference and phone, which your API must check together. Every industry can also use branches.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
product_search |
Find products by words, category, price or stock. | Public |
q,
category,
price_min,
price_max,
in_stock,
sort,
limit,
cursor
|
items |
product_detail |
One product in full: stock, variants, specifications. | Public |
id*
|
detail |
categories |
The categories a shopper can browse. | Public |
parent
|
items |
offers |
Current offers, with a code the shopper can copy. | Public |
q
|
items |
delivery_check |
Whether you deliver to a pincode, how fast, and if cash on delivery works. | Public |
pincode*,
id
|
facts |
order_status |
Where an order is. The shopper gives the order number and their phone or email. | Private |
order_id*,
phone,
email
|
status |
return_status |
Where a return or refund stands. | Private |
order_id*,
phone,
email
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"message": "Found 2 products under ₹2,000",
"data": {
"items": [
{
"id": "SKU-221",
"title": "Red Running Shoes",
"subtitle": "Stride",
"description": "Lightweight mesh, sizes 6-11.",
"image": "https://cdn.example.com/p/221.jpg",
"url": "https://shop.example.com/p/221",
"price": {
"amount": 1899,
"currency": "INR",
"compare_at": 2499
},
"availability": {
"state": "in_stock",
"label": "In stock"
},
"rating": {
"value": 4.4,
"count": 182
},
"badge": "24% off",
"attributes": [
{
"label": "Size",
"value": "6-11"
}
],
"buttons": [
{
"label": "Buy now",
"url": "https://shop.example.com/cart/add/221"
}
]
},
{
"id": "SKU-305",
"title": "Crimson Walking Shoes",
"price": {
"amount": 1499,
"currency": "INR"
},
"availability": {
"state": "low_stock",
"label": "Only 3 left"
},
"url": "https://shop.example.com/p/305"
}
]
},
"meta": {
"total": 14,
"next_cursor": "p2",
"cache_seconds": 120
},
"suggestions": [
"Delivery to my pincode",
"Track my order"
],
"buttons": [
{
"label": "View all",
"url": "https://shop.example.com/shoes"
}
]
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
menu_search |
Find dishes by words, category, veg or price. | Public |
q,
category,
veg,
price_max,
branch,
limit,
cursor
|
items |
menu_categories |
Starters, main course, desserts and so on. | Public |
branch
|
items |
specials |
What is special today. | Public |
branch
|
items |
open_now |
Whether you are open right now, and until when. | Public |
branch
|
facts |
delivery_check |
Whether you deliver there, how long it takes, and the minimum order. | Public |
pincode*,
branch
|
facts |
table_availability |
Free tables for a date and party size. | Public |
date*,
time,
party_size,
branch
|
slots |
order_status |
Where a food order is. The customer gives the order number and their phone. | Private |
order_id*,
phone*
|
status |
booking_status |
Whether a table booking is confirmed. | Private |
booking_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "d-14",
"title": "Paneer Tikka",
"subtitle": "Starters",
"description": "Char-grilled paneer with mint chutney.",
"image": "https://cdn.example.com/m/14.jpg",
"price": {
"amount": 320,
"currency": "INR"
},
"availability": {
"state": "available",
"label": "Available today"
},
"badge": "Veg",
"attributes": [
{
"label": "Serves",
"value": "2"
},
{
"label": "Spice",
"value": "Medium"
}
]
}
]
},
"meta": {
"cache_seconds": 300
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
course_search |
Your courses, with duration, mode and fees. | Public |
q,
mode
|
items |
course_detail |
One course in full: syllabus, duration, faculty. | Public |
id*
|
detail |
fee_details |
The fee and instalments of one course. | Public |
q*
|
facts |
batches |
Running and upcoming batches. | Public |
q,
branch
|
items |
demo_slots |
When a free demo class can be attended. | Public |
q,
date
|
slots |
admission_status |
Where an application stands. Asks for the application number and phone. | Private |
application_no*,
phone*
|
status |
fee_due |
What a student still has to pay. Asks for the student ID and phone. | Private |
student_id*,
phone*
|
facts |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "jee-2y",
"title": "JEE 2-year course",
"subtitle": "Class 11 and 12",
"price": {
"amount": 120000,
"currency": "INR",
"unit": "course"
},
"attributes": [
{
"label": "Mode",
"value": "Offline"
},
{
"label": "Starts",
"value": "1 April"
}
],
"url": "https://coaching.example.com/jee"
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
doctor_search |
Your doctors, with speciality, fee and days. Never medical advice. | Public |
q,
speciality,
branch
|
items |
doctor_availability |
Which slots of a doctor are free on a date. | Public |
q*,
date
|
slots |
service_fees |
What a test or service costs. | Public |
q
|
items |
appointment_status |
Whether an appointment is confirmed. Asks for the number and phone. | Private |
appointment_id*,
phone*
|
status |
report_ready |
Whether a report is ready to collect. Only ready or not, never the results. | Private |
reference*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "dr-1",
"title": "Dr. A. Mehta",
"subtitle": "General Physician",
"price": {
"amount": 500,
"currency": "INR",
"unit": "visit"
},
"attributes": [
{
"label": "Days",
"value": "Mon-Sat, 10 am to 1 pm"
}
]
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
class_fees |
The fee of one class. | Public |
q*
|
facts |
admission_info |
Whether admissions are open, dates and documents. | Public |
q
|
facts |
events |
What is coming up at the school. | Public |
q
|
items |
admission_status |
Where an application stands. Asks for the application number and phone. | Private |
application_no*,
phone*
|
status |
fee_due |
What is still to pay. Fees only, never marks or student records. | Private |
student_id*,
phone*
|
facts |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "facts",
"data": {
"headline": "Class 5: ₹48,000 a year",
"result": "neutral",
"rows": [
{
"label": "Instalments",
"value": "3"
},
{
"label": "Transport",
"value": "Extra"
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
property_search |
Find by words, type, BHK or budget. | Public |
q,
budget_min,
budget_max,
limit,
cursor
|
items |
property_detail |
One property in full. | Public |
id*
|
detail |
site_visit_slots |
When a site visit can happen. | Public |
q,
date
|
slots |
booking_status |
Where a booking stands. Asks for the booking number and phone. | Private |
booking_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "p-1",
"title": "Green Heights, 2 BHK",
"subtitle": "Baner, Pune",
"image": "https://cdn.example.com/p/1.jpg",
"price": {
"text": "₹65 lakh onwards"
},
"availability": {
"state": "limited",
"label": "Few units left"
},
"attributes": [
{
"label": "Area",
"value": "850 sq ft"
},
{
"label": "Possession",
"value": "Dec 2027"
},
{
"label": "RERA",
"value": "P52100012345"
}
],
"url": "https://homes.example.com/green-heights"
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
service_search |
Your services and what they cost. | Public |
q,
gender,
branch
|
items |
offers |
Current offers and packages. | Public |
q
|
items |
slot_availability |
Which slots are free for a service on a date. | Public |
q,
date,
branch
|
slots |
appointment_status |
Whether an appointment is confirmed. Asks for the number and phone. | Private |
appointment_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "sv-1",
"title": "Gold facial",
"price": {
"amount": 1499,
"currency": "INR"
},
"attributes": [
{
"label": "Time",
"value": "60 minutes"
}
]
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
plans |
Your plans and prices. | Public |
branch
|
items |
class_schedule |
Group classes on a date. | Public |
q,
date,
branch
|
slots |
trial_slots |
When a free trial can happen. | Public |
date,
branch
|
slots |
membership_status |
When a membership ends. Asks for the member ID and phone. | Private |
member_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "m-3",
"title": "Quarterly",
"price": {
"amount": 6000,
"currency": "INR",
"unit": "3 months"
},
"attributes": [
{
"label": "Includes",
"value": "Gym and group classes"
}
]
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
services |
What you do and your charges. | Public |
q
|
items |
document_checklist |
What to bring for one service. | Public |
q*
|
facts |
consultation_slots |
When a consultation can happen. | Public |
date
|
slots |
filing_status |
Where a filing stands. Asks for your reference and phone, never a PAN. | Private |
reference*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "itr",
"title": "ITR filing, salaried",
"price": {
"text": "From ₹1,500"
},
"attributes": [
{
"label": "Time",
"value": "3 working days"
}
]
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
package_search |
Find by destination, budget or days. | Public |
q,
budget_max,
days,
limit,
cursor
|
items |
package_detail |
One package in full. | Public |
id*
|
detail |
departures |
When a package leaves next. | Public |
q,
date
|
slots |
booking_status |
Where a trip booking stands. Asks for the booking number and phone. | Private |
booking_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "mn-5",
"title": "Manali 5 days",
"subtitle": "Hotel, meals and sightseeing",
"image": "https://cdn.example.com/t/5.jpg",
"price": {
"amount": 18500,
"currency": "INR",
"unit": "person"
},
"attributes": [
{
"label": "From",
"value": "Delhi"
}
],
"url": "https://travel.example.com/manali"
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
metal_rates |
Today's rates. Always send as_of, so nobody reads an old rate as today's. | Public |
q,
city
|
facts |
product_search |
Find by words, metal, purity or budget. | Public |
q,
budget_max,
limit,
cursor
|
items |
product_detail |
One design in full: weight, purity, making charges. | Public |
id*
|
detail |
order_status |
Where a custom order stands. Asks for the order number and phone. | Private |
order_id*,
phone*
|
status |
repair_status |
Whether a repair is ready. Asks for the job number and phone. | Private |
job_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "facts",
"data": {
"headline": "Today's rates",
"result": "neutral",
"rows": [
{
"label": "Gold 22K",
"value": "₹6,950 / gram"
},
{
"label": "Gold 24K",
"value": "₹7,580 / gram"
},
{
"label": "Silver",
"value": "₹92 / gram"
}
],
"as_of": "2026-11-05T09:00:00+05:30",
"note": "Making charges and GST are extra."
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
| action | What it does | Access | Params | Answers with |
|---|---|---|---|---|
vehicle_search |
Find by words, fuel or budget, new or used. | Public |
q,
condition,
budget_max,
limit,
cursor
|
items |
vehicle_detail |
One vehicle in full. | Public |
id*
|
detail |
on_road_price |
The on-road price of a model in a city. | Public |
q*
|
facts |
emi_estimate |
A rough monthly payment. Never a promise of a loan. | Public |
q*,
down_payment,
months
|
facts |
test_drive_slots |
When a test drive can happen. | Public |
q,
date,
branch
|
slots |
booking_status |
Where a vehicle booking stands. Asks for the booking number and phone. | Private |
booking_id*,
phone*
|
status |
service_status |
Whether a vehicle is ready after service. Asks for the job number and phone. | Private |
job_id*,
phone*
|
status |
branches |
Your outlets with address, hours and a map link. | Public |
q
|
items |
{
"rsflowhub": "1.0",
"status": "ok",
"type": "items",
"data": {
"items": [
{
"id": "v-9",
"title": "Compact SUV, VX",
"subtitle": "2023, used",
"image": "https://cdn.example.com/c/9.jpg",
"price": {
"text": "₹9.4 lakh"
},
"attributes": [
{
"label": "Fuel",
"value": "Petrol"
},
{
"label": "Gearbox",
"value": "Manual"
},
{
"label": "Driven",
"value": "18,000 km"
}
],
"url": "https://cars.example.com/v-9"
}
]
}
}
* required. The chatbot asks the visitor for it when it is missing. The Live data tab shows a sample for every action.
Actions of your own
For anything the list does not cover, add up to 5 of your own in the Live data tab: a name, the phrases that trigger it, the card type and up to 3 params. If it asks for a phone or email it is private, with all the protections below. A q text param gets the visitor's search words.
How the chatbot knows when to call
Each action has trigger phrases in English, Hindi and Hinglish, which you can replace. If none match, an intent check can still pick the action. Params are read from the message ("under 50k", "kal 7 baje", "ORD-10482"), and anything required that is missing is asked for. A live answer beats your auto reply on the same topic, unless a search comes back empty.
Security and privacy
- Only your own endpoint: public https on port 443, no private networks, no redirects. Verifying proves you hold the secret.
- Private lookups: your API must check the reference and the phone or email together and answer
not_foundif either is wrong. We stop after 3 failed tries in a chat, and also count per network and per order. - What is kept: for a private lookup the conversation keeps only a short line such as "Order status shown: Out for delivery", and the phone or email the visitor typed is masked. Nothing goes to the AI.
- What you must not send: card numbers, Aadhaar, PAN, full addresses, medical results, students' marks, or anything about another person. Values that look like card, Aadhaar or PAN numbers are hidden in private answers, but that is a safety net, not your filter.
- Tell your visitors: a phone or email given for a lookup goes to your own system. Say so in your privacy notice.