# When an app isn’t here

Use a service GoRunner has no app for, from its own API.

Most services have a web API. An **HTTP Request** step can call it, so a workflow can use the service without an app.

## Call its API

1. Find the service’s API documentation. Note the address of the call you need, its method, and how it signs in.
2. Make a key or token in the service, if it asks for one.
3. In the builder, open **Variables** and save the token as a sensitive variable. GoRunner stores it encrypted and masks it in run data.
4. Add an **HTTP Request** step. Fill in **Method** and **URL**, and under **Authentication**, choose how the service signs in.
5. Put the variable in the token field as an expression, then press **Test step**.

```expression
{{$vars.SERVICE_TOKEN}}
```

You should see the service’s reply in the step’s output: its status, headers and body.

If the service documents a `curl` command, paste it into **Import cURL** at the top of the step instead. It fills in the method, address, headers and body.

## Other ways

- [GraphQL](https://docs.gorunner.io/apps/graphql): For a service with a GraphQL API
- [Code](https://docs.gorunner.io/apps/code): Reshape a reply in JavaScript
- [HTTP Request](https://docs.gorunner.io/apps/http-request): Every field, and its limits

**What if the service signs in with OAuth?**

Set **Authentication** to **OAuth2 (connection)**. The step then uses a connection that signs in with the service, and renews it for you.

**What if the service is on a private network?**

Steps can’t reach private addresses, such as `10.0.0.5`, or the server GoRunner runs on. On GoRunner Cloud they never can. On a self-hosted installation, an admin can allow some with `WORKFLOW_PRIVATE_NETWORKS`. See [Outbound access](https://docs.gorunner.io/self-host/outbound-access).

**What if the reply is very large?**

A reply over 10 MB fails the step. Ask for less at a time, such as a smaller page.

**What if an app isn’t in my list?**

- In a product that embeds GoRunner, your provider chooses the apps, for everyone or for your account. Its **Code step** switch removes Code, its **HTTP step** switch removes HTTP Request and GraphQL, and its **Sub-flows** and **MCP** switches remove those apps. See [Switches](https://docs.gorunner.io/embed/switches).
- During an update, an app can be missing for a moment, until every worker runs the same version.

Through the API, a step with an app you may not use fails with [`PIECE_NOT_ALLOWED`](https://docs.gorunner.io/errors#PIECE_NOT_ALLOWED).

## For developers

Through the API, a workflow definition uses the app `http` with the action `send_request`. See [Get an action’s fields](https://docs.gorunner.io/api/apps/get-app-action).

Source: https://docs.gorunner.io/apps/when-an-app-isnt-here
