The request
A job carries two parts:
dataRequest and metadata.
mappedFields is the heart of the request. It maps each datasource config name to the tables you want, and each table to the fields you want.
metadata.source is required. It names the product that owns the job. The Manager rejects a request without it. The Manager also rejects the request when a referenced connection belongs to a different product, or belongs to no product at all. Internal datasources carry no product, so this check skips them.
Field projection
Name the fields you want, or ask for all of them:
- A list of field names extracts exactly those fields.
- The single entry
["*"]extracts every column of the table. The wildcard must be the only entry in the list.
extraction request failed schema validation error. Use the schema-validation workflow for per-field diagnostics.
Multiple datasources, tables, and schemas
One job can read from several datasources at the same time. Each datasource can contribute several tables. Each table can sit in a different schema. Write a table name in one of two forms:
- Unqualified —
accounts. Fetcher reads it from the engine default schema:publicon PostgreSQL,dboon SQL Server. - Schema-qualified —
accounting.invoices. The prefix before the dot is the schema. On Oracle it is the owner.
mappedFields and discovers only those namespaces. If any table name is unqualified, discovery adds the engine default schema as well: public on PostgreSQL, dbo on SQL Server.
Two engines do not take a schema list. MySQL treats the connected database as the namespace. MongoDB has collections instead of schemas, so a collection name is always unqualified.
Limits
The extraction engine bounds every job. These are the default values:
The Manager rejects a job with more than 10 datasources before it reaches the queue. A result over the size limit fails the job. Fetcher never returns or stores a truncated result. For embedded Engine callers,
ExtractionRequest.Overrides can lower, but never raise, an Engine limit. The standalone Manager job payload has no limit-override field and maps overrides as nil; the Worker only accepts a positive ENGINE_MAX_RESULT_BYTES override. These bounds cover generic datasource work; plugin_crm uses the Worker’s explicit compatibility path.
Duplicate jobs
The Manager computes a SHA-256 hash over the whole request —
dataRequest and metadata together. It then looks for a job with the same hash created in the last 5 minutes.
- A match returns the existing job with HTTP 200. No second extraction runs.
- No match creates a new job and returns HTTP 202.
- A match that already failed does not block a retry. The Manager creates a new job.
Job lifecycle
Before it creates the job, the Manager resolves every datasource name to a connection and opens a real connection to each one. A datasource that fails this test rejects the whole request. Internal datasources configured through environment variables skip the test.
A Worker performs a best-effort check that a job is
pending, then moves it to processing and starts the extraction. This is not an atomic pending-to-processing compare-and-set, so concurrent deliveries can both observe pending. Generic datasource work runs in parallel up to the concurrency bound and is fail-fast; plugin_crm uses the Worker’s explicit compatibility path.
On success the Worker writes the result to object storage and records two values on the job: the result path and the HMAC signature of the result. It then publishes the terminal event.
Next steps
Filters
The ten filter operators and the value shape each one takes.
Datasources
What behaves differently on each of the five database engines.

