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

  1. Use Logic Nodes to branch on {{ payload.success }}
  2. Check Status with {{ payload.status }} for specific handling
  3. 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" }}