Overview
This connector ingests DMI objects into your data lake. Schemas are discovered dynamically at runtime from DMI’s metadata, so you receive whatever columns currently exist for each table, with types mapped automatically.
For each table, the connector outputs:
All source columns (discovered dynamically; column names are lower-cased in the output).
Any unique keys used for record identity.
Any indexed fields used to slice/iterate data efficiently.
A standard metadata column
dmi_last_updated_atindicating when the row was written.
Authentication & Setup
Provide the following settings:
API key (for DMI Data Sync API)
Environment URL
Default:
di.data-management.comOptional: “custom” + Custom URL
Object storage credentials (used to fetch bulk export files)
client_idandclient_secretfor the configured object storage (DigitalOcean Spaces)Region:
nyc3Endpoint:
https://nyc3.digitaloceanspaces.comBucket (read/delete during sync):
prod-bytespree-dmi-data-loading
Sync Strategy:
Dynamic schema discovery
Before syncing a table, the connector calls DMI to enumerate columns and data types and builds the destination schema. Numeric types are mapped to integer/float; everything else to string.
Incremental windowing
Each stream uses a rolling greater-than filter on a last-modified timestamp.
The starting point is the stream’s bookmark
last_started.On first run (or if an invalid bookmark is found) the start is set to 1971-01-01 01:00:00Z and marked as a full replace run.
A 5-minute safety offset is applied (start time is moved back by 5 minutes).
All timestamps are evaluated in America/New_York.
Bulk Exports
High-volume tables are synced via DMI’s bulk export workflow:
Create export
POST
/api/v5/exportwith:
table,api_key,greater_than= ISO timestamp from the incremental window.Capture the returned
export_id.
Poll status & stream intermediate files
GET
/api/v5/export/{export_id}?api_key=...every ~30s until status is no longerpending/in_progress.While the export is running, the response includes
s3_object_keys.The connector processes all but the last key during in-progress polling (the last file may still be growing).
Already processed keys are tracked so each object is read exactly once.
Download & process files
Files are fetched from DigitalOcean Spaces (bucket above).
Each object is a CSV:
Header row is parsed; each subsequent line is mapped to a record by header name.
Empty lines are ignored.
On incremental runs, a hard delete is emitted before writing the new record (key selection described below).
After successful processing, the object is deleted from the bucket.
Finalize & close export
Once status indicates all files are ready, any remaining file is processed.
POST
/api/v5/export/{export_id}/closeis called to close the export.
State
At the end of each stream, the connector writes the bookmark
{stream: {last_started: <run start ISO8601>}}.
Deletes
During incremental runs, incoming records are preceded by a hard delete for the same key (idempotent backfill safety):
Default key:
identityFor the special INTEGRATIONS_DELETE_LOG stream, delete key is
dmi_idand deletes are propagated to the referenced downstream table usingidentity.
Some reference tables are always full-replace (see list below).
Retries
Network/API requests automatically retry for ~20 minutes with ~65s back-off between attempts.
Maintenance window protection
If the connector starts while DMI maintenance is underway (Saturdays between roughly 00:00–02:00 Eastern), it sleeps and rechecks every 10 minutes until the window passes.
Tables, Unique Keys & Indexed Fields
(Fields are listed alphabetically per table. Columns themselves are dynamic and discovered at runtime.)
ACCOUNT_UPDATE_LOG
Unique keys: identity
Indexed fields: account
BBJOB
Unique keys: identity
Indexed fields: job
BBLIST
Unique keys: identity
Indexed fields: bblstc, job, panel
BBPANEL
Unique keys: identity
Indexed fields: job, panel
CONTACT
Unique keys: identity
Indexed fields: sdnr#, snaid
CONTACTAC
Unique keys: identity
Indexed fields: sacid#, snaid
CRMCMTS
Unique keys: identity
Indexed fields: taskid
CRMMSGS
Unique keys: identity
Indexed fields: mbxname, taskid
CRMTASK
Unique keys: identity
Indexed fields: taskid
EMLPRODT
Unique keys: identity
Indexed fields: —
EMLPROHD
Unique keys: identity
Indexed fields: —
FNDCOMNT
Unique keys: identity
Indexed fields: —
FNDCSTAUX
Unique keys: identity
Indexed fields: —
FNDCUSCD (Load type: Full replace)
Unique keys: —
Indexed fields: codno, codseq
FNDCUSCG (Load type: Full replace)
Unique keys: —
Indexed fields: cgcde
FNDCUSCY (Load type: Full replace)
Unique keys: —
Indexed fields: cntryc
FNDCUSED (Load type: Full replace)
Unique keys: —
Indexed fields: edcde
FNDCUSFG (Load type: Full replace)
Unique keys: —
Indexed fields: fgcde
FNDCUSIN (Load type: Full replace)
Unique keys: —
Indexed fields: incde
FNDCUSOC (Load type: Full replace)
Unique keys: —
Indexed fields: occde
FNDDNRLNK
Unique keys: identity
Indexed fields: —
FNDEMAIL
Unique keys: identity
Indexed fields: ednrid
FNDMRGCMT
Unique keys: identity
Indexed fields: fromacct
FNDTITLE (Load type: Full replace)
Unique keys: —
Indexed fields: tytcod
FUNDDNRP
Unique keys: identity
Indexed fields: crmfg, dnrid, lstcde, pkgcde
FUNDFLDDP
Unique keys: identity
Indexed fields: dnrid, field#
FUNDFLDHP
Unique keys: identity
Indexed fields: —
FUNDMATP
Unique keys: identity
Indexed fields: dnrid
FUNDPROP
Unique keys: identity
Indexed fields: dnrid, prpfld
GIFTATTHP
Unique keys: identity
Indexed fields: dnrid
INTEGRATIONS_DELETE_LOG
Unique keys: dmi_id
Indexed fields: —
MF1NAME
Unique keys: identity
Indexed fields: acount, actcd1, actcd2, actcd3, actcd4, actcd5, matchk
MF1TADDR
Unique keys: identity
Indexed fields: acount
PLEDGDTL
Unique keys: identity
Indexed fields: acount, plid
TRNCHLDHD
Unique keys: identity
Indexed fields: chid, chdid
Notes & Limitations
Dynamic columns: the connector mirrors columns exposed by DMI at sync time. If DMI adds/removes fields, the connector reflects those changes on the next run.
Full-replace tables: labeled above; these are always re-fetched completely.
Temporary partial files: during a bulk export, the most recent object key is skipped until the export finishes (to avoid reading files still being written).
Debug logging: when enabled, a temporary table name is logged and used internally to stage results for troubleshooting.
