Overview
The DonorDrive connector extracts data from the DonorDrive Export API into the data platform. It is designed around DonorDrive’s export endpoints and dynamically discovers the schema for each configured table before retrieving its records.
The connector is read-only. All interactions with DonorDrive use HTTP GET requests; it does not create, update, or delete data in DonorDrive.
A key characteristic of this connector is that tables and columns are not hardcoded. The selected table names come from the connector catalog, and each table’s columns are obtained from DonorDrive’s metadata endpoint at runtime.
Authentication & Configuration
Required settings
The connector requires:
instance_name— the DonorDrive instance used to construct the API URL.api_key— API credential sent with every request.earliest_start_date— the earliest modification timestamp from which records should be retrieved.
The base URL is constructed as:
https://api.donordrive.com/{instance_name}/exportThe API key is sent using:
Authorization: Bearer {api_key}The configured earliest_start_date is normalized to the America/New_York timezone before it is used in API requests.
Connectivity Test
The connector validates the configuration using:
Endpoint
GET /bytespree/metadata.json
Full request:
GET https://api.donordrive.com/{instance_name}/export/bytespree/metadata.jsonAuthentication
Authorization: Bearer {api_key}The connectivity test treats 400, 401, and 403 as failures. Other HTTP status codes are considered sufficient to indicate that the credentials/API location are reachable. In particular, the code intentionally allows a 404 response during this connectivity test.
Important: This means a successful connector test does not necessarily prove that every configured export table exists or is accessible. Individual table endpoints are validated later during discovery and sync.
Sync Strategy
Dynamic Schema Discovery
Before retrieving records, the connector performs schema discovery for every selected table.
For a table named {table}, it calls:
GET /{table}/metadata.jsonExample:
GET https://api.donordrive.com/{instance_name}/export/donations/metadata.jsonThe response must contain:
result
as an array of column metadata. Each entry’s column value becomes a destination column.
All discovered columns are declared as string fields.
The connector does not declare any unique/key columns:
key properties: none
If the metadata response does not contain a valid result array, discovery fails for that table.
Schema discovery happens on every sync
A normal sync explicitly runs schema discovery before retrieving records. This allows newly exposed columns to be picked up without maintaining a static schema in the connector.
Table Discovery
The connector itself does not return a predefined list of DonorDrive tables. Its table-list operation returns an empty list.
Therefore:
Table names must already be supplied through the connector catalog/configuration.
Each configured name must correspond to a valid DonorDrive Export API resource.
Supported tables are effectively determined by what the particular DonorDrive instance exposes through its export API.
This differs from connectors that have a fixed table map embedded in the connector.
Date Filtering
The connector retrieves records using DonorDrive's lastModifiedStart and lastModifiedEnd filters.
For each table:
lastModifiedStart = {earliest_start_date} lastModifiedEnd = 2999-12-31T23:59:59The start timestamp is formatted as:
YYYY-MM-DDTHH:MM:SS
The connector therefore requests all records modified from the configured earliest start date onward.
Important: This Is Not Bookmark-Based Incremental Sync
Although the DonorDrive API query uses a lastModifiedStart filter, the connector does not maintain or advance a sync bookmark.
The same configured earliest_start_date is used at the beginning of every run. No new last_started, last_modified, or similar state value is written after a successful sync.
For example, if:
earliest_start_date = 2025-01-01
then every run asks DonorDrive for records modified from January 1, 2025 onward.
This has two consequences:
Previously retrieved records may be returned again on future runs.
The amount of data retrieved can continually increase as more records are modified after the configured start date.
For large or long-running integrations, this behavior can significantly affect sync duration and API usage.
Record Count & Pagination
Before retrieving a table, the connector first asks DonorDrive how many matching records exist.
Record-count request
Endpoint
GET /{table}.jsonQuery parameters
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=1The connector reads:
metadata.recordcount
from the response.
If metadata.recordcount is missing, the connector assumes there are 0 records to retrieve.
Data requests
Records are subsequently retrieved from:
GET /{table}.jsonwith:
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=5000 page={page_number}Page size
5,000 records
per API request.
Page numbering
Pages begin at:
1
and increase sequentially.
The connector continues requesting pages until the number of records written reaches the recordcount obtained before the paging operation began.
Pagination Integrity Check
Every data response is expected to contain:
result metadata
The connector also reads:
metadata.pagecount
If the requested page number exceeds the page number reported by the response metadata, the connector fails with a Missing data encountered error rather than silently completing with potentially incomplete data.
This acts as a safety check against inconsistent or incomplete pagination.
Record Processing
Records from the API's result array are written directly to the corresponding table.
The connector does not perform significant transformation or field remapping during the data sync.
Data types
During discovery, every discovered column is declared as a string.
The actual record payload is then written as returned by DonorDrive.
Developers should therefore be aware that fields representing numbers, booleans, dates, or timestamps may still be represented by the connector schema as strings.
API Endpoints & HTTP Methods
The connector uses GET only.
There are no POST, PUT, PATCH, or DELETE calls in this connector.
1. Connectivity test
GET /bytespree/metadata.json
Purpose:
Verify that the DonorDrive instance and API key are reachable.
Authentication:
Authorization: Bearer {api_key}
2. Table metadata / schema
GET /{table}/metadata.jsonPurpose:
Retrieve the column definitions for a configured table.
Dynamically construct its destination schema.
No query parameters are sent.
3. Record count
GET /{table}.jsonParameters:
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=1Purpose:
Determine how many records need to be retrieved for the current run.
The count is taken from:
metadata.recordcount
4. Data retrieval
GET /{table}.jsonParameters:
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=5000 page={page_number}Purpose:
Retrieve the actual records for the table.
Deletes
The connector has no delete synchronization mechanism.
It:
Does not call an API endpoint for deleted records.
Does not issue
DELETErequests.Does not emit downstream delete events.
Does not compare the current DonorDrive dataset against a prior snapshot.
Therefore, if a record is physically removed from DonorDrive, that deletion will not automatically be reflected downstream.
If deletion reconciliation is required, it must be handled separately—for example through periodic full reconciliation or another source of deletion information.
State
The connector does not persist an incremental bookmark or watermark.
The only date controlling extraction is the configured:
earliest_start_date
That date is loaded again at the beginning of every run.
There is consequently no automatic progression such as:
last successful sync → next sync start
This is one of the most important operational differences between DonorDrive and connectors that use true incremental state.
Metrics
After each table finishes, the connector emits a:
record_count
metric containing the number of rows written for that table during the run.
This can be useful for:
Monitoring normal sync volumes.
Identifying unexpected zero-record runs.
Comparing changes in table volume between executions.
Retries & Error Handling
Retry window
Normal API requests may retry for up to:
1,200 seconds (20 minutes)
The connector waits:
65 seconds
between attempts.
The delay is fixed; it does not progressively increase.
Immediate failures
The following statuses are not retried by the standard request method:
401 Unauthorize
Unauthorized - Please provide valid credentials.
404 Not Found
Not Found - The requested export could not be found.
These fail immediately.
Retried responses
Other non-200 responses are retried every 65 seconds until the 20-minute retry window is exhausted.
After that point, the last HTTP error is surfaced to the caller.
The connector defines specific messages for:
204 — No Content 304 — Not Modified 400 — Bad Request 401 — Unauthorized 404 — Not Found 412 — Precondition Failed 500 — Internal Server Error 503 — Service Unavailable
Operational Considerations & Known Limitations
1. No true incremental bookmark
The most significant limitation is that the connector does not advance the extraction start date after successful runs.
Every run begins from the configured earliest_start_date.
A large historical window can therefore cause the same records to be downloaded repeatedly.
Recommendation: Carefully choose earliest_start_date based on the required historical window and expected sync frequency.
2. No unique keys are declared
Dynamically generated schemas use:
key properties: none
No source field is marked as the unique identifier for a table.
Consequences include:
The connector itself provides no guidance for deduplication.
Repeated records resulting from the fixed historical window must be reconciled downstream.
Developers should identify appropriate business or source keys for each DonorDrive export table before building transformations that assume uniqueness.
3. No delete propagation
Records deleted upstream are not removed downstream automatically.
There is no delete endpoint or deletion-event handling in this connector.
Periodic source-to-destination reconciliation may be necessary if accurate deletion handling is required.
4. Supported tables are not enumerated by the connector
The connector's table-list operation returns:
[]
This means the connector cannot independently tell a user which DonorDrive exports are available.
Table names must be provided through configuration/catalog and must correspond exactly to export resources available on that DonorDrive instance.
5. Schema is dynamic
Columns are pulled from:
/{table}/metadata.jsonon every run.
This allows the connector to automatically detect new source columns, but it also means the destination schema can change when DonorDrive modifies its export schema.
Downstream models that assume a fixed set of fields should account for possible schema drift.
6. Every column is declared as a string
Regardless of the underlying business meaning, metadata fields are represented as strings in the connector's schema.
Dates, numeric amounts, counters, and boolean-like fields may therefore require explicit casting in downstream models.
7. Large extraction windows can be expensive
Because every run re-reads everything modified since earliest_start_date, the size of the extraction can grow substantially over time.
Although individual API pages contain up to 5,000 records, large tables can still require many API requests.
A sync also performs:
A metadata request.
A record-count request.
One or more data requests.
for every selected table.
8. Source data changing during pagination can affect consistency
The connector obtains recordcount before beginning the main paging loop and uses that initial number to determine when to stop.
If the underlying export changes substantially while a long sync is running, the initial count and later pages may no longer represent exactly the same snapshot.
The connector includes a page-count consistency check to catch some pagination problems, but it does not establish a point-in-time snapshot of the source.
9. Very large future end date
Instead of using the execution time as lastModifiedEnd, requests use:
2999-12-31T23:59:59
In effect, the connector asks for everything modified after the configured start date with no practical upper date restriction.
10. Timezone handling deserves attention
The configured earliest_start_date is converted to:
America/New_York
before querying DonorDrive.
However, the outgoing lastModifiedStart value is formatted without an explicit timezone offset:
YYYY-MM-DDTHH:MM:SS
Developers troubleshooting records around date boundaries should keep this behavior in mind.
11. Missing count metadata results in an empty sync
If the initial count response does not contain:
metadata.recordcount
the connector interprets the table as having zero records rather than failing the run.
An unexpected zero-record sync should therefore be investigated rather than automatically interpreted as proof that the source table contains no records.
12. Strict expectations for data responses
Every data page must contain both:
result metadata
If either is missing, the connector aborts the table with:
Invalid result returned: missing result and metadata
This protects against silently accepting malformed or incomplete API responses.
13. Connectivity test is intentionally permissive
The initial test only rejects HTTP:
400 401 403
Other responses—including 404—can result in a successful connectivity test.
Therefore, a successful Test Connection confirms basic connectivity/credentials more than it confirms that each configured export endpoint is valid.
Developer Quick Reference
Base URL
https://api.donordrive.com/{instance_name}/exportAuthentication
Authorization: Bearer {api_key}HTTP methods
GET only
Schema
GET /{table}/metadata.jsonDynamic columns; all declared as strings.
Count
GET /{table}.jsonwith:
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=1Data
GET /{table}.jsonwith
lastModifiedStart={earliest_start_date} lastModifiedEnd=2999-12-31T23:59:59 pageSize=5000 page={n}Unique keys
None declared
Deletes
Not supported
Persistent incremental state
None
Retry behavior
65-second interval Up to 20 minutes 401 / 404 fail immediately
Timezone
America/New_York
Primary operational concern
Because every execution re-queries data from the configured earliest_start_date, the connector can become slower over time and may repeatedly deliver the same records. Downstream data handling should therefore account for deduplication and repeated updates.
