# Call an external API

> Call an authenticated Representational State Transfer (REST) API, handle the response, and extract data for downstream workflow nodes.

**What you'll build:** A workflow that calls an authenticated Representational State Transfer (REST) API, handles the response, and makes the extracted data available to downstream nodes. This is one of the most common patterns in Flow — it applies to any system that exposes an HTTP endpoint.

## What you'll need

- A UiPath Automation Cloud account with access to Maestro Flow.
- The target API's base URL, endpoint path, and authentication details (API key, bearer token, or basic auth credentials).

## Nodes used

- [Manual Trigger](node-manual-trigger.md) — starts the workflow on demand
- [HTTP Request](node-http-request.md) — calls the REST API
- [Data Transform](node-data-transform.md) — extracts the fields you need from the response
- [Script](node-script.md) — logs failures on the HTTP Request's error path

## Steps

### 1. Create a new Flow and add a trigger

1. Open **Maestro** → **Flow** and create a new workflow.
2. Drag a **Manual Trigger** onto the canvas.

### 2. Add and configure the HTTP Request node

1. Drag an **HTTP Request** node onto the canvas and connect it to the trigger.
2. In the configuration panel:
   - Set **Method** to the appropriate verb (`GET`, `POST`, `PUT`, `PATCH`, or `DELETE`).
   - Enter the full **URL** of the endpoint.
   - Under **Headers**, add authentication and content-type headers.

**For API key authentication:**

Add a header with key `Authorization` and value `Bearer {{ secret.apiKey }}`. The `secret.` prefix tells Flow to look up the value from your secure variable store — never paste the key directly into the field.

**For basic auth:**

Add a header with key `Authorization` and value `Basic {{ secret.encodedCredentials }}`, where `encodedCredentials` is the base64-encoded `username:password` string.

### 3. Extract the data you need

1. Drag a **Data Transform** node onto the canvas and connect it to the HTTP Request node.
2. In the configuration panel, map the response fields you need from `$vars.httpRequest1.output.body` to named output variables.

For example, to extract a user's name and email from a response like `{ "user": { "name": "Alex", "email": "alex@example.com" } }`, map:
- `$vars.httpRequest1.output.body.user.name` → `userName`
- `$vars.httpRequest1.output.body.user.email` → `userEmail`

### 4. Add error handling

1. Select the HTTP Request node.
2. Drag from its **error handle** (the bottom-right connector) to a new **Script** node.
3. In the Script node, log the error from `$vars.httpRequest1.error`:

```javascript
const error = $vars.httpRequest1.error;
console.log('API call failed:', error.message, '| Status:', error.status);
return null;
```

### 5. Test and debug

Select **Test**. In the execution trace:

- Check the HTTP Request node's `statusCode` output. `200` means success; `401` means your authentication is wrong; `404` means the URL is incorrect.
- Check the Data Transform node's output to confirm the fields were extracted correctly.
- To test the error path, temporarily set the URL to an invalid value and verify the error path executes.

## Result

Your workflow calls the REST API, extracts the fields you need from the response, and logs failures on the error path. You can inspect the HTTP status code and extracted values in the execution trace, and confirm both the success and error paths work as expected.

## Extend this workflow

- **Handle pagination**: if the API returns results across multiple pages, add follow-up HTTP Request nodes to fetch additional pages, branching with a [Decision](node-decision.md) on whether the response includes a next-page cursor.
- **Write results to another system**: after the Data Transform node, add another HTTP Request node or an integration node to push the data downstream.
- **Schedule it**: replace the Manual Trigger with a [Scheduled Trigger](node-scheduled-trigger.md) to run the workflow on a regular interval.
