Execution Request
Adobe sends the execution request to your service when an entity (person, account, or person-in-account) reaches your External Action step in a journey or campaign flow.
Endpoint
Your service must implement:
Method: POST /submitAsyncAction
Request Structure
{
"token": "string",
"callbackUrl": "string",
"context": {
"subscription": {...},
"journey": {...},
"admin": {...}
},
"objectData": {
"objectType": "string",
"objectContext": {...},
"flowStepContext": {...}
},
"actionConfig": {...},
"customHeaders": {...},
"enableSplitPaths": boolean
}
Required Fields
Field
Type
Description
tokenstring
Encrypted correlation token for callback authentication. Must be sent back in
X-Callback-Token header when calling the callback URL.callbackUrlstring
Adobe endpoint to POST callback results
objectDataobject
Entity data with type discriminator
objectData.objectTypestring
Entity type:
lead, account, or accountPersonobjectData.objectContextobject
Actual entity data
Optional Fields
Field
Type
Description
contextobject
Contains subscription, journey, and admin context data
objectData.flowStepContextobject
Flow-specific attributes defined in
invocationPayloadDef.flowAttributesactionConfigobject
Action-specific configuration (timeout in minutes, split paths)
customHeadersobject
Custom headers defined in service definition
enableSplitPathsboolean
Enable path condition accessor collection (default: false)
Context Data
data-orientation=horizontal
data-slots=heading, content
data-repeat=3
Subscription Context
{
"subscription": {
"prefix": "customer-prefix",
"imsOrgId": "org-id@AdobeOrg",
"instanceName": "prod-instance",
"munchkinId": "123-ABC-456"
}
}
| Table | |
|---|---|
| Field | Description |
prefix |
Customer instance prefix |
imsOrgId |
Adobe IMS Organization ID |
instanceName |
Instance name |
munchkinId |
Marketo Munchkin ID |
Journey Context
{
"journey": {
"id": "journey-123",
"name": "Q4 Campaign",
"status": "Live",
"startDate": "2025-10-01T00:00:00Z",
"endDate": "2025-12-31T23:59:59Z"
}
}
| Table | |
|---|---|
| Field | Description |
id |
Journey identifier |
name |
Journey name |
status |
Journey status (Draft, Live, Completed) |
startDate |
Journey start date |
endDate |
Journey end date |
Admin Context
This contains global configuration data defined by invocationPayloadDef.globalAttributes and is configured by admins.
{
"admin": {
"apiKey": "service-api-key",
"tenantId": "tenant-123",
"region": "US"
}
}
Object Data by Entity Type
data-orientation=horizontal
data-slots=heading, content
data-repeat=3
Lead Entity
{
"objectData": {
"objectType": "lead",
"objectContext": {
"leadId": "12345",
"leadData": {
"email": "john@example.com",
"firstName": "John",
"lastName": "Doe",
"company": "Acme Corp",
"title": "VP Sales"
}
},
"flowStepContext": {
"campaignId": "campaign-456",
"source": "webinar"
}
}
}
| Table | ||
|---|---|---|
| Field | Requirement | Description |
leadId |
Required | Adobe system identifier |
leadData |
Required | Contains fields defined in invocationPayloadDef.fields |
flowStepContext |
Optional | Contains values for invocationPayloadDef.flowAttributes |
Account Entity
{
"objectData": {
"objectType": "account",
"objectContext": {
"accountId": "67890",
"accountData": {
"accountName": "Acme Corporation",
"industry": "Technology",
"revenue": 1000000,
"employees": 5000,
"website": "https://acme.com"
}
},
"flowStepContext": {
"priority": "high"
}
}
}
| Table | ||
|---|---|---|
| Field | Requirement | Description |
accountId |
Required | Adobe system identifier |
accountData |
Required | Contains fields defined in invocationPayloadDef.accountFields |
AccountPerson Entity
{
"objectData": {
"objectType": "accountPerson",
"objectContext": {
"accountId": "67890",
"accountData": {
"accountName": "Acme Corporation",
"industry": "Technology"
},
"accountPersonRelationships": [
{
"accountPersonRelId": 111,
"accountId": 67890,
"personId": 12345,
"mktoGuid": "guid-123",
"isEmployee": true,
"leadData": {
"email": "john@acme.com",
"firstName": "John",
"title": "VP Sales"
},
"relationshipMetadata": {
"role": "decision-maker",
"influence": "high"
}
}
]
},
"flowStepContext": {
"accountScore": "enterprise"
}
}
}
Item
Description
Data model
Combines account-level data with multiple person relationships
Person payload
Each person has their own
leadDataRelationship context
relationshipMetadata provides account-person relationship contextIDs
All relationship IDs are required
Action Configuration
{
"actionConfig": {
"timeout": 60,
"pathConfig": [
{
"pathId": "highValue",
"pathDefinition": [
{
"accessor": "score",
"operator": "greaterThanOrEqual",
"values": ["80"]
}
]
},
{
"pathId": "standard",
"pathDefinition": []
}
]
}
}
Fields
Field
Type
Description
timeoutinteger
Maximum processing time in minutes
pathConfigarray
Split path configuration when
enableSplitPaths: truepathConfig[].pathIdstring
Unique identifier for the path
pathConfig[].pathDefinitionarray
Condition definitions (
accessor, operator, values)pathConfig[].pathDefinition (empty array)array
Marks the default path
Custom Headers
Headers are defined in invocationPayloadDef.headers with configured values.
{
"customHeaders": {
"X-Custom-Header": "value",
"X-Tenant-ID": "tenant-123"
}
}
Enable Split Paths
Indicates whether split path decisioning is enabled. When true, your callback should include accessorValues for journey routing.
{
"enableSplitPaths": true
}
Complete Example
Request
{
"token": "abc123xyz789",
"callbackUrl": "https://adobe.com/callback/abc123",
"context": {
"subscription": {
"prefix": "acme-prod",
"imsOrgId": "12345@AdobeOrg",
"instanceName": "production",
"munchkinId": "123-ABC-456"
},
"journey": {
"id": "journey-q4-2025",
"name": "Q4 2025 Enterprise Campaign",
"status": "Live",
"startDate": "2025-10-01T00:00:00Z",
"endDate": "2025-12-31T23:59:59Z"
},
"admin": {
"apiKey": "sk_live_abc123...",
"region": "US",
"dataCenter": "east"
}
},
"objectData": {
"objectType": "lead",
"objectContext": {
"leadId": "12345",
"leadData": {
"email": "john.doe@acme.com",
"firstName": "John",
"lastName": "Doe",
"company": "Acme Corporation",
"title": "VP of Sales",
"phone": "+1-555-0100"
}
},
"flowStepContext": {
"campaignId": "campaign-456",
"source": "webinar-registration",
"enrichmentType": "professional"
}
},
"actionConfig": {
"timeout": 60,
"pathConfig": [
{
"pathId": "highValue",
"pathDefinition": [
{
"accessor": "enrichmentScore",
"operator": "greaterThanOrEqual",
"values": ["80"]
}
]
},
{
"pathId": "lowValue",
"pathDefinition": [
{
"accessor": "enrichmentScore",
"operator": "lessThan",
"values": ["80"]
}
]
},
{
"pathId": "default",
"pathDefinition": []
}
]
},
"customHeaders": {
"X-Tenant-ID": "acme-prod",
"X-Request-Source": "AJO"
},
"enableSplitPaths": true
}
Response
Your service should respond with HTTP 200 to acknowledge receipt:
{
"requestId": "req-12345",
"status": "accepted",
"message": "Request accepted for processing"
}
Then, process asynchronously and send the results to callbackUrl.
Best Practices
- Store token: Save it to include in the X-Callback-Token header when calling back
- Respect timeout: Complete processing within configured timeout
- Handle missing fields: Not all optional fields will be present
- Echo secondary IDs: Must be included in callback if present
- Process asynchronously: Don't block the response
- Use provided context: Leverage subscription/journey data for logging/routing
- Secure your endpoint: Implement authentication/authorization
Error Handling
If your service cannot accept the request:
{
"error": {
"code": "INVALID_REQUEST",
"message": "Missing required field: email"
}
}
HTTP status codes:
200: Request accepted400: Invalid request (malformed)401: Unauthorized500: Internal server error