Making Service Calls (No Service Node)
For AI calls you have the Agent node, which does almost everything for you. For every other external call — a text-to-speech API, an image generator, any non-LLM service — there is no equivalent node. You build the request yourself. Here's the honest why, and the pattern.
Why there's no service node
The Agent node can be self-contained because it resolves an AI provider's credentials and request shape at runtime. A general "service node" would need to do the same for arbitrary services — and that runs into how n8n handles credentials: it doesn't allow loading a service's credentials dynamically in the way Circus would need. So rather than ship a node that only half-works, Circus leaves service calls to you, using n8n's own HTTP Request node — which is flexible, well-understood, and lets you attach whatever credential the service requires.
The pattern: HTTP Request → Log
Making a service call the Circus way is a short, repeatable loop:
- Read the service from the
service_config_snapshot. Find the assignment for the service you're calling and take itscompiled_api_url(URL with variables already substituted),method, andheaders. (See The service_config Snapshot.) - Make the call with an HTTP Request node. Use those values, and attach whatever credential the service needs from your own n8n credentials — remember, the snapshot's headers are passed through as-is and Circus injects no secrets, so anything sensitive comes from you here.
- Log the call with a Log node. This is the step that keeps the call accountable: report it with
worker_type: service, the service's slug asworker_slug, and the consumption (input_size/output_size) measured in the service's declared unit (from the snapshot'sunit/per_unit). The platform prices it from the service registry — so your service spend shows up in cost analytics exactly like agent spend. - Handle errors on the branch — if the call fails and the run can't continue, end that branch with a Terminate node.
Why the Log node isn't optional
It's tempting to make the HTTP call and move on. Don't: without the Log node, that service call is invisible — no cost, no record, no threshold check. The Log node is what turns a raw HTTP request into an accounted-for step, and it's also where the run's cost/time limits get checked for that call (it self-terminates on a breach, just like the Agent node). Working examples of the whole loop are in the demo workflows — the Generate Media workflow builds its image and audio service calls exactly this way.