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
token
string
Encrypted correlation token for callback authentication. Must be sent back in X-Callback-Token header when calling the callback URL.
callbackUrl
string
Adobe endpoint to POST callback results
objectData
object
Entity data with type discriminator
objectData.objectType
string
Entity type: lead, account, or accountPerson
objectData.objectContext
object
Actual entity data

Optional Fields

Field
Type
Description
context
object
Contains subscription, journey, and admin context data
objectData.flowStepContext
object
Flow-specific attributes defined in invocationPayloadDef.flowAttributes
actionConfig
object
Action-specific configuration (timeout in minutes, split paths)
customHeaders
object
Custom headers defined in service definition
enableSplitPaths
boolean
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 leadData
Relationship context
relationshipMetadata provides account-person relationship context
IDs
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
timeout
integer
Maximum processing time in minutes
pathConfig
array
Split path configuration when enableSplitPaths: true
pathConfig[].pathId
string
Unique identifier for the path
pathConfig[].pathDefinition
array
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

  1. Store token: Save it to include in the X-Callback-Token header when calling back
  2. Respect timeout: Complete processing within configured timeout
  3. Handle missing fields: Not all optional fields will be present
  4. Echo secondary IDs: Must be included in callback if present
  5. Process asynchronously: Don't block the response
  6. Use provided context: Leverage subscription/journey data for logging/routing
  7. 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: