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
Subscription Context
{
"subscription": {
"prefix": "customer-prefix",
"imsOrgId": "org-id@AdobeOrg",
"instanceName": "prod-instance",
"munchkinId": "123-ABC-456"
}
}
Field
Description
prefixCustomer instance prefix
imsOrgIdAdobe IMS Organization ID
instanceNameInstance name
munchkinIdMarketo 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"
}
}
Field
Description
idJourney identifier
nameJourney name
statusJourney status (Draft, Live, Completed)
startDateJourney start date
endDateJourney 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
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"
}
}
}
Field
Requirement
Description
leadIdRequired
Adobe system identifier
leadDataRequired
Contains fields defined in
invocationPayloadDef.fieldsflowStepContextOptional
Contains values for
invocationPayloadDef.flowAttributesAccount Entity
{
"objectData": {
"objectType": "account",
"objectContext": {
"accountId": "67890",
"accountData": {
"accountName": "Acme Corporation",
"industry": "Technology",
"revenue": 1000000,
"employees": 5000,
"website": "https://acme.com"
}
},
"flowStepContext": {
"priority": "high"
}
}
}
Field
Requirement
Description
accountIdRequired
Adobe system identifier
accountDataRequired
Contains fields defined in
invocationPayloadDef.accountFieldsAccountPerson 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