How it works

From raw file to live API in minutes.

No code, no migrations, no DBA. DocQuery reads your documents, lets you review the structure, links them with foreign keys, and exposes them as production APIs.

1

Onboard

Create an account, get a personal workspace, and an instant API key. Free tier includes 5 documents and 10,000 rows — no card required.
2

Upload or connect

Drag in CSVs, JSON, Markdown, or text. Or connect an Airtable base with a Personal Access Token and DocQuery pulls every record (paging through automatically). PDF, Excel, Word, Google Sheets, and Microsoft 365 are on the roadmap. Sources are versioned, so you can re-pull or re-extract on updates.
3

Extract & review

Our AI detects tables, columns, types, and primary keys. You see the extracted schema side-by-side with the source. Rename columns, change types, mark keys, or correct rows — all from a single screen.
4

Build relations

Open the canvas. Click two columns from any two tables to link them. DocQuery supports 1:1, 1:many, many:1, and many:many. AI suggests likely matches based on value overlap.
5

Use the API

REST, GraphQL, and MCP endpoints are live the moment you save. Try them from the in-app console, copy the OpenAPI spec into Postman, or paste the MCP config into Claude Desktop or Cursor.
6

Iterate

Upload a new version of a PDF or push a Sheet update — relations auto-reconnect where the keys still match. Conflicts surface in a clear UI you can resolve in one click.

A worked example

Imagine you have two files: a customer list in customers.csv and an invoice export in invoices.csv. Here's what happens once you upload them.

  1. Tables created. DocQuery parses both CSVs, generates clean column slugs, and marks the first column as the primary key. Two tables exist in your workspace.
  2. Relation linked. On the canvas, you click invoices.customer_idcustomers.id and choose many → one. Done.
  3. REST request. Hit GET /api/v1/tables/invoices/rows?status=paid&include=customer_id with your bearer token. The response includes each paid invoice and the matching customer row inline.
  4. GraphQL query. The same query in GraphQL: rows(table:"invoices") { related(column:"customer_id") {…} }.
  5. AI chat. Ask "how many paid invoices does Acme have?" — DocQuery's chat agent calls the same MCP tools, joins on the relation, and answers in one sentence.

Try it with your data.

Free workspace, instant API. The first table is the longest part — and even that's about thirty seconds.