Skip to main content

Ingest

This section provides guidance on configuring connections, exporting data, automating data extraction, and understanding the technical specifications of the INGEST component.

What you will learn about here:

Connections: How to configure a connection to a source system on the INGEST → Connections page of the Config UI. This includes registering a new source system, choosing the connection type and operator, applying a configuration preset, and entering credentials.

Exports: How to configure an export definition on the INGEST → Exports page. An export reads one table, endpoint, directory or queue and writes the result to the landing zone.

Code Setup: A guide for automating data extraction and loading into the landing zone on a scheduled basis when using the UI isn't feasible. This section covers the JSON definitions and the API endpoints they are posted to.

Technical Details: Detailed information about the technical specifications of the INGEST component, including container setup, Python dependencies, and deployment and execution guidelines.

The sections below are tabs

Each heading above is a tab at the top of the page, not a section you can scroll to. The table of contents and any deep link only reach the tab that is open, so switch tabs rather than searching the page.


Configuring the connection in the Config UI​

The INGEST → Connections page (/systems) defines how PDQ reaches a source system. Systems are listed in the searchable sidebar on the left; selecting one opens its connection, and Add new system creates a new one.

Each page carries a Connections Guide button at the top that expands a short in-app summary of the same material.

Adding a new system

    A system is the logical source that everything else hangs off — connections, exports, source files and mappings all reference it by name.

    Source system name (system): A unique, one-word name representing the source system. This name is used internally for tracing and managing data from this source system, and cannot be changed later.

    Source system description (description): A written textual explanation of the context and details of the source system. This description is shown throughout the system documentation.

Choosing a connection type

    A system that has no connection yet shows the four connection types as buttons. The type decides which contract the connection is stored under and which form you get:

    • DB — a relational database reached with SQL.
    • API — an HTTP endpoint returning JSON.
    • FILE — a file system: local disk, S3, Azure Data Lake Gen2 or SFTP.
    • CUSTOM — everything else. Today this is the message-queue family (SQS, Azure Service Bus, Redis) plus the plain custom template.

    Once a connection exists, the type is fixed and the header shows the operator and a Connected badge instead.

Choosing the operator

    Within a connection type, the ingest runtime runs exactly one operator class per source system. The operator decides which fields are read, which are required, and which are ignored — so the form asks only for what that operator needs, marks what it requires, and flags what it will ignore rather than hiding it.

    TypeOperators
    DBPostgreSQL, SQL Server, Oracle, MySQL, and a generic base class
    APIGeneric REST, Heartpace, Salesforce Service Cloud, Talkdesk, SharePoint (Graph), Microsoft Teams, Google Drive / Sheets
    FILELocal file system, Amazon S3, Azure Data Lake Gen2, SFTP
    CUSTOMAWS SQS, Azure Service Bus, Redis, and a custom template

    Where the choice is stored. Only two connection kinds can record their operator:

    TypeStored inWho wins
    FILEthe StorageType fieldthe saved connection
    CUSTOM (queues)the queue_type connection propertythe saved connection
    DBnowhere — it lives in the agent's settings.yamldetected from the port, overridable per browser
    APInowhere — as abovedetected from the API URL, overridable per browser

    For DB and API the picker says how it arrived at its answer — detected from the port or the URL, or remembered from an earlier choice in this browser — rather than presenting a guess as fact. The choice only tailors the form; it is not sent anywhere.

    A handful of operators written for a single customer's source are not offered in the picker, but a system already mapped to one is still recognised and gets the right form.

    Database operators

    Operator selector for database connections: PostgreSQL, SQL Server, Oracle, MySQL and Generic (base class)

    API operators

    Operator selector for API connections: Generic REST, Heartpace, Salesforce Service Cloud, Talkdesk, SharePoint (Graph), Microsoft Teams and Google Drive / Sheets

    File operators

    Operator selector for file connections: Local file system, Amazon S3, Azure Data Lake Gen2 and SFTP

    Custom operators

    Operator selector for custom connections: AWS SQS, Azure Service Bus, Redis, Queue (base class) and Custom (template)

