Overview
| Principle | How it is enforced |
|---|---|
| Credentials are sealed | Encrypted at rest, never shown again after saving, destroyed on disconnect |
| Least access | Each connector asks only for read permissions, and only for the records it maps |
| Verify first | Account, billing and order tools are blocked in code until the customer passes a one-time code |
| Minimum data | Only a fixed set of standard fields is mapped from each vendor response |
| No guessing | A failed lookup is reported as “can’t check right now”, never as “no account” or “no orders” |
Credentials at rest
- Encrypted. API keys, client secrets and OAuth access/refresh tokens are sealed with Fernet authenticated encryption before they are written to the database. The encryption key comes from a dedicated server secret that is separate from the one used for login tokens.
- Write-only. After you save a credential, the dashboard only ever shows that one is set, never its value. Refresh tokens are not even masked into the view.
- Destroyed on disconnect. Disconnecting a connector deletes the sealed credentials and the access key and switches off every bot tool that used it — they are erased, not hidden.
- Per-connection access keys. When a connector is used for customer verification, the platform issues it a random access key (
scc_…) for its internal Account Connect endpoints. Only a SHA-256 hash is stored against the connection, and a new key replaces the old one each time you press Use to verify customers or Use for tracking (every bot tool wired to that connection moves to the new key at once). See Authentication. - OAuth done properly. Sign-in uses a one-time
statevalue, the redirect address is fixed tohttps://www.siluxchat.com/api/connectors/oauth/callback, and tokens are refreshed automatically shortly before they expire.
Your own endpoints
For Account Connect you choose the API key; it is stored with your bot’s tool configuration and sent only to your base address, in the header you specify.
Read-only, least access
Every setup guide on the connector pages asks for read permissions only. Where a vendor uses OAuth, the scopes requested are fixed in the connector definition. These are the real scopes, straight from the catalogue:
| Connector | Category | Scopes requested |
|---|---|---|
| eBay (seller) | E-commerce | https://api.ebay.com/oauth/api_scope/sell.fulfillment.readonly |
| Etsy | E-commerce | transactions_r |
| PayPal | Payments | https://uri.paypal.com/services/invoicing |
| Zettle by PayPal | Payments | READ:PURCHASE |
| FreshBooks | Accounting | user:clients:read · user:invoices:read |
| MYOB Business / AccountRight | Accounting | sme-company-file · sme-contacts-customer · sme-sales |
| QuickBooks Online | Accounting | com.intuit.quickbooks.accounting |
| Sage Business Cloud Accounting | Accounting | readonly |
| Wave | Accounting | business:read · customer:read · invoice:read |
| Xero | Accounting | offline_access · accounting.contacts.read · accounting.transactions.read |
| Zoho Books | Accounting | ZohoBooks.contacts.READ · ZohoBooks.invoices.READ |
| Microsoft Dynamics 365 (Sales / Customer Service) | CRM | https://{org_host}/user_impersonation · offline_access |
| Salesforce | CRM | api · refresh_token |
| Zoho CRM | CRM | ZohoCRM.modules.contacts.READ · ZohoCRM.modules.cases.READ |
| Zoho Desk | Helpdesk | Desk.contacts.READ · Desk.tickets.READ · Desk.search.READ |
| Google Calendar | Booking & scheduling | https://www.googleapis.com/auth/calendar.events.readonly |
| Microsoft Bookings | Booking & scheduling | https://graph.microsoft.com/Bookings.Read.All · offline_access |
| Square Appointments | Booking & scheduling | CUSTOMERS_READ · APPOINTMENTS_READ |
| Provet Cloud | Veterinary | restapi |
| Actionstep | Legal | participants · actions · bills |
| PracticePanther | Legal | full |
| Smokeball | Legal | contacts/read · matters/read |
| Parcel2Go | Shipping & tracking | public-api |
| Google Sheets | Productivity & no-code | https://www.googleapis.com/auth/spreadsheets.readonly |
For API-key connectors, create a dedicated key or user for Silux Chat with read-only rights, so you can revoke it without affecting anything else.
Verification before any personal data
- The bot’s account, billing and order tools are hard-gated in code: they refuse to run until the customer has completed verification in the same conversation, and every connector endpoint that returns customer data needs a live session token. Instructions to the AI are not relied upon for this.
- The one exception is parcel tracking by tracking number: it returns only order number, status, tracking number and courier, and only for a parcel whose tracking number is exactly the one the customer gave — the same facts the courier’s public tracking page shows. Tracking by order number needs a session and the order must be the customer’s.
- The customer must give their name plus one more detail. With a connector, the surname must match exactly and the first name must match or begin with the same letter, and the postcode, email or mobile must match the record.
- The one-time code goes to the contact details held in your system — by text where your plan includes SMS, otherwise by email. The chat never chooses where the code goes, so knowing someone’s details is not enough.
- Codes last 10 minutes and work once; five wrong codes void the code; a verified session lasts 30 minutes.
- Replies never say which detail failed to match.
The full sequence is in Customer identity verification & OTP.
Data minimisation
Vendors return far more than a customer needs to hear. Each connector maps a response into a small standard shape, and anything not mapped is discarded before the bot sees it. These are the shapes:
| Capability | Fields the bot can see | Used for |
|---|---|---|
| find_customer | id, name, email, phone, postcode | Match the customer and know where to send the code |
| orders | order_number, placed, status, total, tracking, courier | “Where is my order?” |
| order_status | order_number, status, tracking, courier | Track My Parcel: by tracking number without verification (these four fields only, exact number match); by order number only for the verified customer’s own order |
| invoices | invoice, date, amount, status | “Is my invoice paid?” |
| balance | balance | “What do I owe?” |
| bookings | id, start, service, status | “When is my appointment?” |
| subscriptions | id, plan, status, next_billing | “When is my next payment?” |
| tickets | id, subject, status, updated | “Any update on my case?” |
A few connectors add one or two extra fields where they are useful (for example currency or an outstanding amount); each connector page lists its exact fields. Results are limited to a handful of recent records.
Health, dental, veterinary & legal
Clinical records and case files are never mapped. Health, dental and veterinary connectors read appointment times, service names, status and invoices; legal connectors read contact details, bills and matter status. Generated from the catalogue:
| Connector | Category | What is mapped |
|---|---|---|
| Cliniko | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, end, cancelled, did_not_arrive · Invoices: invoice, date, amount, status |
| Halaxy | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, status, service, end · Invoices: invoice, date, amount, status |
| Healthie | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status |
| Nookal | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, service, cancelled, dna |
| Pabau | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status, location · Balance: balance, loyalty_points |
| Semble | Health & clinics | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status, end |
| Dentally | Dental | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status, end · Invoices: invoice, date, amount, status, outstanding |
| Open Dental | Dental | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status, confirmed · Balance: balance |
| ezyVet | Veterinary | Identify: id, name, email · Appointments: id, start, status_id, type_id, active, duration_seconds · Invoices: invoice, date, subtotal, tax |
| Provet Cloud | Veterinary | Identify: id, name, email, postcode · Appointments: id, start, service, active, confirmed, end · Invoices: invoice, date, amount, due, status |
| Vetspire | Veterinary | Identify: id, name, email, phone, postcode · Appointments: id, start, service, status, duration_minutes · Invoices: invoice, date, amount, status |
| Actionstep | Legal | Identify: id, name, email, phone, postcode · Invoices: invoice, date, amount, status, balance, due · Matters / cases: id, subject, status, updated |
| Clio Manage | Legal | Identify: id, name, email, phone, postcode · Invoices: invoice, date, amount, status, balance, due · Matters / cases: id, subject, status, updated |
| MyCase | Legal | Identify: id, name, email, phone, postcode · Matters / cases: id, subject, status, updated, stage, balance |
| PracticePanther | Legal | Identify: id, name, email, phone, postcode · Invoices: invoice, date, amount, balance, paid, due · Matters / cases: id, subject, status, updated |
| Smokeball | Legal | Identify: id, name, email, phone, postcode · Matters / cases: id, subject, status, opened |
Special category data
An appointment with a clinic can itself reveal health information. If you connect a health or dental system, record it in your privacy notice and records of processing, and keep the bot’s answers to what your reception team would say on the phone.
Safe requests to vendors
Injection-safe queries
Customer-typed values (an email, a name, a postcode) often end up inside a vendor’s query language — SOQL, OData, search strings, spreadsheet formulas. Before they are inserted, control characters are always removed, and quotes and backslashes are stripped (or escaped for the specific query language where the connector declares one), so a value can never change the meaning of a query. Values placed in URL paths are URL-encoded, so ../ cannot walk to another resource.
No reaching inside networks
Every outbound address is checked before the request is made: only http/https, and addresses that resolve to private, loopback or internal ranges are refused. Redirects are not followed, so a vendor response cannot bounce a request somewhere else. Connector base addresses are HTTPS.
Another customer’s rows are dropped
As a final safety net, any returned row that carries an email address different from the verified customer’s is removed before the bot sees it — whatever the vendor’s search returned. For a customer verified from their own orders or bookings (a vendor with no customer search), a row is shown only if it positively names the customer’s email.
Honest failures
- If a vendor refuses the credentials or is unreachable, the customer is told “We can’t check accounts right now — our team has been told.” The response carries
system_error: true, and the connection is marked as failing. A dead connector must never look like “no orders found”. - Every connection is re-tested daily. If one that was working starts failing (a revoked key, an expired sign-in), the account owner is emailed once with the reason and how to reconnect.
- Rate-limited requests (HTTP 429) are retried a few times, honouring
Retry-After, before being reported as a failure.
UK GDPR, roles and retention
| Topic | Position |
|---|---|
| Roles | You (the business) are the controller of your customers’ data. Silux Chat processes it on your instructions as your processor. |
| Contract | Our Data Processing Agreement covers this processing; see also our GDPR and Privacy Policy pages. |
| Verification records | Code and session records hold the matched customer’s identifying fields and expire with their time limits (10 and 30 minutes). |
| Vendor data | The connector layer reads on demand and does not copy your vendor data into a separate store. |
| Transcripts | What the bot tells the customer becomes part of the conversation transcript, kept under your account’s conversation settings. |
| Credentials | Kept encrypted until you disconnect, then destroyed. |
Tell your customers, in your privacy notice, that your assistant can look up their account after verifying them, and which systems it reads.
Developer security checklist
- Create a dedicated, read-only API user or key for Silux Chat in each vendor system.
- Never paste production keys into tickets, emails or chat — enter them only on the dashboard.
- For Account Connect: HTTPS only, a long random key, constant-time comparisons, hashed codes, 5-attempt lock, 10/30-minute expiry.
- Rate-limit verify-identity per IP and per account.
- Send codes only to the contact already on the account.
- Return only what your own “My Account” page would show — never passwords, full card numbers or internal notes.
- Log outcomes, not codes or tokens.
- Rotate keys when staff leave or a key may have been exposed; disconnecting destroys the old one on our side.
- Keep the test customer (Test Customer / TE5 7ST, code 123456) working so connections can be re-tested without contacting anyone.
Get help
Security questions
For a data-protection question or help configuring least-privilege access in your vendor system, email support@siluxcall.co.uk.
Need help with your integration?
Our integration team can review your endpoints, help you choose the right connector and check a test run with you. Tell us which system you use and what you would like the bot to answer.