Manual Connection Objects
Any step that takes a connection input also accepts a plain object, not just a {{ $connections.<name> }} reference. The runner uses it as-is.
When to reach for this
Section titled “When to reach for this”When the credentials aren’t known until runtime. The canonical case: a form submission (or webhook body) carries a partner’s API credentials, and the workflow needs to use them for that one execution. There’s no stored connection to reference because the credentials are different every run.
Stored connections are still the right default wherever possible.
How to use it
Section titled “How to use it”The object’s fields are whatever a stored connection of that type would have. Pass it inline, or stage it once with core.set-variable and reference it as {{ $vars.my_conn }}.
For OAuth-backed steps there’s no automatic token refresh — you have to acquire the access token yourself first (typically a core.http call to the provider’s token endpoint), then pass it as { "accessToken": "..." }.
Connection redirection via {{ $env.MY_CONN }} doesn’t work either — it expects a stored-connection name on the other end, not an object.
Examples
Section titled “Examples”Twilio
Section titled “Twilio”{ "stepId": "send-sms", "stepType": "core.http", "input": { "connection": { "accountSid": "{{ initial.twilio_sid }}", "authToken": "{{ initial.twilio_token }}" }, "url": "https://api.twilio.com/2010-04-01/Accounts/{{ initial.twilio_sid }}/Messages.json", "method": "POST", "form": { "From": "{{ initial.from_number }}", "To": "{{ initial.to_number }}", "Body": "Hello from QuickFlo" } }}region is one of US, CA, EU, UK, IN. The domainId property is only needed for Five9 SMS or the latest admin REST APIs.
{ "stepId": "run-report", "stepType": "five9.run-report", "input": { "connection": { "username": "{{ initial.five9_username }}", "password": "{{ initial.five9_password }}", "region": "{{ initial.five9_region }}" }, "folderName": "Reports", "reportName": "Daily Call Summary" }}Zoom (server-to-server OAuth)
Section titled “Zoom (server-to-server OAuth)”Three steps: exchange the credentials for an access token, stash it in $vars, then use it as { "accessToken": ... } on every typed Zoom step.
{ "stepId": "auth", "stepType": "core.http", "input": { "url": "https://zoom.us/oauth/token", "method": "POST", "headers": { "Authorization": "{{ initial.client_id | basicAuthHeader: initial.client_secret }}" }, "searchParams": { "account_id": "{{ initial.account_id }}", "grant_type": "account_credentials" } }}{ "stepId": "stage-zoom-conn", "stepType": "core.set-variable", "input": { "zoom_conn": { "accessToken": "{{ auth.body.access_token }}" } }}{ "stepId": "list-units", "stepType": "zoom.list-units", "input": { "connection": "{{ $vars.zoom_conn }}", "page_size": 300 }}