Overview
This guide outlines best practices for integrating with the universal data enrichment endpoint. This endpoint is designed to support transaction data acquired from an outside source, such as:- Aggregated transaction data
- Consumer transaction panel data
- Accounting software (Quickbooks, Xero, etc.)
- Dispute data
- Other external data sources
Universal data enrichment is currently in beta; request and response fields may change as the product evolves. For access, please contact sales@spade.com
Best practices
Below we’ve outlined how to send data to the universal data enrichment endpoint. Regardless of the type of data you’re sending, providing raw, unaltered data yields the best results.Sending universal data
Universal data enrichment relies primarily on two fields:description and amount.
- For the
descriptionfield, pass the transaction’s original description. - For the
amountfield, a negative value (-) indicates a credit or incoming transfer, while a positive value (+) indicates a debit or outgoing transfer.
| data source | description | amount |
|---|---|---|
| Plaid (docs) | original_descriptionNote: when calling /transactions/sync set the flag options.include_original_descritptionto trueAlternatively use the name field if original_description is not available | amount |
| MX (docs) | original_description | amount set amount to (-) if type is CREDIT |
| Mastercard Open Banking (docs) | description | amountset amount to (-) if type is CREDIT |
| Yodlee (docs) | description.original | amountset amount to (-) if baseType is CREDIT |
| Akoya (docs) | description | amountwhen balanceTypeis LIABILITYset amount to (-) |
| Quiltt (docs) | description | amountset amount to (-) if entryType is CREDIT |
If your data source is not listed here, please work with your Spade team to help map your data to the required fields
currencyCode- the currency of the transaction, e.g., USD.userId— associated with a user or organization; used for recurrence, category, and counterparty personalization.occurredAt— the timestamp of the transaction in date-time format.transactionId— required for batch enrichment and recommended for all integrations to associate with your internal transaction identifier.
Batch vs real-time
We support enriching individual or multiple transactions via API:- For real-time enrichment, use the
/transactions/universal/enrichendpoint. - For non-real-time enrichment, use the
/batches/transactions/universal/enrichendpoint. This endpoint supports up to 50,000 transactions at once.
For best practices on sending transactions in batches, see our batch enrichment guide.
Example request and response
Below we’ve provided an example request to the/transactions/universal/enrich endpoint:
Error handling
The most common errors result from missing required fields. In a400 response, we return specific details needed to reprocess the request.
