Overview
The Raiser’s Edge connector syncs data from Blackbaud Raiser’s Edge NXT (via the SKY API) into your data warehouse.
It pulls:
Constituents and their contact info
Gifts, funds, campaigns, appeals and packages
Opportunities and fundraiser assignments
Event records and event participants
Key constituent flags via the SKY Query APIs (no-valid-address, solicit codes, etc.)
The connector is read-only and does not write anything back to Raiser’s Edge.
Authentication
The connector uses the SKY API OAuth2 flow:
OAuth base URL:
https://oauth2.sky.blackbaud.com/API base URL:
https://api.sky.blackbaud.com/
You’ll need:
A SKY API application configured in Blackbaud’s developer portal
Client ID / client secret
An access token and refresh token with permissions to the endpoints listed below
Tokens are passed in HTTP headers on each request; the connector handles refreshing when tokens expire.
High-level Sync Strategy
Streams / tables
The connector exposes the following logical tables:
actionsaddressesappealsappeals_custom_fieldscampaignsconstituent_addressee_and_salutationconstituent_codesconstituent_custom_fieldsconstituent_no_valid_addressconstituent_requests_no_emailconstituent_solicit_codesconstituentseducationsemail_addressesevent_participantseventsfundraiser_assignmentsfundsgift_custom_fieldsgiftsmembershipsnotesonline_presencesopportunitiespackagesphonesrelationships
Each of these tables has a configured set of columns defined in table_endpoint_index inside the connector. This schema is what gets written out during discovery.
Discovery
When you run discover:
The connector loops through every configured stream name.
It inspects the column definitions and, if there is an
idfield, marks it as the unique key.It emits the full JSON schema for that table to the catalog.
It also writes initial state for each stream:
membershipsstarts at1754-01-01 00:00:00All other tables start at
0001-01-01 00:00:00
These last_started timestamps are later used as the starting point for incremental syncs.
Incremental vs truncate-and-reload
There are two main sync patterns:
Standard API endpoints
For most tables (e.g.,constituents,gifts,addresses, etc.), the connector calls the corresponding SKY API “list” endpoints (likeconstituent/v1/constituents) and uses date fields such asdate_modifiedordate_addedto advance the state watermark.Query-based tables (SKY Query API)
For these four logical tables:constituent_solicit_codesconstituent_addressee_and_salutationconstituent_no_valid_addressconstituent_requests_no_email
the connector uses the SKY Query API instead of standard list endpoints:
It discovers the numeric query type ID from
query/querytypes.It looks up node IDs and field IDs for each configured column (
nodeandfieldNamein the config).It then runs a query instance and streams the results.
For query-based tables, every sync is a truncate-and-reload:
$this->singer->writeTableAction($table, 'truncate');
``` :contentReference[oaicite:11]{index=11}
However, the query itself usually filters on **“Constituent Date Last Changed”** (`date_modified` column) so you can still think of it as time-bounded by that date in practice.
Deceased / inactive flags
Several tables include configuration flags:
has_deceasedonconstituentshas_inactiveon:constituentsaddressesemail_addressesonline_presencescampaignsappealspackagesfundsopportunitiesevents
The connector uses these flags to include or exclude deceased or inactive records via the corresponding query parameters in SKY API calls.
Custom sync methods
Two tables are not simple list calls; they use custom logic:
fundraiser_assignmentsEndpoint:
fundraising/fundraisers/typesMethod:
syncFundraiserAssignments(walks assignment data across funds, campaigns, and appeals).
event_participantsEndpoint:
event/eventlistMethod:
syncEventParticipantsFor each event, the connector calls the participants endpoint and flattens the participant data into the
event_participantstable.
Because these are composed from multiple underlying calls, they behave more like snapshot tables (data refreshed on each run) instead of purely incremental feeds.
Timeouts and retries
Default HTTP timeout: 600 seconds.
The connector keeps an internal timeout counter and will log/handle timeouts gracefully (exact retry behavior is implemented in the shared HTTP helper).
In practice, for very large datasets we recommend shorter sync windows (e.g., smaller date ranges or more frequent runs) to avoid long-running queries.
Deletes
The connector does not implement incremental deletes:
If a record is deleted in Raiser’s Edge, it will not be explicitly deleted from your warehouse by this connector.
To reflect deletes, you will need:
Either a downstream soft-delete strategy, or
Periodic full reloads (truncate & re-sync) of specific tables.
Supported Tables and Endpoints
Below is a reference of each logical table, what it represents, and how it’s populated.
Constituent-centric tables
constituents
Description: Core constituent profile records (individuals and organizations).
Endpoint:
constituent/v1/constituentsIncludes fields like: name parts, lookup ID, marital status, age, birthdate, deceased flag and date, fundraiser status, online presence, email and phone info, etc.
Special:
has_deceased,has_inactiveflags used to include/exclude filtered segments.
addresses
Description: Postal addresses for constituents.
Endpoint:
constituent/v1/constituents/{id}/addresses(viaendpoint_call=addresses).Includes: formatted address, address lines, city, state, postal code, country, seasonal dates, do-not-mail, inactive, start/end dates, etc.
email_addresses
Description: Email addresses per constituent.
Endpoint:
constituent/v1/constituents/{id}/emailaddressesIncludes: address, do-not-email flag, primary flag, inactive, timestamps.
phones
Description: Phone numbers per constituent.
Endpoint:
constituent/v1/constituents/{id}/phonesIncludes: number, type, do-not-call flag, primary flag, inactive, timestamps.
online_presences
Description: Online presence / social handles for each constituent.
Endpoint:
constituent/v1/constituents/{id}/onlinepresencesIncludes: address (e.g., URL or handle), type, primary, inactive, timestamps.
memberships
Description: Membership records associated with constituents.
Endpoint:
constituent/v1/constituents/{id}/membershipsIncludes: category, program, standing, subcategory, membership dates, dues (JSON), member list (JSON).
Initial state: older “start” date than other tables (
1754-01-01).
educations
Description: Education history for constituents.
Endpoint:
constituent/v1/constituents/{id}/educationsIncludes: school, campus, degrees, majors/minors, class year, GPA, status, dates entered/left/graduated, etc.
actions
Description: Interactions/actions (meetings, calls, tasks) tied to constituents and opportunities.
Endpoint:
constituent/v1/constituents/{id}/actionsIncludes: dates, description, status, direction, start/end times, outcome, priority, associated opportunity, and fundraiser assignments (JSON list).
notes
Description: General notes recorded on constituents.
Endpoint:
constituent/v1/constituents/{id}/notes
relationships
Description: Relationships between constituents (spouse, business, organization contact, etc.).
Endpoint:
constituent/v1/constituents/{id}/relationshipsIncludes: relation ID, reciprocal relationship, organization contact flags, spouse flag, position, dates, comments.
constituent_custom_fields
Description: Custom fields stored on constituents.
Endpoint:
constituent/v1/constituents/customfieldsIncludes: category, value, date, comments, parent ID, type.
constituent_codes
Description: Constituent code assignments (e.g. “Board Member”, “Alumnus”).
Endpoint:
constituent/v1/constituents/constituentcodesIncludes: description, start/end dates, inactive flag, sequence, etc.
Fundraising structure
campaigns
Description: Campaign records.
Endpoint:
fundraising/v1/campaignsIncludes: category, description, lookup ID, start/end dates, goals, inactive flag.
appeals
Description: Appeal records under campaigns.
Endpoint:
fundraising/v1/appeals
packages
Description: Packages (segments/mailings) under appeals.
Endpoint:
fundraising/v1/packages
funds
Description: Fund records (program/fund designations).
Endpoint:
fundraising/v1/funds
Gifts & opportunities
gifts
Description: Gift/pledge records including splits, acknowledgements, and recurring schedules.
Endpoint:
gift/v1/giftsIncludes: amount, balance, batch, post status, gift code and type, gift splits, soft credits, fundraisers, receipts, schedules, and various status fields.
gift_custom_fields
Description: Custom fields on gifts.
Endpoint:
gift/v1/gifts/customfields
opportunities
Description: Major gift or opportunity records.
Endpoint:
opportunity/v1/opportunitiesIncludes: ask amount/date, expected and funded amounts/dates, campaign, fund, purpose, status, linked gifts, fundraisers, deadline, etc.
fundraiser_assignments
Description: Assignments of fundraisers to constituents, campaigns, appeals, and funds (goals and time periods).
Endpoint:
fundraising/v1/fundraisers/types(with custom walker method).
Events
events
Description: Event header records.
Endpoint:
event/v1/eventlistIncludes: lookup ID, name, start/end dates and times, capacity, attendance stats, revenue, goal, percent of goal, category, etc.
event_participants
Description: Participants for each event, flattened into a single table.
Endpoint: Derived from
event/v1/eventlistviasyncEventParticipants.Includes: contact/constituent identifiers, name components, contact flags (do not call/email), participation level, RSVP and invitation status, seat info, membership and registration details, donations and revenue attributed to the participant.
Query-based helper tables
These tables are powered by the SKY Query API and are always fully refreshed:
constituent_solicit_codes
Query type:
ConstituentColumns:
constituent_id(from Constituent Information → Constituent ID)solicit_code(from Solicit Codes → Solicit Code Description)date_modified(from Constituent Information → Constituent Date Last Changed)
constituent_addressee_and_salutation
Query type:
ConstituentColumns:
constituent_idprimary_addresseeprimary_salutationdate_modified(also using Constituent Date Last Changed).
constituent_no_valid_address
Query type:
ConstituentColumns:
constituent_idno_valid_address(boolean, “No Valid Addresses?”).
constituent_requests_no_email
Query type:
ConstituentColumns:
constituent_idrequests_no_email(boolean, “Requests No Email?”).
These helper tables make it easier to create downstream segments such as “valid mailing addresses only” or “no email requests” without reproducing the SKY Query definitions.
Operational Considerations & Known Limitations
No hard deletes
Records deleted in Raiser’s Edge are not automatically removed from your warehouse data.
Plan periodic full reloads or use soft-delete logic downstream if you need to detect removals.
Query-based tables are truncate-and-reload
constituent_solicit_codes,constituent_addressee_and_salutation,constituent_no_valid_address, andconstituent_requests_no_emailare always fully refreshed.On very large databases, this can be relatively heavy; schedule these less frequently if needed.
Large datasets and timeouts
The connector uses a 600-second HTTP timeout. Long-running queries on very large tenants can hit this limit.
If you frequently see timeouts, consider:
Running syncs more frequently (smaller deltas)
Disabling rarely used streams
Splitting jobs by stream.
Membership baseline date
Memberships use a different start watermark (
1754-01-01) which effectively pulls all historical memberships on first run.
Typographical quirks in field names
Some field names reflect the exact SKY objects and may include spelling inconsistencies (for example,
memebersin themembershipsstream, oronline_presenseinconstituents).Do not “correct” these names when building SQL; use them exactly as they appear in the schema.
API permissions
Access to some streams (e.g., gifts, opportunities, query endpoints) depends on the scopes granted to your SKY API app and user.
If a stream returns errors, verify that your app and user have appropriate permissions in Blackbaud.
