From locked-in vendor systems to queryable intelligence. Any machine, any access level.
Our client's operational data was locked inside a third-party vendor system with no export capability, no API, and no path to data portability. The only window into the system was the vendor's web interface.
The consequences were predictable:
The vendor had no roadmap for an API. Waiting was not a solution. We needed to extract, structure, and expose the data ourselves — working with whatever level of access we were given.
We treat data extraction as an engineering problem, not a vendor negotiation. If a system has a web interface, it has an API — the browser is already using it. Our job is to find it, authenticate to it, and pull data out reliably and continuously.
The result is a generalizable pipeline we've now deployed at multiple sites: each one a YAML config file away from being operational. The same extraction logic, watermark tracking, and destination schema applies everywhere.
At the first deployment, our only access was the vendor's browser-based UI. We reverse-engineered the XML API the browser was calling, then built an authenticated extraction layer that reproduced the login handshake, maintained a session, and queried the same endpoints the UI uses.
The result was a reliable, incremental sync pipeline:
A lightweight scheduler runs the extraction on a configurable interval, keeping the database continuously current with the source system.
At a second deployment, we negotiated direct read access to the vendor's underlying PostgreSQL database. This unlocked more data, richer schema detail, and a cleaner sync path — but the architecture remained the same.
We built a database-to-database sync layer with two key capabilities beyond the web extraction approach:
Six data streams now sync in a single run: system status, three event log tables, and two device registry tables. The same watermark infrastructure tracks all of them.
Every extracted record lands in a cloud-hosted PostgreSQL instance with row-level security enforced at the database layer. The schema is designed for the data, not the vendor's storage format — normalized, typed, indexed, and queryable without any knowledge of the original system's internals.
A sync_state table tracks each stream's watermark: last ID synced,
last timestamp seen. This makes every run idempotent — restart after a failure
and the sync resumes exactly where it stopped, with no duplicate records and no gaps.
An auto-generated REST API exposes every table with filter, sort, and pagination support — no custom API code required. Access is gated by JWT authentication and enforced row-level security policies.
Once data is in PostgreSQL and accessible via API, building on top of it is straightforward. We delivered two analytical layers:
A web dashboard surfacing the key operational metrics: event counts over time, device activity, time-series charts with configurable date windows, and data export. Built directly against the database API — no intermediate service.
An AI assistant that lets operators query their own data in plain English. The chatbot understands the database schema and translates natural-language questions into SQL queries, executes them against the live database, and returns structured answers with the underlying data.
Operators who would never write a SQL query can ask questions like:
The chatbot runs against the read-only API surface, so it can only ever retrieve data — not modify it.
The pattern applies to any operational system where data is inaccessible:
| STARTING CONDITION | WHAT WE DO |
|---|---|
| Web UI only, no API | Reverse-engineer the browser's API calls; build an authenticated extraction layer against them |
| Direct database access | Schema introspection and direct table sync — faster, more complete, schema-preserving |
| Multiple sites, one system | Single codebase, per-site YAML config; each site gets its own table namespace in the shared destination |
| Data accessible, but not queryable by staff | AI chatbot layer enables natural-language queries against the live database — no SQL required |
The hard part isn't connecting to a system. It's keeping the data current reliably over time: handling sessions that expire mid-run, pagination schemes that shift between pages, network failures mid-sync, and clock skew between source and destination.
Our watermark approach handles all of this. Each stream's progress is committed atomically with the data it tracks. A crash mid-run leaves the watermark exactly where the committed data ends. The next run picks up without duplication, without gaps, and without operator intervention.
Multi-site config means the same reliability applies to every deployment. The tenth site is as straightforward as the first.
If you can see the data in a browser, we can get it into a database. Tell us what you're working with.
info@bandpassconsulting.com