Tech Partners: DDx Exchange as a Destination
Overview
This section covers information about Interactions API requests with the DDx Exchange's endpoint as a destination for Interactions API data.
Interactions App
Check out our Set Up for Sources section if you do not already have an Interactions API App required for sending data to the DDx Exchange.
Validating DDx API Key configuration
The /v1/auth/me endpoint enables two things:
- Confirmation that you're using your API key correctly and can authenticate to the API
- The ability to confirm the API Key's associated Workspace, Source and Destination details.
Additional API Request Validation
Interactions API requests using an API key configured with DDx Exchange as a Destination are subjected to additional validation. See below.
Interactions API requests using an API key configured with DDx Exchange as a Destination are subjected to additional validation. This includes:
- Interactions matched and unmatched to a voter file now may be assessed for credits. For voter file-matched interactions, the
personarray must include at least one object withtypeofdwid,voterbase_id,smartvan_vanid,votebuilder_vanidorav_vanid. If an interaction is not matched to a voter file, the interaction must include at least one object in thepersonarray and some form of PII. PII may be included inchannelwith atypeofphone_number,address,email, orsocial_handle, or within thecontactInfoobject. For voter file-unmatched interactions, PII must be submitted or they will be considered unsupported. - All survey response
outcomesDetailedobjects (indicated by the "survey_response"type) must includequestionIdandresponseId. These must be valid VAN survey question and response IDs and must be integers if Exchange is a Destination. - All survey response
outcomesDetailedobjects (indicated by the "survey_response"type) must includequestionTextandresponseText. These should be the full text of the question and response, respectively. - All event signup
outcomesDetailedobjects (indicated by the "event_signup"type) must include anevent_idobject
and astatusobject with a validstatus. deleteoperations within an interaction will not be sent to the Exchange; these are unsupported. Other parts of the same interaction withoutcomesDetailed.operation=createwill still be submitted to the Exchange.
An example request can be found on the API Examples page (Scenario 3). Note its person array uses none of the types above, so as written it would not be assessed for credits.
How is data mapped to the DDx Exchange schema?
The table below describes how data on the Interactions API request is mapped to the format accepted by the DDx Exchange. Currently, language and is_cell fields are not supported and will always be reported to the Exchange as null.
Dispositions
| Interactions API | Exchange Schema | Notes |
|---|---|---|
interaction.person.id | person_id | The Exchange accepts the following types for voter file-matched dispositions: TargetSmart’s voterbase_id, Catalist’s dwid, SmartVAN’s smartvan_vanid, AV’s VAN ID av_vanid, and Votebuilder VAN ID votebuilder_vanid. |
interaction.person.type | person_id_type | Accepted values: dwid, voterbase_id, smartvan_vanid, votebuilder_vanid, or av_vanid |
interaction.method | contact_type_name | |
interaction.outcome | contact_result_name | |
interaction.attemptDateTime | datetime_canvassed | |
interaction.stateCode | state_code | |
interaction.channel.value | phone_number | Only populated when channel.type = "phone_number" |
outcomesDetailed[type=notes].value | notes |
Survey Responses
| Interactions API | Exchange Schema | Notes |
|---|---|---|
interaction.person.id | person_id | The Exchange accepts the following types for voter file-matched survey responses: TargetSmart’s voterbase_id, Catalist’s dwid, SmartVAN’s smartvan_vanid, AV’s VAN ID av_vanid, and Votebuilder VAN ID votebuilder_vanid. |
interaction.person.type | person_id_type | Accepted values: dwid, voterbase_id, smartvan_vanid, votebuilder_vanid, or av_vanid |
interaction.method | contact_type_name | |
interaction.outcome | contact_result_name | |
interaction.attemptDateTime | datetime_canvassed | |
interaction.stateCode | state_code | |
outcomesDetailed[type=survey_response].value.questionId | survey_question_id | Must be an integer |
outcomesDetailed[type=survey_response].value.responseId | survey_question_response_id | Must be an integer |
Survey Response Metadata
| Interactions API | Exchange Schema | Notes |
|---|---|---|
interaction.stateCode | state_code | |
outcomesDetailed[type=survey_response].value.questionId | survey_question_id | Must be an integer |
outcomesDetailed[type=survey_response].value.questionText | survey_question_text | |
outcomesDetailed[type=survey_response].value.responseId | survey_question_response_id | Must be an integer |
outcomesDetailed[type=survey_response].value.responseText | survey_response_text |
Unmatched Dispositions
| Interactions API | Exchange Schema | Notes |
|---|---|---|
interaction.person | person_ids | The entire person object for an interaction that does not contain one or more of:dwid, voterbase_id, smartvan_vanid, votebuilder_vanid, or av_vanid |
interaction.method | contact_type_name | |
interaction.outcome | contact_result_name | |
interaction.attemptDateTime | datetime_canvassed | |
interaction.stateCode | state_code | |
outcomesDetailed[type=notes].value | notes | |
interaction.contactInfo + interaction.channel.[type].value | pii | channel is added to the contactInfo object and becomes pii when the interaction.channel.type is one of: phone_number, address, social_handle, email. |
Unmatched Survey Responses
| Interactions API | Exchange Schema | Notes |
|---|---|---|
interaction.person | person_ids | The entire person object for an interaction that does not contain one or more of:dwid, voterbase_id, smartvan_vanid, votebuilder_vanid, or av_vanid |
interaction.method | contact_type_name | |
interaction.outcome | contact_result_name | |
interaction.attemptDateTime | datetime_canvassed | |
interaction.stateCode | state_code | |
outcomesDetailed[type=survey_response].value.questionId | survey_question_id | Must be an integer |
outcomesDetailed[type=survey_response].value.questionText | survey_question_text | |
outcomesDetailed[type=survey_response].value.responseId | survey_question_response_id | Must be an integer |
outcomesDetailed[type=survey_response].value.responseText | survey_response_text | |
interaction.contactInfo + interaction.channel.[type].value | pii | channel is added to the contactInfo object and becomes pii when the interaction.channel.type is one of: phone_number, address, social_handle, email. |
Fetching DDx Exchange transactional logs
Status and logs regarding integration with the DDx Exchange can be fetched three ways:
- By date, using the endpoint described here. The date range is capped at 30 days, and results are paginated (100 per page by default, 1000 maximum).
- By
interactionId, which can be found underacceptedInteractions.data[].interactionIdinPOST /interactionsresponses, using the endpoint described here. - By
correlationId, the batch identifier returned in everyPOST /interactionsresponse and theX-Correlation-Idheader.
Questions about Exchange as a Destination?For questions about sending data to the DDx Exchange please reach out to us at [email protected]!
Updated 26 days ago

