Docs / Strand / nodes/connector-outputs
Connector Output Structure
All connectors in Strand return a standardized output structure, making it easy to build reliable workflows that work consistently across different services.
Standard Response Format
Every connector returns data in this format:
json
{
"success": true,
"status": "completed",
"data": {
// Service-specific response data
},
"service": "aws.sqs",
"operation": "send_message"
}
Fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Whether the operation completed successfully |
status |
string | Normalized status code (see below) |
data |
object | Service-specific response data |
service |
string | Service identifier (e.g., aws.s3, http, mqtt) |
operation |
string | Operation performed (e.g., send_message, GET, publish) |
Status Values
| Status | Meaning |
|---|---|
completed |
Operation finished successfully |
sent |
Message/event was sent successfully |
uploaded |
File/object was uploaded |
downloaded |
File/object was downloaded |
received |
Message was received from a queue |
empty |
Queue poll returned no messages |
invoked |
Async invocation was triggered |
not_found |
Resource doesn't exist (for get operations) |
failed |
Operation failed (check error details) |
Accessing Response Data
Check Success
jinja2
{% if payload.success %}
Operation succeeded!
{% else %}
Operation failed with status: {{ payload.status }}
{% endif %}
Access Service-Specific Data
jinja2
{# HTTP response body #}
{{ payload.data.response.body }}
{# SQS message ID #}
{{ payload.data.message_id }}
{# S3 object key #}
{{ payload.data.key }}
Conditional Logic
Use a Logic node to branch based on success:
jinja2
{{ payload.success }}
This returns true or false, which can route to different paths.
Service-Specific Data
HTTP
json
{
"success": true,
"status": "completed",
"data": {
"status_code": 200,
"url": "https://api.example.com/users",
"response": {
"id": 123,
"name": "John"
}
},
"service": "http",
"operation": "GET"
}
Access the response body:
jinja2
{{ payload.data.response.id }}
{{ payload.data.status_code }}
AWS SQS
send_message:
json
{
"success": true,
"status": "sent",
"data": {
"message_id": "abc-123-def",
"queue_url": "https://sqs.us-east-1.amazonaws.com/123456789/my-queue"
},
"service": "aws.sqs",
"operation": "send_message"
}
receive_message:
json
{
"success": true,
"status": "received",
"data": {
"messages": [{"key": "value"}],
"count": 1
},
"service": "aws.sqs",
"operation": "receive_message"
}
AWS S3
put_object:
json
{
"success": true,
"status": "uploaded",
"data": {
"bucket": "my-bucket",
"key": "path/to/file.json",
"etag": "abc123"
},
"service": "aws.s3",
"operation": "put_object"
}
get_object:
json
{
"success": true,
"status": "downloaded",
"data": {
"bucket": "my-bucket",
"key": "path/to/file.json",
"content": {"your": "data"}
},
"service": "aws.s3",
"operation": "get_object"
}
AWS SNS
json
{
"success": true,
"status": "sent",
"data": {
"message_id": "abc-123",
"topic_arn": "arn:aws:sns:us-east-1:123456789:my-topic"
},
"service": "aws.sns",
"operation": "publish"
}
AWS Lambda
Synchronous (RequestResponse):
json
{
"success": true,
"status": "completed",
"data": {
"function_name": "my-function",
"response": {"result": "value"}
},
"service": "aws.lambda",
"operation": "invoke"
}
Async (Event):
json
{
"success": true,
"status": "invoked",
"data": {
"function_name": "my-function",
"request_id": "abc-123"
},
"service": "aws.lambda",
"operation": "invoke"
}
AWS EventBridge
json
{
"success": true,
"status": "sent",
"data": {
"event_id": "abc-123",
"event_bus": "default"
},
"service": "aws.eventbridge",
"operation": "put_events"
}
Azure Blob Storage
json
{
"success": true,
"status": "uploaded",
"data": {
"container": "my-container",
"blob_name": "path/to/file.json"
},
"service": "azure.storage",
"operation": "upload"
}
Azure Service Bus
json
{
"success": true,
"status": "sent",
"data": {
"queue": "my-queue"
},
"service": "azure.servicebus",
"operation": "send"
}
Azure Queue Storage
json
{
"success": true,
"status": "sent",
"data": {
"queue": "my-queue"
},
"service": "azure.queue",
"operation": "send_message"
}
GCP Cloud Storage
json
{
"success": true,
"status": "uploaded",
"data": {
"bucket": "my-bucket",
"blob_name": "path/to/file.json"
},
"service": "gcp.storage",
"operation": "upload"
}
GCP Pub/Sub
json
{
"success": true,
"status": "sent",
"data": {
"message_id": "123456789",
"topic": "my-topic"
},
"service": "gcp.pubsub",
"operation": "publish"
}
GCP Firestore
set:
json
{
"success": true,
"status": "completed",
"data": {
"collection": "users",
"document_id": "abc123"
},
"service": "gcp.firestore",
"operation": "set"
}
get:
json
{
"success": true,
"status": "completed",
"data": {
"collection": "users",
"document_id": "abc123",
"document": {"name": "John", "email": "[email protected]"}
},
"service": "gcp.firestore",
"operation": "get"
}
query:
json
{
"success": true,
"status": "completed",
"data": {
"collection": "users",
"results": [{"name": "John"}, {"name": "Jane"}],
"count": 2
},
"service": "gcp.firestore",
"operation": "query"
}
MQTT
json
{
"success": true,
"status": "sent",
"data": {
"topic": "sensors/temperature",
"message_id": 1,
"qos": 1
},
"service": "mqtt",
"operation": "publish"
}
AI/LLM (OpenAI, Anthropic, Google)
json
{
"success": true,
"status": "completed",
"data": {
"response": "The analysis shows a 15% increase in Q3 revenue...",
"model": "claude-sonnet-5",
"usage": {
"prompt_tokens": 150,
"completion_tokens": 89,
"total_tokens": 239
}
},
"service": "ai.anthropic",
"operation": "chat"
}
Access the AI response:
jinja2
{{ payload.data.response }}
{{ payload.data.usage.total_tokens }}
Contact Entity Message
json
{
"success": true,
"status": "sent",
"data": {
"message_id": "msg-abc123",
"dest": "entity-456"
},
"service": "contact.platform",
"operation": "send"
}
Error Handling
When an operation fails, the response includes error information:
json
{
"success": false,
"status": "failed",
"data": {
"status_code": 404,
"url": "https://api.example.com/missing",
"response": {"error": "Not found"}
},
"service": "http",
"operation": "GET"
}
Handling Errors in Workflows
- Use Logic Nodes to branch on
{{ payload.success }} - Check Status with
{{ payload.status }}for specific handling - Access Error Details via
{{ payload.data }}for logging or retry logic
Example: Retry on Failure
jinja2
# Logic node condition
{{ payload.success == false and payload.status == "failed" }}
Tendrl