Skip to main content

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:

  1. Read the service from the service_config_snapshot. Find the assignment for the service you're calling and take its compiled_api_url (URL with variables already substituted), method, and headers. (See The service_config Snapshot.)
  2. 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.
  3. 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 as worker_slug, and the consumption (input_size / output_size) measured in the service's declared unit (from the snapshot's unit/per_unit). The platform prices it from the service registry — so your service spend shows up in cost analytics exactly like agent spend.
  4. 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.