Server-to-server identity sync - offline (batch)
Upload identity mapping files to Taboola via S3 for cross-device resolution
Upload identity mapping files to a Taboola-managed S3 bucket on an agreed schedule. Taboola scans, validates, and ingests the files automatically, writing the identifier pairs to the identity graph for cross-device resolution.
This is the recommended server-to-server path for sharing identity data. For the real-time alternative, see Server-to-server identity sync - online (real-time).
Guidelines
- For publishers who share user identifiers with Taboola server-to-server, rather than (or in addition to) client-side.
- Best suited for high-volume integrations, offline data pipelines, or when incremental/full-refresh delivery is needed.
- All PII-derived identifiers (e.g. email) must be SHA-256 hashed before inclusion. Never send raw PII.
- Contact your Taboola account manager to begin onboarding.
Three ways to send identity data
Eids push Online sync (real-time) Offline sync (this page) Mechanism _taboola.push({eids})in the page tagSeparate HTTP pixel ( /umendpoint)S3 file upload on a schedule Delivery Part of the TRC request Separate browser call per user Bulk file transfer Volume Per-pageview (automatic) Per-pageview or per-session High volume, bulk data Update mode Immediate Immediate Incremental or full refresh Browser required Yes Yes (Taboola cookie must be present) No
Roles and responsibilities
| Taboola | Publisher (you) |
|---|---|
| Provision the S3 bucket, access credentials, upload folder, filename prefix, and file format. | Share your preferred identifier format ahead of implementation. |
| Automated file scanning, ingestion, and processing-status signaling. | Upload the identity feed according to the agreed schedule and format. |
| Confirm the target sync cadence and delivery frequency. |
How it works
- Taboola provisions an S3 bucket with credentials and a designated upload folder.
- Your server-side pipeline generates files that map your identifiers to Taboola-recognized identifiers (e.g. publisher ID to hashed email, publisher ID to device ID).
- You upload the files to the S3 bucket on the agreed schedule (e.g. daily).
- Taboola scans the folder, validates each file, and ingests valid records into the identity graph.
- Processed files move to
processed/. Rejected files move toerror/.
Companion client-side step
If you cannot or prefer not to send PII-derived identifiers (e.g. hashed email) client-side, send a pseudonymous identifier via the eids push instead. The batch file then maps that pseudonymous identifier to PII-derived values server-to-server. Taboola joins the two, resolving identity without sensitive data touching the browser.
_taboola.push({
eids: [{
source: "publisher.com",
uids: [{ id: "user-abc-123", atype: 3, ext: "ppid" }]
}]
});The ext field identifies the type of identifier being sent (e.g. "ppid" for a publisher-provided ID, "hemsha256" for a SHA-256 hashed email). Contact your Taboola account manager for the correct ext value for your use case.
See Passing first-party publisher data for the full client-side reference.
Supported identifier types
Each row in the upload file maps 2 or more identifiers together. Common identifier types include:
| Identifier type | Description | Example value |
|---|---|---|
| Publisher ID | A publisher-generated user identifier, such as a login ID or synthetic ID. | user-abc-123 |
| Hashed email (HEM) | SHA-256 hash of the user's trimmed, lowercased email. 64-character lowercase hex. | 973dfe463ec8... |
| Device ID | Mobile advertising ID: GAID (Android) or IDFA (iOS). | 60189e50-1de2-11e7-80dc-... |
| Taboola user ID | The Taboola-assigned cookie identifier, when available. | a1b2c3d4-1111-4aaa-9bbb |
The file format is fully configurable. The columns, their order, and the identifier types are all agreed during onboarding. If you need to map an identifier type not listed above, share the format and requirements with your Taboola account manager during setup.
Onboarding setup
Taboola provisions the following parameters during onboarding:
| Parameter | Description |
|---|---|
Bucket ($BUCKET) | The S3 bucket assigned to your integration. |
Upload folder ($FOLDER) | The folder path where you upload files. Must end with /. |
Filename prefix ($PREFIX) | A unique identifier prefix required on every filename. |
| Record format | The column layout and delimiter, agreed during onboarding. |
| Delivery mode | Incremental updates (new/changed records only) or full refresh (complete dataset each time). |
| Scan interval | How frequently Taboola scans for new files. |
S3 access credentials (access key and secret) are provided securely during setup.
Recommended cadence
Daily file drops are recommended. The shorter the gap between transfers, the less data is lost to cookie churn and consent changes between syncs. Daily delivery provides the freshest mapping without adding significant operational overhead.
Incremental vs full refresh
| Mode | How it works | When to use |
|---|---|---|
| Incremental (recommended) | Each file contains only new or changed identifier pairs since the last delivery. The initial file is large, but subsequent files are small. | Preferred for most integrations. Faster ingestion and processing. |
| Full refresh | Each file contains the complete set of identifier pairs. Every delivery replaces the previous dataset. | Use when your pipeline cannot track changes, or when you need to ensure the full mapping is always in sync. |
Confirm your delivery mode with your Taboola account manager during onboarding.
File format
Record structure
Files are delimiter-separated text, compressed with GZIP (.gz). The column layout is fully configurable. The most common format uses tab-delimited columns.
Example: 3-column file (publisher IDs, device IDs, hashed emails)
| Column 1 (publisher IDs) | Column 2 (device IDs) | Column 3 (hashed emails) |
|---|---|---|
pub-id-1 | device-id-1 | 973dfe463ec8... |
pub-id-2,pub-id-3 | device-id-2 | 28ca07781... |
pub-id-4 | a1b2c3d4e5... |
- Columns are separated by a delimiter character. The default is a tab (
\t). Other delimiters (e.g. comma, pipe) can be agreed during onboarding. - Multiple values within a single column are separated by commas with no spaces.
- Empty columns retain the delimiter (row 3 above has no device ID, but the delimiter is still present in the file).
- Files must not contain a header row. The column labels above are for illustration only.
Validation rules
- Every row must contain at least 2 populated identifier columns. Rows with only 1 identifier are rejected.
- Retain all delimiters for empty columns. Do not omit columns.
- No whitespace around inner-column commas (
a,bis valid;a, bis not). - Do not use sentinel values like
0ornullfor empty fields. Leave empty columns blank.
Hashing requirementEmail addresses must be trimmed, lowercased, and SHA-256 hashed before inclusion. The result must be a 64-character lowercase hex string. Do not strip dots or
+tags before hashing. See hashing examples in the client-side integration guide.
File naming and delivery
Naming convention
Every filename must start with the assigned $PREFIX and end with .gz:
$PREFIX_<date>_<sequence>.<ext>.gz
Recommended structure:
<publisher-name>_<yyyyMMdd>_<hhmmss>.<ext>.gz
When splitting large files, append an ordinal number:
PublisherName_20260820_033246_0000.tsv.gz
PublisherName_20260820_033246_0001.tsv.gz
Delivery rules
- Every filename must include the assigned
$PREFIX. - Files must end in
.gzand be valid GZIP. - The extension before
.gzcan be.tsv,.csv, or.txt, matching the agreed format. - Never reuse a filename, even after an error. Always use a unique name for resubmissions.
- Encoding: UTF-8 without BOM, LF line endings.
- Maximum compressed file size: 500 MB. Files larger than 500 MB should be split into multiple parts within the same daily drop.
- Do not upload empty files.
Processing status
Taboola evaluates and moves files automatically after processing:
| Folder | Status |
|---|---|
$FOLDER/ | Pending scan. |
processed/ | Ingestion successful. |
error/ | File rejected due to validation errors. |
Partial failure handling ingests valid records up to a configured threshold before rejecting the file. If a file lands in error/, fix the formatting issue, append a revision suffix to the filename, and upload as a new file.
Do not retry with the same filenameAutomated retries using the same filename can cause unintended rollback of consent or deletion events. Always upload resubmissions as a new, uniquely named file.
Consent and privacy
The batch path has no browser context, so Taboola cannot read consent signals (GDPR/TCF, CCPA/GPP) from the file data. You are responsible for ensuring that user consent has been obtained before including a user's identifiers in the upload file. Do not include data for users who have opted out or for whom consent is missing.
Onboarding checklist
Review and confirm the following with your Taboola account manager before setup:
| # | Item | Details |
|---|---|---|
| 1 | Test file | Share a sample file to validate format and parsing before going live. |
| 2 | Export format | What delimiter and column layout can your pipeline produce? |
| 3 | Compression | Can your pipeline output native .gz files? |
| 4 | Delivery type | Incremental updates, full refresh, or both? |
| 5 | Update logic | Do new deliveries extend previous mappings or overwrite them? |
| 6 | File volume | Estimated payload size per export. |
| 7 | ID cardinality | Expected relationship between mapped identifiers (1:1, 1:many, or many:many). 1:1 is preferred. |
| 8 | Sync cadence | Automated schedule (e.g. daily, hourly). |
| 9 | ID format | Exact format or regex of each identifier type in the feed. |
| 10 | ID persistence | Is there a TTL or expiration for the mapped relationships? |
Updated about 10 hours ago