Configuration presets

    Most of what a new connection needs is identical for every customer of a given source: the port, the delimiters, the grant type, the control headers, the scope. Picking an operator offers one or more presets that fill those in, then list what they deliberately left to you with a note on where to find each value.

    • Fill empty fields writes only where the form is blank, so applying a preset can never overwrite something you typed.
    • Reset to these values is a separate action for the "start over from the defaults" case.
    • A preset never contains a password, secret or key, and never invents a value it cannot know. Anything of that kind appears on the "still needed" checklist instead.

    Presets exist for PostgreSQL, SQL Server, Oracle and MySQL; for OAuth 2.0 client credentials, OAuth with a client certificate and static bearer tokens on the generic REST operator; for Talkdesk, Salesforce (password and client-credentials grants), SharePoint and Teams via Graph; and for S3, SFTP (password and private key), Azure Data Lake Gen2 and the local file system.

Credentials — read this before saving

    The API encrypts every value it receives. Everything else follows from that one fact:

    • a stored credential comes back encrypted, and there is no way to read the original back;
    • posting that encrypted value back would encrypt it a second time;
    • the connection then fails at the next export, with nothing in the UI to show why — the value looks unchanged because it is unchanged, just wrapped one layer deeper than the runtime expects.

    So a stored credential is never reused. Saving a connection means entering the real credential again, and whatever you enter becomes what is stored. This applies to database and storage passwords and to encrypted values inside the connection properties — an OAuth client_secret, for instance, is cleared when the connection loads, and the form tells you which values it cleared.

    The Show JSON preview always includes the password key so the payload is postable, but never fills it with the stored value. A downloaded preview contains a live credential whenever one was typed — treat it as a secret, not a config file.

Database connection details

    Database name (DBNm): The name of the database to connect to. Required. For Oracle this is the service name, not a schema — it is passed as service_name.

    Database alias (DBAlias): Informational only. It is not used to reach the server.

    Server address (DBServerAddr): Host name or IP of the database server. Required.

    Server port (DBServerPort): The port the server listens on. Required. The form pre-fills the operator's default: 5432 for PostgreSQL, 1433 for SQL Server, 1521 for Oracle, 3306 for MySQL. This is also the value used to detect which database operator the connection runs.

    User (DBUsr): The user name used to authenticate. Required.

    Password (DBUsrPwd): The password for that user. Required, and never pre-filled — see Credentials above.

    Encrypted connection (DBEncryptedConnection): yes asks for an encrypted connection to the server.

    Trust server certificate (DBTrustCertificate): yes accepts the server's certificate without validating it — what an internal server with a self-signed certificate needs. On SQL Server this becomes TrustServerCertificate in the connection URL.

    Ingest database connection form: operator, database settings, credentials, transport security and options

API connection details

    API URL (APIUrl): The base URL. Each export definition's API path is appended to it. Required.

    Authentication method (APIAuthMethod): Decides everything else. The values the agent compares against are:

    • OAuth 2.0 — posts the connection properties to the token URL and builds the Authorization header from the response.
    • Token — makes no network call and uses the bearer_token connection property directly.
    • Basic — behaves like OAuth when a token URL is set, and falls back to the bearer token when it is not.

    Connections saved by an older version of the UI may carry lowercase values (oauth, bearer, apikey, none) which the agent does not recognise — no Authorization header would have been built for them. The form flags this and stores the current spelling when you save.

    Choosing OAuth 2.0 writes the properties that configuration requires into the property list, so the form and the saved payload agree.

    Token URL (APITokenUrl): The endpoint the connection properties are posted to in exchange for an access token. Required for OAuth 2.0; optional for Basic, where leaving it empty falls back to a static bearer token.

    API headers (APIHeader): Sent as HTTP headers on every data request, with three exceptions read as control flags:

    KeyEffect
    methodpost sends the filter conditions as a JSON body; anything else sends a GET with query parameters.
    allow_redirectsRemove the key to stop following redirects. It is truthiness-tested, so the string false still enables them — delete the row instead.
    verify_sslStripped from the token request only. It is still sent as a literal header on data requests; use the verify_ssl connection property instead.

    The headers most sources need are offered in the add menu — Accept, Content-Type, User-Agent, and X-API-Key for API-key authentication. Header names are not standardised, so check the provider's own spelling.

    Connection properties (APIConnectionProperties): Posted as the token-request body, so most keys come from your identity provider rather than from the agent:

    KeyUsed for
    grant_typeWhich OAuth flow. client_credentials moves the client id and secret into an HTTP Basic header; password keeps everything in the body. Posted verbatim, so a provider-specific grant can be typed in.
    client_id / client_secretThe credential pair, for the client-credentials and password grants.
    username / passwordThe resource owner's credentials, for the password grant.
    refresh_tokenThe long-lived token, for the refresh-token grant. Only workable where the provider issues a non-rotating token.
    scopeWhat the token is allowed to reach. Required by some providers, optional for others.
    audienceNames the API the token is for. Auth0 requires it; without it the token comes back opaque and the source rejects it.
    assertionThe signed JWT, for the JWT-bearer grant.
    client_assertion / client_assertion_typeA signed JWT authenticating the client instead of a secret — Entra ID with a certificate, for one.
    resourceRequired by some older identity providers.
    token_auth_methodWhere the client credentials go, for providers that offer a choice.
    bearer_tokenThe static token, for authentication method Token.
    verify_sslSet false to disable TLS verification on every request. Exposes the connection to interception — only for a known-bad internal certificate.
    cert_file / key_fileClient certificate and key inside the container, for mutual TLS.

    Which of these are required follows the authentication method and the grant type, not the operator — a client secret is needed for a client-credentials exchange and meaningless for a static bearer token. The editor groups the required ones first.

    Sources behind a gateway. If the source is fronted by a gateway (Azure API Management, for example), the vendor's own guidance stops applying: the scope, grant type and credentials become whatever the gateway expects. The form notices this from the token URL, withdraws the provider-specific suggestions and says why. Azure API Management usually also needs an Ocp-Apim-Subscription-Key header, which is offered on every API operator.

    Ingest API connection form: operator, API URL, headers, authentication method and connection properties

