Active Agent (Virtual Minds)
Push audience segment membership into the Active Agent DMP by Virtual Minds. Active Agent organises data as a Key (a “tagging attribute” / folder) that contains one or more Sub-Keys (a “targeting peculiarity” / segment). Zeotap authenticates to the Active Agent REST API, resolves the Key (creating it only on your own contract — see Managed credentials), creates the Sub-Key (with an optional CPM), then delivers membership as a TSV file over SFTP with a companion .fin marker file.
Prerequisites
What you need depends on whose Active Agent seat you deliver through. Use managed credentials is on by default, so unless you turn it off, only the first list applies.
On the platform-managed seat — the platform supplies the account, network and credentials, and you supply:
- The Attribute ID and Attribute Key of the attribute your platform operator provisioned for you (see Managed credentials)
On your own Active Agent contract (managed credentials off):
- An Active Agent account with API access
- Your Network ID — provided on the Active Agent destination; the Key and Sub-Key are provisioned on this network
- Active Agent API username and password (used to obtain an API token)
- SFTP import username and password provisioned by Active Agent (e.g. user
nw_3350) for membership file delivery - The SFTP host (default
vztd3.adition.com) and import path (default/dmp_import)
Managed credentials
When the platform operates a shared Active Agent DMP seat, an Active Agent destination shows a Use managed credentials toggle, on by default. With it on, the seat’s SFTP import bucket, network id, and the API + SFTP credentials are all supplied by the platform at run time — you only name the attribute your audiences land under. The credential and shared-seat configuration fields below are hidden while the toggle is on, and are neither required nor stored on your destination; the platform overlays its own values on every sync, journey send, and connection test.
The attribute must already exist
The managed seat is the platform operator’s own Active Agent account, shared with other customers, so Zeotap never creates a tagging attribute (Key) in it. Your destination references an attribute the operator provisioned for you:
- Attribute ID is required — ask your platform operator for the id of the attribute assigned to your workspace. Saving the destination without it is rejected, and a run that reaches delivery without one fails rather than creating anything.
- Attribute Key must be that same attribute’s key. It forms the delivered tag
{Attribute Key}.{Sub-Key}, and while Zeotap checks the key is well-formed, it cannot check that the key and the id name the same attribute. If they disagree the sync still reports success while membership does not land where you expect, so copy both values from your operator rather than typing the key by hand. - The Key-creation settings (Attribute Name, Mode, Attribute Operation, Expires in Days, Max History Entries, Min Seconds Between Tags) are hidden while the toggle is on. They only ever applied at creation time, and the managed seat creates nothing.
Sub-Keys (segments) are still created for you beneath that attribute — that is how each audience becomes a targeting peculiarity.
The billing type is fixed on the managed seat
The operator’s account is not an Active Agent admin user, and Active Agent lets non-admin accounts create only DEFAULT targeting peculiarities — every other type is rejected with Only admin users are allowed to modify peculiarities that are not of type DEFAULT. Billing Type is therefore hidden while managed credentials are on, and every segment is created as DEFAULT.
This is applied when the segment is created, not merely in the form, so a destination saved before the field was hidden (the old default was FIRST_PARTY_PERCENTAGE_BILLING) is corrected automatically rather than failing. A useful side effect: DEFAULT is a CPM-bearing type, so your CPM now takes effect — percentage billing ignored it.
Turn the toggle off to integrate your own Active Agent contract: the credential and configuration fields reappear — the four credential fields plus API Base URL, Network ID, SFTP Host and SFTP Import Path become required, the rest stay optional — Zeotap uses exactly what you enter, and it will create the Key for you when you leave Attribute ID blank.
If the platform has no managed seat configured, the toggle is not shown and you always supply your own credentials.
Authentication
Active Agent needs two credential sets: the API credentials used to obtain an API token for creating the Key and Sub-Key, and the SFTP import credentials used to deliver the membership file. These fields are only shown — and only required — when Use managed credentials is off.
| Field | Type | Required | Description |
|---|---|---|---|
| API Username | Text | Yes* | Active Agent API username used to obtain an API token via POST /auth. |
| API Password | Password | Yes* | Active Agent API password. |
| SFTP Import User | Text | Yes* | SFTP import username provisioned by Active Agent (e.g. nw_3350). |
| SFTP Import Password | Password | Yes* | SFTP import password provisioned by Active Agent. |
* Required only when Use managed credentials is off — otherwise supplied by the platform’s shared seat.
Zeotap calls POST {API Base URL}/auth with the API username and password, reads the token from the response, and sends it as an Authorization: <token> header on every subsequent API request. Note the token is passed without a Bearer prefix — Active Agent’s API rejects the prefixed form with 401 Unauthorized.
Configuration
The shared-seat fields — API Base URL, Network ID, SFTP Host, SFTP Port, and SFTP Import Path — are hidden and platform-supplied while Use managed credentials is on. The Key-creation settings (Mode, Attribute Operation, expiry, history, throttling) are hidden too, because the managed seat never creates a Key.
| Field | Type | Required | Description |
|---|---|---|---|
| API Base URL | Text | Yes* | Base URL of the Active Agent REST API. Defaults to https://api.active-agent.com/latest. |
| Network ID | Text | Yes* | The Active Agent networkId (from the Active Agent destination) that the Key and Sub-Key are provisioned on. |
| Mode | Select | No† | Tagging-attribute mode: BY_KEY (tag by attribute key) or BY_ID (tag by attribute id). Defaults to BY_KEY. |
| Attribute Operation | Select | No† | Operation applied when creating the Key: ADD or UPDATE. Defaults to ADD. |
| Expires in Days | Number | No† | Optional number of days a tagged identifier remains a member of the Key before it expires. |
| Max History Entries | Number | No† | Maximum history entries kept per identifier on the Key. Defaults to 100. |
| Min Seconds Between Tags | Number | No† | Minimum seconds between successive tags of the same identifier. Defaults to 0 (no throttling). |
| SFTP Host | Text | Yes* | Active Agent SFTP import host. Defaults to vztd3.adition.com. |
| SFTP Port | Text | No | Active Agent SFTP import port. Defaults to 22. |
| SFTP Import Path | Text | Yes* | Remote directory the membership TSV + .fin files are uploaded to. Defaults to /dmp_import. |
* Required only when Use managed credentials is off — otherwise supplied by the platform’s shared seat.
† Applied only when Zeotap creates the Key, so shown only when Use managed credentials is off.
Target Settings
These fields are set when linking an audience and can be overridden per sync. Set a default CPM on the destination and override it per audience where needed.
| Field | Type | Required | Description |
|---|---|---|---|
| Attribute Key | Text | Yes | The Active Agent Key (tagging attribute / folder) — it forms the delivered tag {Attribute Key}.{Sub-Key}. Max 32 characters, must start with a letter, letters/digits/underscore only; validated when you save and again before delivery. On the managed seat it must name the same attribute as the Attribute ID. |
| Attribute ID | Text | Yes‡ | The id of an existing Active Agent attribute to deliver into. Required with managed credentials — the shared seat never creates attributes. On your own contract, leave it blank to have the Key created from Attribute Key / Attribute Name. |
| Attribute Name | Text | No† | Display name for the Key. Defaults to the Attribute Key if left blank. Applied only when the Key is created. |
| Sub-Key | Text | Yes | The Active Agent Sub-Key (targeting peculiarity / segment). Active Agent allows only letters, digits and underscore, max 32 characters — anything else is converted to underscores when the segment is created, so the Sub-Key actually used may differ from what you type (see Segment names and Sub-Keys are adapted automatically). |
| Segment Name | Text | Yes | Targeting-peculiarity display name. Active Agent allows only letters, digits and underscore, max 64 characters — anything else is converted to underscores when the segment is created (see Segment names are adapted automatically). |
| Segment Description | Text | Yes | Targeting-peculiarity description. Required — the Active Agent API rejects an empty description. Max 255 characters. |
| Billing Type | Select | No† | FIRST_PARTY_PERCENTAGE_BILLING, DEFAULT, or FIRST_PARTY_FLAT_BILLING. Defaults to FIRST_PARTY_PERCENTAGE_BILLING. Hidden on the platform-managed seat, where DEFAULT is always used — see The billing type is fixed on the managed seat. |
| Billable | Select | No | Whether the targeting peculiarity is billable (true / false). Defaults to true. |
| CPM | Number | No | CPM in euro cents. Applies only to DEFAULT and FIRST_PARTY_FLAT_BILLING billing types — it is ignored for FIRST_PARTY_PERCENTAGE_BILLING. Set a default on the destination and override per audience sync. |
† Applied only when Zeotap creates the Key, so shown only when Use managed credentials is off.
‡ Required when Use managed credentials is on; optional on your own Active Agent contract.
Re-running a sync reuses its segment
A sync creates its segment the first time it runs and reuses it on every run after that — refreshes are delivered by the membership file, not by re-creating the segment. Active Agent allows only one segment per Sub-Key (and one per display name) within an attribute, so Zeotap checks what already exists before creating anything.
If another segment under the same attribute already uses your Segment Name, Zeotap appends the Sub-Key to make it unique rather than failing the sync — worth knowing on the platform-managed seat, where the attribute is shared and two customers can pick the same audience name. Your Sub-Key is never changed: it identifies the segment your membership is delivered into.
Segment names and Sub-Keys are adapted automatically
Active Agent accepts only letters, digits and underscore in a segment’s display name, up to 64 characters. Your Segment Name is rarely written with that in mind — in particular, turning on use the connected audience’s name fills it with the audience’s own name, which is free text.
Zeotap therefore maps the name onto the allowed characters when it creates the segment rather than failing the sync: runs of disallowed characters collapse into a single underscore, leading and trailing underscores are dropped, and the result is capped at 64 characters. Test Kairion – Q3 2026 (DE) is created as Test_Kairion_Q3_2026_DE. If nothing usable remains — a name written entirely in a non-Latin script, for example — the Sub-Key is used as the display name. The run log records the original and the adapted name.
The Sub-Key is adapted the same way, capped at its own 32-character limit: high intent is created and tagged as high_intent. It is adapted rather than rejected because a Sub-Key can come from a column, where retyping every value is not an option. The tag Zeotap delivers uses the adapted value, so the segment it creates and the segment it writes into are always the same one.
Because the Sub-Key identifies the segment, one case is refused rather than adapted: if two different Sub-Keys would collapse onto the same value — high intent and high-intent both becoming high_intent — the run fails naming both, since silently merging two audiences into one segment is not something a later check would reveal. A Sub-Key with no letters, digits or underscore at all is reported too, as there is nothing left to name a segment with.
The Attribute Key is never adapted. It must match an attribute that already exists in Active Agent, so rewriting it would point the sync at a different attribute — an invalid one is rejected when you save. Segment descriptions have no charset restriction and are truncated to Active Agent’s 255-character limit.
Per-row segments
Every field in the table above except Attribute Key, Attribute ID and Attribute Name can be taken from a column of your data instead of being fixed for the whole sync. One sync then fans out into many Active Agent segments — useful when your audience already carries the segment each profile belongs to.
To set it up, open the sync’s Destination target overrides, switch the field from Fixed value to From column, and pick the column. The switch adds a row to the sync’s field mapping (destination field sub_key), so you can also see and edit the binding — including adding a transform — in the Map fields editor.
The fixed value you leave behind is not wasted: it becomes the fallback applied to rows whose column is empty.
How Zeotap delivers it:
- Each row’s tag becomes
{Attribute Key}.{that row's Sub-Key}. The Key (folder) stays fixed for the sync — only the Sub-Key varies. - The first row to name a Sub-Key creates its targeting peculiarity, using that row’s Segment Name, Segment Description, Billing Type, Billable and CPM. Later rows with the same Sub-Key reuse it untouched. A segment is created at most once per run.
- Segment Name defaults to the Sub-Key, and Segment Description to a generated line, if neither the column nor the fixed value supplies one — the API rejects both when blank.
- A Sub-Key that breaks Active Agent’s rules (max 32 characters, alphanumeric and underscore only) is reported against the row that carries it; the rest of the batch still ships.
Limiting how many segments a run can create
Because a new Sub-Key creates a segment, binding a high-cardinality column by mistake — a user id, say — would create one segment per profile. Max distinct values per run (default 500) caps this: if a run needs to create more distinct segments than the limit allows, it fails with an error naming the field and the offending value, and no further segments are created. Set it to 0 for no limit.
Mirror mode cannot express a move between segments. A profile that moves from segment A to segment B appears in the diff as a changed row carrying only its current segment, so it is added to B but never removed from A. Rows diffed as removed correctly carry their own tag into the remove column. Prefer Add and Remove sync modes when the Sub-Key comes from a column.
Supported Operations
Sync Modes
Active Agent can be used both from audience syncs and from standard model syncs (reverse ETL). A model sync delivers segment membership the same way an audience sync does: each row’s identifiers are tagged with {Attribute Key}.{Sub-Key} in the TSV.
| Mode | Supported |
|---|---|
| Insert | Yes |
| Upsert | Yes |
| Update | Yes |
| Mirror | Yes |
| Snapshot | — |
- Insert, Upsert, and Update write each delivered row’s tag into the TSV add column, granting membership. Active Agent tags identifiers idempotently, so re-delivering an existing member is harmless.
- Mirror routes rows that left the model’s output to the remove column and everything else to the add column, keeping segment membership aligned with the model.
- Snapshot is not supported — membership is maintained incrementally; use Mirror to keep a segment in step with a model.
Model syncs must map at least one supported identifier column (see Required Mapping Fields) — rows whose mapped identifier columns are all empty are reported as row errors and skipped. The Sub-Key, segment fields, and CPM can be fixed on the destination, overridden per sync, or taken from a column exactly as with audience syncs.
Audience Sync Modes
| Mode | Supported |
|---|---|
| Add | Yes |
| Remove | Yes |
| Mirror | Yes |
| Upsert | — |
- Add writes each member identifier’s tag into the TSV add column, granting membership.
- Remove writes each member identifier’s tag into the TSV remove column, revoking membership.
- Mirror re-delivers the full snapshot; rows marked as
removedin the diff go to the remove column, all others to the add column, so the segment reflects current membership.
Features
- Field Mapping: Yes — map your warehouse columns to
maid,aaid,idfa,idfv,email,id5,netid,utiq,adition_cookie,adition_id, orid_type - Schema Introspection: No
Required Mapping Fields
At least one identifier must be mapped for every sync:
| Field | Description |
|---|---|
adition_id | The native ADITION / Active Agent identifier. Satisfied by adition_cookie, aaid, idfa, idfv, maid, email, id5, netid, or utiq as alternatives. The ADITION ids are captured into your data by the Active Agent cookie-sync integration; prefer them or the typed device ids over the generic maid — their ID-TYPE code is filled in automatically. |
Default Destination Fields
Each identifier carries a numeric ID-TYPE code that Zeotap fills into the TSV automatically (see ID-TYPE codes). Prefer the typed device fields (aaid / idfa / idfv) over the generic maid so the type is set for you.
| Field | Type | Auto ID-TYPE | Description |
|---|---|---|---|
maid | String | (blank) | Generic mobile advertising id (raw IDFA or GAID). Ambiguous, so the type is left blank — use aaid / idfa / idfv to set it. |
aaid | String | 4 | Android Advertising ID (GAID). |
idfa | String | 5 | iOS Identifier for Advertisers. |
idfv | String | 17 | iOS Identifier for Vendors. |
email | String | (blank) | Email address identifier (no numeric type). |
id5 | String | 15 | ID5 universal identifier. |
netid | String | 13 | netID European identifier. |
utiq | String | 40 | Utiq (TrustPid) identifier. |
adition_cookie | String | 3 | ADITION cookie identifier (stable id). |
adition_id | String | 3 | Native ADITION / Active Agent identifier (stable id). |
id_type | String | — | Optional explicit numeric ID-TYPE value. Overrides the auto-derived code. |
ID-TYPE codes
Active Agent identifies each USER-ID by a numeric type code. Zeotap fills the TSV ID-TYPE column automatically when a row carries a single, unambiguous identifier type. Map id_type explicitly to send any other code, or to override the derived value.
| Code | Identifier |
|---|---|
| 3 | ADITION |
| 4 | AAID (Android) |
| 5 | IDFA (iOS) |
| 13 | netID |
| 15 | ID5 |
| 17 | IDFV |
| 40 | Utiq |
If a row mixes identifier types (for example a generic maid alongside an id5), the values are still joined into the USER-ID but the ID-TYPE is left blank, because one numeric code cannot describe a heterogeneous list.
How It Works
The integration runs in three steps.
-
Authenticate. Zeotap calls
POST {API Base URL}/authwith your API username and password and stores the returned API token. -
Resolve the Key and create the Sub-Key. If an Attribute ID is supplied it is used as-is. Otherwise — only possible on your own Active Agent contract, since managed destinations must supply one — Zeotap creates the Key via
POST /tagging-attributes(using the Attribute Key, name, mode, operation, and any TTL / history settings) and reads back the attribute id. It then creates the Sub-Key (segment) viaPOST /targeting-peculiarities/with the segment name, description, billing type, and — forDEFAULTorFIRST_PARTY_FLAT_BILLING— the CPM in euro cents. -
Deliver membership over SFTP. Zeotap builds a tab-separated file with one row per member:
<USER-ID> <TAGS-TO-ADD> <TAGS-TO-REMOVE> <ID-TYPE>- USER-ID — the mapped identifiers joined with commas in a canonical unstable→stable order: device ids (
maid/aaid/idfa/idfv) first, thenemailand the universal ids (id5/netid/utiq), then the stableadition_cookie/adition_idrightmost. - The tag is
{Attribute Key}.{Sub-Key}. It lands in the add column for add/mirror syncs and the remove column for remove syncs (or mirror rows diffed as removed). - ID-TYPE — an explicitly mapped
id_typeif provided; otherwise the code auto-derived when the row carries a single, unambiguous identifier type (see ID-TYPE codes); otherwise blank. Rows that mix identifier types are left blank to avoid mislabeling.
The file is uploaded to the SFTP import path, followed by an empty
.finmarker file of the same base name that signals the upload is complete and ready to process. - USER-ID — the mapped identifiers joined with commas in a canonical unstable→stable order: device ids (
Troubleshooting
Connection test fails at “Authenticate with the Active Agent API”
The API username or password is incorrect, or the API Base URL is wrong. The error names which credential set was used, and that decides the fix:
- “this destination’s own Active Agent credentials” — the destination is not using the platform-managed seat (the toggle is off, or the destination predates it). Correct the API username and password on the destination, or turn Use managed credentials on to deliver through the platform’s seat instead.
- “the platform-managed Active Agent seat credentials” — nothing on your destination can fix this; report it to your platform operator, whose seat credentials need rotating.
Also verify the base URL is https://api.active-agent.com/latest (or the value provided by Active Agent). The test does not check the SFTP credentials — those are validated at the first sync.
Sync fails creating the tagging attribute (Key)
This applies to your own Active Agent contract only — the managed seat never creates a Key. The Attribute Key must be at most 32 characters, alphanumeric and underscore only, and start with a letter. Confirm the Network ID is correct and that your account may create attributes on it. To reuse an existing Key instead of creating one, set the Attribute ID target field.
Segment creation fails with “Only admin users…”
Only admin users are allowed to modify peculiarities that are not of type DEFAULT means the Active Agent account creating the segment is not an admin user, and Active Agent restricts non-admin accounts to the DEFAULT billing type. This cannot happen on the platform-managed seat, which always sends DEFAULT. On your own Active Agent contract, set Billing Type to DEFAULT, or ask Active Agent to grant your account admin rights if you need FIRST_PARTY_PERCENTAGE_BILLING or FIRST_PARTY_FLAT_BILLING.
Sync fails creating the targeting peculiarity (Sub-Key)
The Segment Description cannot be empty — the API rejects a blank description. Also confirm the Sub-Key (max 32 chars) and Segment Name (max 64 chars) use only alphanumeric and underscore characters.
CPM not reflected on the segment
CPM applies only to the DEFAULT and FIRST_PARTY_FLAT_BILLING billing types and is ignored for FIRST_PARTY_PERCENTAGE_BILLING. Set the Billing Type accordingly and ensure the CPM is provided in euro cents (an integer). If you set a CPM with percentage billing, it is skipped and a warning is logged.
SFTP upload fails
On your own Active Agent contract, verify the SFTP Import User and Password, the SFTP Host (default vztd3.adition.com), the port (default 22), and the import path (default /dmp_import), and confirm the account may write to that directory. On the platform-managed seat all of those are supplied by the platform, so an SFTP failure is not something you can fix from the destination — report it to your platform operator.
Membership does not appear in Active Agent
Active Agent processes the TSV only after the companion .fin marker file is present. Zeotap uploads both, but if the TSV lands without its marker (for example after a partial failure) the file is ignored. Re-run the sync to deliver a fresh file pair.
Attribute ID is required when using platform-managed credentials
The destination (or the sync overriding it) delivers through the platform’s shared Active Agent seat but names no existing attribute. Zeotap will not create a tagging attribute in the operator’s account, so ask your platform operator for the Attribute ID provisioned for your workspace and enter it — together with that attribute’s Attribute Key.
Membership is delivered but the segment stays empty
Check that the Attribute Key is the key of the attribute your Attribute ID names — Zeotap cannot verify the pair, and a tag naming an attribute that does not exist does not take effect, so a mismatch produces a successful sync with no membership. Pre-create the key and sub-key in Active Agent / ADITION if you are on your own contract; on the managed seat, confirm both values with your platform operator.
Row missing a supported identifier
The row carries no non-empty value in any of maid, aaid, idfa, idfv, email, id5, netid, utiq, adition_cookie, or adition_id. A row needs only one of them — an empty column is simply skipped as long as another identifier is present. The error lists the columns the row actually carried (row columns: [...]), so compare that list against the identifier names: if your identifier column appears there, its values are empty for those rows; if it doesn’t, the mapping isn’t producing the canonical field name. Ensure your model output or field mapping exposes at least one supported identifier column with non-empty values for every row.