File connection details

    Storage name (StorageName): The bucket name for S3, the storage account for Azure Data Lake Gen2. Informational for SFTP and a local path.

    Region (StorageRegion): The AWS region. Required for S3; not used elsewhere — the ADLS endpoint is derived from the account name.

    Storage type (StorageType): Read-only. It carries the chosen operator, and is what the runtime and this page both read.

    Server address / Server port (StorageServerAddr, StorageServerPort): SFTP only; the port defaults to 22. S3 and ADLS are addressed by region, bucket and account name rather than by host.

    User / Password (StorageUsr, StorageUsrPwd): The meaning depends on the operator — the access key id and secret access key for S3, the login user and password (or key passphrase) for SFTP, and the account key or SAS credential for ADLS. For ADLS the user field must be non-empty or the client is never built, but the value itself is never used.

    Base path (StorageBasePath): The root directory for a local path, the key prefix for S3, the Gen2 filesystem (container) name for ADLS. It is joined with the export definition's file path.

    Connection properties (StorageConnectionProperties): SFTP requires connection_method (user/pass or private_ssh_id) and reads private_ssh_id_path. Every file operator also exposes performance tuning under Show advanced — fetch chunk memory, write batch size, gzip level, download chunk size.

    Ingest file connection form for an SFTP source: storage settings, connection details, credentials, options and connection properties

Custom and queue connection details

    Queue connections ship as CUSTOM, so every coordinate travels as a key=value connection property.

    Queue type (queue_type): SQS, SERVICEBUS or REDIS. This is how the page knows which broker you are configuring. Required.

    Queue name (queue_name): SQS resolves the queue URL from this at connect; for Redis it is the stream or list key. Required.

    Broker credentials are named to match the runtime's decryption rule, which works by substring match on the key — access_id, access_key and connection_token are decrypted, and every tunable is deliberately named to miss that rule. SQS needs region, access_id and access_key; Service Bus needs connection_token and, for a topic, topic_name and subscription_name; Redis takes either a connection_token URL or host/port/access_id/access_key/db, plus its consumer-group settings.

    Batch bounds — max_batch_bytes (30 MB), max_batch_seconds (15 minutes), max_batches_per_run (0 = unlimited), receive_batch_size and receive_wait_seconds — decide when a batch file is closed. The first three can be overridden per export.

    Ingest custom connection form for a queue source: operator selector and connection properties

Options shared by every connection type

    Add service col val (AddServiceColVal): When set, every exported record gets a __service column carrying this value.

    Column delimiter (ColumnDelimiter): Field separator used when CDC writes CSV output. Ignored for JSON.

    Line delimiter (LineDelimiter): Read but not honoured by most operators — they force \n regardless. The form marks it as Not used where that is the case.

Saving

    Show JSON opens the exact payload that will be posted, with a download button. Add connection / Update connection saves it. Required fields, and the properties the chosen operator cannot run without, are validated before the request is sent, and any failure is reported next to the button.