# LangGraph
Source: https://docs.gotohuman.com/Examples/langgraph-agent
An example AI sales agent built with LangGraph
### Repo
Using [LangGraph](https://langchain-ai.github.io/langgraph/) and [Firecrawl](https://firecrawl.dev/) -> Sales Agent
# LangGraph JS
Source: https://docs.gotohuman.com/Examples/langgraph-js
An example AI sales agent built with LangGraph JS
### Repo
Using [LangGraph.js](https://langchain-ai.github.io/langgraphjs/)
# LangGraph via MCP
Source: https://docs.gotohuman.com/Examples/langgraph-mcp
An example AI agent using MCP for human approvals in LangChain
### Repo
-> MCP Example
# Make: Human in the loop
Source: https://docs.gotohuman.com/Integrations/make-com
Use the **verified gotoHuman app** to add human review and approval steps to your [Make](https://www.make.com/en?utm_source=gotohuman-app\&utm_medium=partner\&utm_campaign=gotohuman-app-partner-program) workflows.
## Prerequisites
* A gotoHuman account and **API key** ([sign up](https://app.gotohuman.com/))
* A [review type](/create-template) with the fields you want reviewers to see or fill in
* An [agent](/agent-setup) to select in the node (identifies your workflow)
## Use our modules
Simply search for **gotoHuman** when adding a module.
When adding an action module for the first time, it will ask you to create a new connection. Enter the API key from your [gotoHuman workspace](https://app.gotohuman.com).
### Actions
| | |
| - | - |
| **Create a Review Request** | Send a review request. Read about the [properties](/api-reference/request-review) to enter. |
| **Delete a Review Request** | Delete an existing review request by its ID. Read more [here](/api-reference/delete-review). |
### Triggers
| | |
| - | - |
| **Watch the Review Response** | Triggered when a reviewer approved a review. Create a separate scenario that starts with this module. Copy the webhook URL and paste it on the [review type](/create-template#type-webhook) or on the [agent](/agent-setup#webhook). See the full [webhook event payload](/webhook-events). |
# n8n: Human in the loop
Source: https://docs.gotohuman.com/Integrations/n8n
Use the **verified gotoHuman node** to add human review and approval steps to your [n8n](https://n8n.io/) AI agents and workflows.
A great way to get started is to check out one of [our n8n workflow templates](https://n8n.io/creators/gotohuman/).
## Prerequisites
* A gotoHuman account and **API key** for the node credentials ([sign up](https://app.gotohuman.com/))
* A [review type](/create-template) with the fields you want reviewers to see or fill in
* An [agent](/agent-setup) to select in the node (identifies your workflow)
## Install the node
Our **verified community node** is approved by n8n and available for n8n cloud and self-hosted n8n instances.
### From the nodes panel (n8n cloud + self-hosted)
Simply search for **gotoHuman** in the nodes panel and install it.
If you can't find the node in the nodes panel, you may need to update your n8n version. If you're self-hosting, you can also install the node manually from npm as described below. Make sure that installing verified community nodes is not disabled by your instance owner. More in the [n8n docs](https://docs.n8n.io/integrations/community-nodes/installation/).
### From npm (self-hosted)
If you run a self-hosted n8n instance, install the node from npm.
Our [npm package name](https://www.npmjs.com/package/@gotohuman/n8n-nodes-gotohuman) is
```
@gotohuman/n8n-nodes-gotohuman
```
More info on installing community nodes in the [n8n docs](https://docs.n8n.io/integrations/community-nodes/installation/).
## Use our node
Search for **gotoHuman** in the nodes panel to see all available actions and triggers.
### Actions
| | |
| - | - |
| **Send and Wait for Response** | Send a review request and pause the workflow. The workflow resumes automatically with the [review result](/webhook-events) as the node's output once the reviewer submits. **No webhook setup needed** – a dynamic webhook URL is already included in the request. Read about the [properties](/api-reference/request-review) to enter. |
| **Send** | Send a review request and separately handle the webhook response using one of the triggers below. Read about the [properties](/api-reference/request-review) to enter. |
| **Delete** | Delete an existing review request by its review ID. Read more [here](/api-reference/delete-review). |
### Triggers
| | |
| - | - |
| **On completed review of a type** | A reviewer approved a review of the selected [type](/create-template). |
| **On completed review for an agent** | A reviewer approved a review for the selected [agent](/agent-setup). |
| **On submitted trigger form** | A user submitted a [trigger form](/manual-triggers) of an agent. |
See the full [webhook payload](/webhook-events) for trigger events.
## Notes
### Review request as an agent tool
You can attach the **Send review request** action as a tool on an n8n AI Agent node and make the agent show the link to the created review in the conversation. Then use the **On completed review for an agent** trigger to resume your agent with the review results. Make sure to select the same agent as the one selected in the review requests.
### Multiple items input
n8n does not support passing multiple items as input into a sendAndWait node – the node would only resume once for the first response.\
Use the **Send review request** action and one of the **On completed review** triggers instead.
# Agent Inbox
Source: https://docs.gotohuman.com/agent-inbox
Reviewers find pending reviews in their Agent Inbox.
Reviewers use the Agent Inbox to find and open pending reviews.
Reviewers can also open a review from a link received in a [notification](/notifications).
[Trigger forms](/manual-triggers) add a button to the inbox so your team can start a workflow from there.
# Set up agent
Source: https://docs.gotohuman.com/agent-setup
Connect your AI agent or workflow to gotoHuman.
### Add an agent
Each agent you add gets a unique **ID** that identifies it in all communication with gotoHuman – use it as the `agentId` when [sending review requests](/send-requests).
### Add a webhook
If you want to receive all submissions for an agent at a single endpoint, you can set a webhook on the agent.
Alternatively, you can set a webhook on the [review type](/create-template#type-webhook) (or trigger form) or a [`webhookUrl`](/api-reference/request-review#webhookUrl) on the request.\
See [Webhooks](/webhooks) for further details.
### Launch agents
In addition to approval steps, you can also allow your team to **start** agent or workflows runs using **[trigger forms](/manual-triggers)**. This lets you launch a workflow from a predefined set of inputs.
Submissions go to your webhook. They include a `sessionId` you can pass in subsequent [review requests](/api-reference/request-review#sessionId) to link steps of the same run.
# Delete review
Source: https://docs.gotohuman.com/api-reference/delete-review
DELETE /reviews/{reviewId}
Delete a review by ID.
See [Introduction](/api-reference/introduction) for the base URL and authentication.
## Path Parameters
The ID of the review.
```bash Placeholder theme={null}
curl --request DELETE \
--url https://api.gotohuman.com/reviews/123456abcdef \
--header 'x-api-key: YOUR_API_KEY'
```
```json Response theme={null}
{
"deleted": true,
"reviewId": "123456abcdef"
}
```
## Response
`true` when the review was deleted.
ID of the deleted review.
# Fetch delivery
Source: https://docs.gotohuman.com/api-reference/fetch-delivery
GET /webhooks/deliveries/{deliveryId}
Fetch a webhook delivery by ID.
See [Introduction](/api-reference/introduction) for the base URL and authentication.
Fetch the status of a webhook delivery, including each attempt. Delivery IDs are returned on a completed review as `webhookDeliveryId`. See [Fetch review](/api-reference/fetch-review).
## Path Parameters
The ID of the webhook delivery.
```bash Request theme={null}
curl --request GET \
--url https://api.gotohuman.com/webhooks/deliveries/whd_agent_abc123 \
--header 'x-api-key: YOUR_API_KEY'
```
```json Succeeded theme={null}
{
"accountId": "abFMvLv4HafQymWxKDAov",
"deliveryId": "whd_agent_abc123",
"status": "succeeded",
"ok": true,
"statusCode": 200,
"statusText": "OK",
"event": "review.completed",
"target": "agent",
"urlSource": "request",
"webhook": "https://example.com/hooks/gotohuman",
"reviewId": "123456abcdef",
"formId": "123456abcdef",
"formName": "Review AI Draft",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"attemptCount": 1,
"maxAttempts": 7,
"attempts": [
{
"attemptId": "attempt-1",
"ok": true,
"statusCode": 200,
"webhook": "https://example.com/hooks/gotohuman",
"at": "2027-10-05T14:48:02.000Z"
}
],
"triggeredAt": "2027-10-05T14:48:00.000Z",
"updatedAt": "2027-10-05T14:48:02.000Z"
}
```
```json Retrying theme={null}
{
"accountId": "abFMvLv4HafQymWxKDAov",
"deliveryId": "whd_agent_abc123",
"status": "retrying",
"ok": false,
"statusCode": 500,
"statusText": "Internal Server Error",
"event": "review.completed",
"target": "agent",
"urlSource": "agent",
"webhook": "https://example.com/hooks/gotohuman",
"reviewId": "123456abcdef",
"formId": "123456abcdef",
"formName": "Review AI Draft",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"attemptCount": 2,
"maxAttempts": 7,
"attempts": [
{
"attemptId": "attempt-1",
"ok": false,
"statusCode": 500,
"webhook": "https://example.com/hooks/gotohuman",
"at": "2027-10-05T14:48:02.000Z"
},
{
"attemptId": "attempt-2",
"ok": false,
"statusCode": 500,
"webhook": "https://example.com/hooks/gotohuman",
"at": "2027-10-05T14:49:05.000Z"
}
],
"nextRetryAt": "2027-10-05T14:54:05.000Z",
"triggeredAt": "2027-10-05T14:48:00.000Z",
"updatedAt": "2027-10-05T14:49:05.000Z"
}
```
## Response
ID of the account that owns the delivery.
ID of the webhook delivery.
`pending`, `delivering`, `succeeded`, `retrying`, or `dead`.
`true` when the latest attempt returned a successful HTTP response.
HTTP status code from the latest attempt.
HTTP status text from the latest attempt.
Webhook event. `review.completed` or `trigger.submitted`.
Where the webhook was sent. `agent`, `tool`, or `audit`.
Which webhook URL was used. `request`, `form`, or `agent`.
URL the delivery was sent to.
ID of the review that triggered the delivery.
ID of the review type.
Name of the review type.
ID of the agent.
Session or workflow run.
Number of automatic attempts so far.
Maximum automatic attempts. Failed deliveries retry up to 7 times. See [Retries](/webhooks#retries).
One entry per attempt, in order.
ID of the attempt, such as `attempt-1`.
`true` when this attempt returned a successful HTTP response.
HTTP status code from this attempt.
URL the delivery was sent to.
ISO 8601 timestamp of the attempt.
ISO 8601 timestamp of the next automatic retry. Present while `status` is `retrying`.
`true` when auto-retries were stopped. The delivery status is then `dead`.
ISO 8601 timestamp when the delivery was created.
ISO 8601 timestamp of the latest update.
# Fetch review
Source: https://docs.gotohuman.com/api-reference/fetch-review
GET /reviews/{reviewId}
Fetch a pending or completed review by ID.
See [Introduction](/api-reference/introduction) for the base URL and authentication.
## Path Parameters
The ID of the review.
```bash Request theme={null}
curl --request GET \
--url https://api.gotohuman.com/reviews/123456abcdef \
--header 'x-api-key: YOUR_API_KEY'
```
## Response
```json Pending theme={null}
{
"accountId": "abFMvLv4HafQymWxKDAov",
"reviewId": "123456abcdef",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"formId": "123456abcdef",
"formName": "Review AI Draft",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 42000,
"stage": "proposal",
"contact": {
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "+1234567890"
}
}
},
"config": {
"fields": {
"stageSelect": {
"options": [
{ "id": "proposal", "label": "Proposal" },
{ "id": "negotiation", "label": "Negotiation" },
{ "id": "won", "label": "Won" }
]
}
}
},
"createdAt": "2027-10-04T14:18:00.000Z",
"state": "pending",
"meta": {
"example": "LLM thread id"
},
"gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/agent123456abcdef/reviews/123456abcdef"
}
```
```json Completed theme={null}
{
"accountId": "abFMvLv4HafQymWxKDAov",
"reviewId": "123456abcdef",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"formId": "123456abcdef",
"formName": "Review AI Draft",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 42000,
"stage": "negotiation",
"contact": {
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "+1234567890"
}
}
},
"createdAt": "2027-10-04T14:18:00.000Z",
"state": "responded",
"reviewResult": {
"response": "approved",
"respondingUser": "jess@acme.org",
"respondingUserId": "uid_abc123",
"respondedAt": "2027-10-05T14:48:00.000Z",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 45000,
"stage": "proposal",
"contact": {
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "+1234567890"
}
}
}
},
"fileCache": {
"https://files.example.com/hero.png": "https://cdn1.gotohuman.com/..."
},
"meta": {
"example": "LLM thread id"
},
"gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/agent123456abcdef/reviews/123456abcdef",
"webhookDeliveryId": "whd_agent_abc123",
"toolWebhookDeliveryId": "whd_tool_def456"
}
```
ID of the account that owns the review.
ID of the review.
ID of the [agent](/agent-setup) this review belongs to.
Session or workflow run this review belongs to.
ID of the [review type](/create-template).
Name of the review type.
Data sent with the [review request](/api-reference/request-review). Same shape as the request `data`.
Dynamic field configuration sent with the request, when you included `config`.
Review status. `pending` while waiting for a reviewer, `responded` after submission.
Included when `state` is `responded`.
`approved` or `rejected`. Omitted for [trigger forms](/manual-triggers).
Email of the reviewer who submitted.
ID of the reviewer who submitted.
ISO 8601 timestamp of the submission.
Values after review. Same structure as the request `data`, including reviewer edits and selections.
Map of original media URLs to CDN URLs. See [Images and videos](/images-videos#cdn-urls-in-webhooks).
Any `meta` you sent with the request.
Link to open the review in gotoHuman.
ID of the agent webhook delivery for this completion. Fetch it with [Fetch delivery](/api-reference/fetch-delivery).
# Introduction
Source: https://docs.gotohuman.com/api-reference/introduction
Base URL and authentication for the gotoHuman API.
This describes how to use our API directly. You can also use the [JavaScript SDK](/send-requests#js-sdk) or [Python SDK](/send-requests#python-sdk) or integrations for [n8n](/Integrations/n8n) and [Make](/Integrations/make-com).
## Base URL
All API requests use this base URL:
```
https://api.gotohuman.com
```
## Authentication
Send your API key in the `x-api-key` header on every request.
```bash theme={null}
--header 'x-api-key: YOUR_API_KEY'
```
Open **API Keys** in your [workspace](https://app.gotohuman.com) to create or copy a key.
# Query responses
Source: https://docs.gotohuman.com/api-reference/query-responses
GET /responses
Fetch review responses via API.
See [Introduction](/api-reference/introduction) for the base URL and authentication.
### Query Parameters
The ID of the review type.
The comma-separated IDs of the fields you are interested in.
Filter by review status. Possible values: `approved`, `rejected`.
Filter by response values. See [Filtering Response Values](#filtering-response-values) for more details.
Whether to group the responses by field. If not, grouped by review.
Lists only the response values for approved reviews.
Lists only the request values for rejected reviews.
The number of responses to return. Maximum 500 (Team: 100, Starter: limited).
```json groupByField=false theme={null}
[
{
"reviewId": "abc123456",
"createdAt": "2025-03-12T22:25:42.415Z",
"respondedAt": "2025-03-12T22:26:15.253Z",
"response": "approved",
"fields": {
"yourFieldId1": {
"suggestedValue": "Hi Lenny, I saw the news about your latest model. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community...",
"approvedValue": "Hello Lenny, I tested your latest model and it looks really promising. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community..."
},
"yourFieldId2": {
"suggestedValue": "...",
"approvedValue": "..."
}
}
},
...
]
```
```json groupByField=true theme={null}
{
"yourFieldId1": [
{
"reviewId": "abc123456",
"createdAt": "2025-03-12T22:25:42.415Z",
"respondedAt": "2025-03-12T22:26:15.253Z",
"response": "approved",
"suggestedValue": "Hi Lenny, I saw the news about your latest model. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community...",
"approvedValue": "Hello Lenny, I tested your latest model and it looks really promising. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community..."
},
...
]
}
```
```json approvedValuesOnly=true groupByField=false theme={null}
[
{
"yourFieldId1": "Hello Lenny, I tested your latest model and it looks really promising. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community...",
"yourFieldId2": "..."
},
...
]
```
```json approvedValuesOnly=true groupByField=true theme={null}
{
"yourFieldId1": [
"Hello Lenny, I tested your latest model and it looks really promising. Given your momentum in the AI space, influencer marketing could be a powerful tool to further engage and expand your developer community...",
"..."
],
"yourFieldId2": [
"...",
"..."
]
}
```
## Filtering Response Values
The `filterResponseValues` parameter allows you to filter responses based on their field values. This parameter accepts an array of filter objects that are combined with AND logic.
**Filter Array (as JSON string):**
```json theme={null}
[
{
"field": "urgency.value",
"operation": "==",
"value": "urgent"
},
{
"field": "rating.value",
"operation": "\u003E=",
"value": 4
}
]
```
The `filterResponseValues` parameter must be passed as a URL-encoded JSON string array. **Important**: Do not pass an actual array object, but a JSON string. In n8n expressions, you can use `yourArray.toJsonString()` to convert an array to a JSON string.
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22urgency.value%22%2C%22operation%22%3A%22equal%22%2C%22value%22%3A%22urgent%22%7D%2C%7B%22field%22%3A%22rating.value%22%2C%22operation%22%3A%22greaterThanOrEqual%22%2C%22value%22%3A4.0%7D%5D
```
### Supported Operations
**Scalar Operations:**
* `==` - Field equals value ([example](#equal-))
* `!=` - Field does not equal value ([example](#not-equal-))
* `>` - Field > value ([example](#greater-than-))
* `>=` - Field >= value ([example](#greater-than-or-equal-))
* `<` - Field \< value ([example](#less-than-))
* `<=` - Field \<= value ([example](#less-than-or-equal-))
* `contains` - Field contains substring ([example](#contains))
* `startsWith` - Field starts with substring ([example](#starts-with))
* `endsWith` - Field ends with substring ([example](#ends-with))
* `isTrue` - Field is true ([example](#is-true))
* `isFalse` - Field is false ([example](#is-false))
**Array Operations:**
* `arrayIncludes` - Array contains value ([example](#array-includes))
* `arrayExcludes` - Array does not contain value ([example](#array-excludes))
* `arrayIsEmpty` - Array is empty ([example](#array-is-empty))
* `arrayIsNotEmpty` - Array is not empty ([example](#array-is-not-empty))
The filtering is done on the `responseValues` field that you receive in your response webhooks:
```
// example structure. Look at your webhook responses to see the structure for your review type.{ "responseValues": { "keyword": { "value": "Lirum Larum Ipsum Dolor Sit Amet", "wasEdited": false }, "content": { "value": "Excepteur sint occaecat cupidatat non proident...", "wasEdited": false }, "customerValue": { "value": 123, "wasEdited": false }, "rating": { "value": 4.5, "wasEdited": false }, "urgency": { "value": "urgent" }, "categories": { "value": [ {"id": "ecommerce", "label": "eCommerce"}, {"id": "health", "label": "Health"} ] } }, ...}
```
### Examples
#### Equal (`==`)
**Filter Array (as JSON string):**
```
[ { "field": "urgency.value", "operation": "==", "value": "urgent" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22urgency.value%22%2C%22operation%22%3A%22equal%22%2C%22value%22%3A%22urgent%22%7D%5D
```
#### Not Equal (`!=`)
**Filter Array (as JSON string):**
```
[ { "field": "urgency.value", "operation": "!=", "value": "low" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22urgency.value%22%2C%22operation%22%3A%22notEqual%22%2C%22value%22%3A%22low%22%7D%5D
```
#### Greater Than (`>`)
**Filter Array (as JSON string):**
```
[ { "field": "customerValue.value", "operation": ">", "value": 100 }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22customerValue.value%22%2C%22operation%22%3A%22greaterThan%22%2C%22value%22%3A100%7D%5D
```
#### Greater Than or Equal (`>=`)
**Filter Array (as JSON string):**
```
[ { "field": "rating.value", "operation": ">=", "value": 4.0 }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22rating.value%22%2C%22operation%22%3A%22greaterThanOrEqual%22%2C%22value%22%3A4.0%7D%5D
```
#### Less Than (`<`)
**Filter Array (as JSON string):**
```
[ { "field": "rating.value", "operation": "<", "value": 3.0 }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22rating.value%22%2C%22operation%22%3A%22lessThan%22%2C%22value%22%3A3.0%7D%5D
```
#### Less Than or Equal (`<=`)
**Filter Array (as JSON string):**
```
[ { "field": "rating.value", "operation": "<=", "value": 5.0 }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22rating.value%22%2C%22operation%22%3A%22lessThanOrEqual%22%2C%22value%22%3A5.0%7D%5D
```
#### Contains
**Filter Array (as JSON string):**
```
[ { "field": "content.value", "operation": "contains", "value": "voluptatem" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22content.value%22%2C%22operation%22%3A%22contains%22%2C%22value%22%3A%22voluptatem%22%7D%5D
```
#### Starts With
**Filter Array (as JSON string):**
```
[ { "field": "keyword.value", "operation": "startsWith", "value": "Lirum" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22keyword.value%22%2C%22operation%22%3A%22startsWith%22%2C%22value%22%3A%22Lirum%22%7D%5D
```
#### Ends With
**Filter Array (as JSON string):**
```
[ { "field": "content.value", "operation": "endsWith", "value": "explicabo" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22content.value%22%2C%22operation%22%3A%22endsWith%22%2C%22value%22%3A%22explicabo%22%7D%5D
```
#### Is True
**Filter Array (as JSON string):**
```
[ { "field": "keyword.wasEdited", "operation": "isTrue" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22keyword.wasEdited%22%2C%22operation%22%3A%22isTrue%22%7D%5D
```
#### Is False
**Filter Array (as JSON string):**
```
[ { "field": "urgency.value", "operation": "isFalse" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22urgency.value%22%2C%22operation%22%3A%22isFalse%22%7D%5D
```
#### Array Includes
**Filter Array (as JSON string):**
```
[ { "field": "categories.value", "operation": "arrayIncludes", "value": "ecommerce" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22categories.value%22%2C%22operation%22%3A%22arrayIncludes%22%2C%22value%22%3A%22ecommerce%22%7D%5D
```
#### Array Excludes
**Filter Array (as JSON string):**
```
[ { "field": "categories.value", "operation": "arrayExcludes", "value": "health" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22categories.value%22%2C%22operation%22%3A%22arrayNotIncludes%22%2C%22value%22%3A%22health%22%7D%5D
```
#### Array Is Empty
**Filter Array (as JSON string):**
```
[ { "field": "categories.value", "operation": "arrayIsEmpty" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22categories.value%22%2C%22operation%22%3A%22arrayIsEmpty%22%7D%5D
```
#### Array Is Not Empty
**Filter Array (as JSON string):**
```
[ { "field": "categories.value", "operation": "arrayIsNotEmpty" }]
```
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22categories.value%22%2C%22operation%22%3A%22arrayIsNotEmpty%22%7D%5D
```
#### Array Property Includes
**Filter Array (as JSON string):**
```
[ { "field": "categories.value[].id", "operation": "arrayIncludes", "value": "ecommerce" }]
```
**Note**: The `array[].property` syntax is used for filtering by/comparing with a nested property value when the array items are objects. This works like a `.map()` operation, allowing you to access properties within array elements.
**Full Encoded Request:**
```
GET /fetchResponses?formId=123&filterResponseValues=%5B%7B%22field%22%3A%22categories.value%5B%5D.id%22%2C%22operation%22%3A%22arrayIncludes%22%2C%22value%22%3A%22ecommerce%22%7D%5D
```
# Create review
Source: https://docs.gotohuman.com/api-reference/request-review
POST /reviews
Send a request for human review.
See [Introduction](/api-reference/introduction) for the base URL and authentication.
### Body
The ID of the [agent](/agent-setup) identity you created in gotoHuman.
The ID of your [review type](/create-template).
The data to review.
You can either send the data in its existing shape and map each field in the [review type](/create-template) to the corresponding property path (e.g. map a dropdown field `stageSelect` to the path `crmUpdate.stage`). Or you use the default shape shown in the example request after adding your fields.
Input fields that you don't send any value for will be hidden or show as empty inputs depending on the field's setting.
Dynamic configuration for certain field types:
* Dropdown, Checkboxes, Buttons: Available options
* [Image fields](/images-videos): Transformations and base64 flag
* Link: Link text
Check the "Review Config" section or `config` property in the example request of your review type in the web editor to see available settings, for example:
```json theme={null}
{
"fields": {
"stageSelect": {
"options": [
{ "id": "proposal", "label": "Proposal" },
{ "id": "negotiation", "label": "Negotiation" },
{ "id": "won", "label": "Won" }
]
}
}
}
```
A custom title for the review request. This title is displayed in the [Agent Inbox](/agent-inbox) and in [notification emails](/email-notifications) and [Slack messages](/slack), making it easier for reviewers to identify pending reviews.
Links multiple reviews of the same session or workflow run.
When a run started from a [trigger form](/manual-triggers), use the `sessionId` from its webhook event.
Additional data that should not be part of the review but that you want to receive back in the webhook.
Email addresses of reviewers from your organization to assign. [Read more](/send-requests#assign-reviewers).
Webhook URL for this request. You can do this instead of setting the webhook on the [review type](/create-template#type-webhook) or on the [agent](/agent-setup#webhook).
Set to automatically approve the review request.\
You can also set this on the [review type](/create-template#auto-approval).
```json Request theme={null}
{
"agentId": "ag123456",
"formId": "abcdef12345",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 42000,
"stage": "proposal"
}
},
"config": {
"fields": {
"stageSelect": {
"options": [
{ "id": "proposal", "label": "Proposal" },
{ "id": "negotiation", "label": "Negotiation" },
{ "id": "won", "label": "Won" }
]
}
}
},
"meta": {
"example": "LLM thread id"
},
"title": "Review AI draft",
"sessionId": "session789abcdef",
"assignTo": ["reviewer@acme.org"],
"webhookUrl": "https://example.com/webhooks/gotohuman",
"autoApprove": false
}
```
```json 200 theme={null}
{
"reviewId": "123456abcdef",
"sessionId": "session789abcdef",
"gthLink": "https://app.gotohuman.com/accounts/acc12345678/inbox/agents/all/reviews/123456abcdef",
"extReviewerLinks": [
{
"email": "reviewer@acme.org",
"link": "https://app.gotohuman.com/..."
}
]
}
```
## Response
The API responds with a link to the pending review.
ID of the created review.
Session this review belongs to. Reuse it in later review requests to link multiple steps of the same session or workflow run.
Link to open the pending review in gotoHuman.
Included when [external reviewers](/web-ui#external-reviewers) have been assigned to the review request.
Email address of the external reviewer.
Unique link for that reviewer.
# Create review types
Source: https://docs.gotohuman.com/create-template
Before you can request a human review, create a review type that defines the interface and how it should be processed.
### Review interface
#### Fields
Fields are the building blocks of your review interface showing data from [your request](#request-schema) or capturing user input.
* **Display dynamic data** (AI-generated or not) for reviewers to verify and edit.
* **Collect input**, feedback, and decisions from reviewers.
* **Add context** to help reviewers make accurate, informed choices.
You can use layout elements as well as increase the overall width to further structure the interface.
#### Rules
You can define rules to only show certain fields or groups conditionally (e.g. based on a button selection or some other field input). Any fields hidden by these rules will not run input validation and won't have any effect on the data being reviewed.
### Request schema
You can either send the data in its existing shape and map each field to the corresponding property path (e.g. map a dropdown field `stageSelect` to the path `crmUpdate.stage`). Or you use the default shape shown in the example request after adding your fields.
Read more about how to [send a review request](/send-requests).
### Setup webhook
When a reviewer submits, gotoHuman posts the result to your webhook so your workflow can resume.
Add a webhook URL to the review type if you want all completion events of this type to be posted here. If you need to set it dynamically, add a [`webhookUrl`](/api-reference/request-review#webhookUrl) on the request instead. Another way is to set a webhook URL on the [agent](/agent-setup#webhook) you are requesting a review for.
### Webhook schema
The schema of the `reviewResult` in that event matches the structure of the review data you send in your request, plus any additional user input you capture.\
We show you a preview of this response webhook in the review type editor. It's dynamic, so playing with the review preview will show you how edits, inputs and selections will be reflected in the webhook event.
Read more about [webhooks here](/webhooks).
### Assign to specific reviewers
You can configure a review to be assigned only to selected reviewers from your team. Only the assigned reviewers will see these reviews in their [Agent Inbox](/agent-inbox) and receive [notifications](/notifications).\
Available on Team plan and above.
You can also [dynamically assign reviewers](/send-requests#assign-reviewers) for individual requests. A request-level assignment takes precedence.
### External reviewers
To allow reviewers to access reviews without a user account using a unique link, add them as external reviewers in your team settings and assign them to the review type.\
These links are returned for each [review request](/request-review#response) and you can enable email notifications to deliver them.
#### Auto-approval
Turn on to automatically approve requests – useful to keep monitoring even autonomous agents in gotoHuman and to easily switch back to human reviews at any time (think agent, prompt, or model updates).
Auto-approval can also be set or overridden with each [review request](/api-reference/request-review#param-auto-approve).
# Email
Source: https://docs.gotohuman.com/email-notifications
In your notification settings you can set up email notifications that will be sent for new review requests. Choose from:
* None
* For each review request
* As a hourly or daily digest of pending reviews
# Images and videos
Source: https://docs.gotohuman.com/images-videos
Media files are stored on our CDN, supporting file links, base64, file uploads, and on-the-fly image editing.
When your review includes image or video fields, we automatically stores the related [data from your request](/send-requests) on our CDN so they stay accessible throughout the review process and in any workflow steps after approval.
This is especially useful for AI-generated media, where source URLs from providers like OpenAI or Gemini can expire before your team finishes reviewing.
## Image URLs
An **image** field takes a URL string. gotoHuman downloads the file and stores a copy on our CDN.
```json theme={null}
{
"data": {
"heroImage": "https://files.oaiusercontent.com/file-somethingsomething?se=xyz"
}
}
```
### Multiple images (list field)
To show several images, use a **list** field whose item template contains one **image** field.
**Scalar list** – each array element is an image URL:
```json theme={null}
{
"data": {
"candidateImages": [
"https://files.oaiusercontent.com/file-one?se=xyz",
"https://files.oaiusercontent.com/file-two?se=xyz"
]
}
}
```
**Object list** – each row is an object with the image field id as a property:
```json theme={null}
{
"data": {
"candidates": [
{ "photo": "https://files.oaiusercontent.com/file-one?se=xyz" },
{ "photo": "https://files.oaiusercontent.com/file-two?se=xyz" }
]
}
}
```
## Video URLs
A **video** field also takes a URL string. Videos are downloaded and cached on our CDN the same way as images.
```json theme={null}
{
"data": {
"previewVideo": "https://cdn.example.com/generated-clip.mp4"
}
}
```
## Base64-encoded images
Send a base64 string as the image field value and set `isBase64` in that field's request config. Both raw base64 and data-URL form (`data:image/jpeg;base64,...`) are supported.
```json theme={null}
{
"data": {
"heroImage": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
},
"config": {
"fields": {
"heroImage": {
"isBase64": true
}
}
}
}
```
For a **list** of base64 images, set `isBase64` under `listItemConfig` for the image child field (use the child field's id from your item template):
```json theme={null}
{
"data": {
"candidateImages": [
"data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"data:image/jpeg;base64,/9j/4AAQSkZJRg..."
]
},
"config": {
"fields": {
"candidateImages": {
"listItemConfig": {
"photo": {
"isBase64": true
}
}
}
}
}
}
```
Base64 images are replaced with the CDN URL when the request is ingested. URL-based images keep the original URL in `data` and expose the CDN URL via `fileCache` in the [response webhook](/webhook-events) (see below).
## File uploads (binary)
Upload binary files before creating a review request:
**Endpoint:** `https://api.gotohuman.com/uploadFiles`\
**Method:** `POST`\
**Headers:** `x-api-key: `\
**Content-Type:** `multipart/form-data`
Upload files as form fields. Optionally include a `config` form field with image resize options (see [Image editing](#image-editing) below).
**Response:**
```json theme={null}
{
"success": true,
"files": [
{
"downloadURL": "https://cdn1.gotohuman.com/...",
"originalName": "image.jpg",
"size": 524288,
"contentType": "image/jpeg"
}
],
"count": 1
}
```
Use the returned `downloadURL` values in your review request `data`. Maximum file size is 20 MB.
## Image editing
Apply on-the-fly **resizing** and **cropping** when images are cached. Use this when downstream steps (for example video generation from a reference image) or publish targets (for example social media) need a specific size or aspect ratio.
Pass resize options under `config.fields..transform`:
```json theme={null}
{
"data": {
"heroImage": "https://www.imgs.com/img.jpg"
},
"config": {
"fields": {
"heroImage": {
"transform": {
"resize": {
"width": 400,
"height": 800,
"fit": "cover"
}
}
}
}
}
}
```
For a **list** of images, use the same `transform` shape under `listItemConfig` for the image child field:
```json theme={null}
{
"data": {
"candidateImages": [
"https://www.imgs.com/img.jpg",
"https://www.imgs.com/img2.jpg"
]
},
"config": {
"fields": {
"candidateImages": {
"listItemConfig": {
"photo": {
"transform": {
"resize": {
"width": 400,
"height": 800,
"fit": "cover"
}
}
}
}
}
}
}
}
```
**Resize options:**
* `width`, `height`: Target dimensions in pixels
* `fit`: How to fit the image – `cover`, `contain`, `fill`, `inside`, `outside`
* `position`: Position when using `cover` or `contain` – `top`, `right top`, `right`, `right bottom`, `bottom`, `left bottom`, `left`, `left top`, `centre`
* `background`: Background color for `contain` fit (e.g. `"#ffffff"`, `"red"`, `{r: 255, g: 0, b: 0, alpha: 1}`)
* `withoutEnlargement`: Boolean to prevent upscaling
* `withoutReduction`: Boolean to prevent downscaling
Resize applies to images only, not videos.
## CDN URLs in webhooks
When a review is completed, the [response webhook](/webhook-events) includes your field values in `reviewResult.data`. For URL-based images and videos, the original URL is kept in `data` and the CDN URL is provided in a top-level `fileCache` map:
```json theme={null}
{
"event": "review.completed",
"reviewId": "123456abcdef",
"reviewResult": {
"response": "approved",
"respondingUser": "reviewer@acme.org",
"respondedAt": "2027-10-05T14:48:00.000Z",
"data": {
"heroImage": "https://files.oaiusercontent.com/file-somethingsomething?se=xyz",
"candidateImages": [
"https://files.oaiusercontent.com/file-one?se=xyz",
"https://files.oaiusercontent.com/file-two?se=xyz"
]
}
},
"fileCache": {
"https://files.oaiusercontent.com/file-somethingsomething?se=xyz": "https://cdn1.gotohuman.com/...",
"https://files.oaiusercontent.com/file-one?se=xyz": "https://cdn1.gotohuman.com/...",
"https://files.oaiusercontent.com/file-two?se=xyz": "https://cdn1.gotohuman.com/..."
}
}
```
Look up each original URL in `fileCache` to get the persistent CDN URL for approved workflow steps.
# Introduction
Source: https://docs.gotohuman.com/index
With gotoHuman you can easily let your team approve critical actions of AI agents and workflows, review AI‑generated content, or provide input.
Adding human-in-the-loop steps anywhere in an AI workflow or agent works equally well for:
* **Linear AI workflows** – a pipeline step pauses and waits for a reviewer to approve or edit values before it continues.
* **Agent tool calls** – an AI agent wants to call a tool, creates a review URL for the action and returns it to the user for approval.
## Next steps
See how a human review fits into your workflow, from the review type to the result.
Define the review interface and how requests are processed.
# Trigger forms
Source: https://docs.gotohuman.com/manual-triggers
Offer users input forms to launch a workflow from a structured set of properties
### Create form
You can add a trigger form to an agent on its details page. Composing the form works similarly to adding fields to a [review type](/create-template).
### Webhook
Add a webhook URL on the trigger form or on the [agent](/agent-setup#webhook). Submissions are sent there. When a reviewer submits the form, gotoHuman posts a `event: "trigger.submitted"` event to your endpoint. See [Webhook events](/webhook-events) for the full payload shape.\
The payload includes a `sessionId`. Pass that value on later [review requests](/api-reference/request-review#sessionId) to tie them to this workflow run.
### Accessing the form
#### Inbox UI
Go to the agent's page in the [Agent Inbox](/agent-inbox). Use the filter in the side menu to select the agent. The button that opens the trigger form is on that page.
#### Static Link
The trigger form is accessible under a static URL, so it can be easily bookmarked and shared with other people added to your team.
Note, that the trigger form is currently only accessible in our authenticated environment, and not available to [external reviewers](/web-ui#external-reviewers).
# MCP
Source: https://docs.gotohuman.com/mcp-server
Use our MCP server to request human approvals from your AI workflows via MCP or add it to your IDE to help with integration.
### Usage
```
{
"mcpServers": {
"gotoHuman": {
"command": "npx",
"args": [
"-y",
"@gotohuman/mcp-server"
],
"env": {
"GOTOHUMAN_API_KEY": "your-api-key"
}
}
}
}
```
[
](cursor://anysphere.cursor-deeplink/mcp/install?name=gotoHuman\&config=eyJjb21tYW5kIjoibnB4IC15IEBnb3RvaHVtYW4vbWNwLXNlcnZlciIsImVudiI6eyJHT1RPSFVNQU5fQVBJX0tFWSI6InlvdXItYXBpLWtleSJ9fQ==)
### Repo
# Notifications
Source: https://docs.gotohuman.com/notifications
In the settings of your workspace, you can set up how you and your team want to be notified about new review requests.
Choose from the following notification options:
* [**Email**](/email-notifications) - Configure email notifications to be sent for each review request or as hourly/daily digests
* [**Slack**](/slack) - Connect your Slack workspace to receive notifications in a channel of your choice
Setting up notifications ensures that reviewers are promptly informed when their input is needed, keeping your workflows moving efficiently.
# How to add human reviews to AI workflows
Source: https://docs.gotohuman.com/quickstart
gotoHuman is a human-in-the-loop platform that lets you add human reviews to any AI workflow in just a few simple steps.
Create a [review type](/create-template) in gotoHuman to define the interface and map request properties.
Request reviews from your AI workflow using the gotoHuman [API or SDKs](/send-requests).
Reviewers receive a link, or check their [Agent Inbox](/agent-inbox) to [complete the review](/web-ui).
gotoHuman posts the result back to your [webhook](/review-response) so your workflow can resume execution.
# Handle result
Source: https://docs.gotohuman.com/review-response
Each review submission triggers a webhook with the review result.
### Webhook
When a reviewer submits, gotoHuman posts the result to your webhook.
```json theme={null}
{
"event": "review.completed",
...
"reviewResult": {
"response": "approved",
...
"data": {
"crmUpdate": {
"amount": 42000,
"stage": "proposal"
}
}
}
}
```
Read more about [webhook handling](/webhooks) or find the request format and payload in [Webhook events](/webhook-events).
### n8n
If you are using n8n to build your AI workflow, read how to handle completed reviews in our [n8n integration guide](/Integrations/n8n).
### Make
When using Make to create your workflow, read our [Make integration guide](/Integrations/make-com) on how to handle submitted reviews.
# Request a review
Source: https://docs.gotohuman.com/send-requests
Use our SDK or API to send requests for human review based on a review type you created.
## Prepare
Send requests for review to our API directly.
Details are documented in [Request review](/api-reference/request-review).
In your n8n workflow, add our verified gotoHuman community node.
Read more in our [n8n integration guide](/Integrations/n8n).
In your Make scenario, add a new module, search for `gotoHuman` and select our `Create a Review Request` module.
When setting up a connection, enter your gotoHuman **API key**.
Read more in our [Make integration guide](/Integrations/make-com).
Install our SDK:
```
pip install gotohuman
```
Set environment variables with your gotoHuman API key and the ID of your [agent](/agent-setup):
```
GOTOHUMAN_API_KEY=YOUR_API_KEY
GOTOHUMAN_AGENT_ID=YOUR_AGENT_ID
```
If you're using a `.env` file, don't forget to load it:
```python theme={null}
from dotenv import load_dotenv
load_dotenv()
```
Initialize the SDK:
```python theme={null}
from gotohuman import GotoHuman
gotoHuman = GotoHuman() # reads GOTOHUMAN_API_KEY and GOTOHUMAN_AGENT_ID
```
You can also pass both values explicitly:
```python theme={null}
gotoHuman = GotoHuman(api_key="YOUR_API_KEY", agent_id="YOUR_AGENT_ID")
```
Install our SDK:
```
npm i gotohuman
```
Set environment variables with your gotoHuman API key and the ID of your [agent](/agent-setup):
```
GOTOHUMAN_API_KEY=YOUR_API_KEY
GOTOHUMAN_AGENT_ID=YOUR_AGENT_ID
```
Initialize the SDK:
```javascript theme={null}
import { GotoHuman } from "gotohuman"
const gotoHuman = new GotoHuman()
```
You can also pass both values explicitly:
```javascript theme={null}
const gotoHuman = new GotoHuman({
apiKey: "YOUR_API_KEY",
agentId: "YOUR_AGENT_ID",
})
```
## Send request
Pass the ID of the review type and the agent identity you created and pass the data to review as shown in the review type editor.
```json theme={null}
{
"agentId": "ag123456",
"formId": "abcdef12345",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 42000,
"stage": "proposal"
}
},
"config": {
"fields": {
"stageSelect": {
"options": [
{ "id": "proposal", "label": "Proposal" },
{ "id": "negotiation", "label": "Negotiation" },
{ "id": "won", "label": "Won" }
]
}
}
},
"meta": {
...
}
}
```
Read more in our [n8n integration guide](/Integrations/n8n).
Read more in our [Make integration guide](/Integrations/make-com).
```python theme={null}
review = gotoHuman.create_review("YOUR_REVIEW_TYPE_ID")
review.set_review_data({
"example1": "value1",
"example2": true,
})
review.set_review_config({...})
review.set_meta_data({...})
try:
response = review.send_request() # or: await review.async_send_request()
print("Review sent successfully:", response)
except Exception as e:
print("An error occurred:", e)
```
```javascript theme={null}
const reviewRequest = gotoHuman.createReview("YOUR_REVIEW_TYPE_ID")
.setReviewData({
"example1": "value1",
"example2": true,
})
.setReviewConfig({...})
.setMetaData({...})
await reviewRequest.sendRequest()
```
See [API Reference](/api-reference/request-review) for the request properties.
### Images / Videos
For images and videos – including CDN storage, URLs, base64, file uploads, and image editing – see [Images and videos](/images-videos).
### Assign reviewers
To send a review request only to selected users of your team, add a list of email addresses of those users. Use the email address used when signing up for gotoHuman.\
Available on Team plan and above.\
This otherwise defaults to all users or the user who [triggered](/manual-triggers) the workflow.
You can also [assign reviewers on the review type](/create-template#assign-to-specific-reviewers) for all requests of that type. A request-level assignment takes precedence over the review type assignment.
```json theme={null}
{
"formId": "abcdef12345",
"fields": {
...
},
"assignTo": ["reviewer@acme.org"]
}
```
Our n8n node shows a field `Assigned Users`. Select `All Users` or alternatively `Only selected users` and map or enter their email addresses.
Read more in our [n8n integration guide](/Integrations/n8n).
Our module shows a field `Assigned Users`. Select `All Users` or alternatively `Only selected users` and map or enter their email addresses.
Read more in our [Make integration guide](/Integrations/make-com).
```python theme={null}
review = gotoHuman.create_review("abcdef12345")
review.set_review_data({...})
review.assign_to_users(["reviewer@acme.org"])
try:
response = review.send_request()
print("Review sent successfully:", response)
except Exception as e:
print("An error occurred:", e)
```
```javascript theme={null}
const reviewRequest = gotoHuman.createReview("abcdef12345")
.setReviewData({...})
.assignToUsers(["reviewer@acme.org"])
await reviewRequest.sendRequest()
```
# Slack
Source: https://docs.gotohuman.com/slack
The gotoHuman Slack integration is a very convenient way to receive notifications for new review requests. It also provides an up-to-date overview of any pending items since the status of a review is always updated in the corresponding Slack message.
### Setup
On the **Notifications** page, you can connect a Slack workspace to your gotoHuman team and select a channel that you want to post to.
You might see a warning when connecting your Slack workspace: "This app is not approved by Slack." This is the case until it has undergone an extensive review process. Be ensured, that our integration only requests the minimum permissions required.
### Notification
You'll get a notification in the selected Slack channel for each new request for review.
### Auto-updated messages
The status of a review is always synchronized with its corresponding Slack message. This provides you with a good overview of your pending items right in your selected Slack channel.
# Talk to us
Source: https://docs.gotohuman.com/talk-to-us
Questions or feedback? Get in touch with our team.
For any questions or feedback, get in touch via [support@gotohuman.com](mailto:support@gotohuman.com) or book a call with us: [https://calendly.com/gotohuman/intro](https://calendly.com/gotohuman/intro)
# Terms of Service
Source: https://docs.gotohuman.com/terms-of-service
Last updated: 02/13/2026 : gotoHuman UG (haftungsbeschränkt), Lydia-Rabinowitsch-Str. 14, 10557 Berlin, Germany (“”, “”, “”) :
**Agreement.** These Terms of Service (“**Terms**”) govern access to and use of the Service (as defined below) by the entity you represent (“**Customer**”, “**you**”). By any of the following, you agree to be bound by these Terms: (a) creating an account, (b) clicking to accept, (c) purchasing or paying for a subscription, (d) accessing or using the Service, or (e) signing (or being bound by) any agreement that incorporates these Terms by reference.
**Business-to-business only.** The Service is offered only for business and professional use. You confirm that you are not acting as a consumer.
**Authority.** If you use the Service on behalf of an entity, you represent and warrant that you have authority to bind that entity to these Terms. If you do not have such authority, you must not use the Service.
**Affiliates and subcontractors.** Provider may perform its obligations through affiliates and subcontractors (including hosting and other infrastructure providers). Provider remains responsible for performance of the Service under these Terms, subject to the limitations in these Terms.
***
## **1. Introduction**
1.1 **What makes up the Agreement.** The “**Agreement**” between Customer and Provider consists of: (a) these Terms; (b) any applicable Order Form(s); and (c) any separate, mutually signed written agreement that expressly governs the Service (if any).
1.2 **Order Forms (including self-serve checkout).** An “**Order Form**” means (a) the checkout flow, order confirmation, or plan selection that identifies the subscription plan, fees, billing cycle, included limits, and any usage-based pricing, or (b) a mutually executed written order form or statement of work that references these Terms.
1.3 **Precedence.** If there is a conflict, the following order controls (highest to lowest):
1. a separate, mutually signed written agreement that expressly governs the Service (if any),
2. the applicable Order Form, and
3. these Terms.
1.4 **Customer terms excluded.** Any terms and conditions provided by Customer (including purchase order terms) are excluded and will not apply, even if referenced by Customer, unless Provider expressly agrees in writing.
1.5 **Privacy Policy.** Our Privacy Policy describes how we collect and use personal data when we act as a controller (for example, website visitors, billing contacts, and account administrators).
1.6 **Data Processing Addendum.** If the parties execute a separate data processing addendum (“**DPA**”), the DPA will apply to the extent Provider processes personal data on Customer’s behalf as a processor under applicable data protection law. The DPA is not part of the Agreement unless and until it is executed by the parties.
***
## **2. Definitions**
For purposes of the Agreement:
2.1 **“Service”** means Provider’s hosted software-as-a-service offering, including the web application, APIs, and related functionality provided by Provider, as further described in the Documentation.
2.2 **“Documentation”** means Provider’s then-current user, technical, and API documentation made available by Provider (e.g., via the Service’s or Provider’s website) describing features, requirements, and permitted use.
2.3 **“Authorized User”** means any natural person authorized to access or use the Service in connection with Customer’s account, including Customer’s employees and contractors, and any other person invited, provisioned, or otherwise granted access by Customer or its Authorized Users, including via a token-based link or similar access mechanism to access any portion of the Service.
2.4 **“Seats”** means the number of Authorized Users permitted under Customer’s subscription plan or Order Form. Unless otherwise stated in an Order Form, each Authorized User counts toward the Seat total, including any person granted limited or task-specific access (including via a token-based link or similar access mechanism).
2.5 **“Customer Data”** means all data, content, files, text, prompts, inputs, outputs, annotations, feedback, and other materials that Customer (or Authorized Users on Customer’s behalf) submits to or through the Service, including via API and through the web application, and including any content transmitted by the Service to Customer-designated systems via webhook.
2.6 **“Customer Personal Data”** means any Customer Data that constitutes personal data under applicable data protection law.
2.7 **“Restricted Data”** means: (a) special categories of personal data under Article 9 GDPR (or equivalent categories under other applicable law), (b) personal data relating to criminal convictions and offences under Article 10 GDPR (or equivalent), (c) protected health information or other health data regulated under health privacy laws (e.g., HIPAA), and (d) any other sensitive or highly regulated data types that Provider expressly designates as restricted in the Documentation or Service’s interface from time to time.
2.8 **“Fees”** means the amounts payable by Customer for the Service as specified in an Order Form, including subscription fees, seat-based fees, and usage-based fees.
2.9 **“Billing Cycle”** means the recurring billing interval (e.g., monthly or annually) specified in the Order Form.
2.10 **“Review”** or **“Review Request”** means a request submitted by or on behalf of Customer to the Service (including via API or other supported interfaces) to create, send, record, or process a review-related item or event that is made available within the Service (including for inspection, analytics, notification, or reporting), regardless of whether it is intended for human review or results in human review. Review Requests may include other interactions (such as chat messages or similar interactions) where specified in the Order Form or Documentation.
2.11 **“Data Volume”** means the total volume of data transmitted to the Service in connection with usage (such as file uploads or Review Requests), as measured by Provider for purposes of fair-use limits and overage billing where applicable. Data Volume measurement and any associated allowances, limits, or overage charges are specified in the Order Form or Documentation.
***
## **3. The Service**
3.1 **Service description.** Provider operates a software-as-a-service (SaaS) solution that enables businesses to connect, manage, and facilitate communication with their own applications, agents, assistants, and workflows (including through chat and other interaction methods), and to view and work with responses and related artifacts within the solution (the “Service”).
3.2 **Documentation governs.** Customer will use the Service in accordance with the Documentation (including any technical requirements, usage rules, and implementation guidance). Provider may update the Documentation from time to time, and the updated Documentation will apply prospectively.
3.3 **Support.** Provider may offer support and service resources as described in the Documentation, within the Service, or on Provider’s website for the applicable plan (if any). Unless expressly stated in an Order Form or other written agreement, Provider does not promise any specific support response times, availability commitments, or service levels.
3.4 **Changes to the Service.** Provider may update, modify, or enhance the Service from time to time. Changes (including notice and Customer remedies for Materially Adverse Changes) are governed by Section 14.
3.5 **Suspension.** Provider may suspend or limit Customer’s or any Authorized User’s access to the Service (in whole or in part) if Provider reasonably believes: (a) Customer or an Authorized User violates the Agreement (including the Acceptable Use / prohibited-use provisions), (b) Customer’s use poses a security risk to the Service, Provider, Customer, or third parties, (c) Customer’s payment is overdue for undisputed Fees, (d) suspension is required by law or at the request of a government authority, or (e) Customer’s use threatens the availability, confidentiality, or integrity of the Service (including via excessive load or misuse). Provider will use reasonable efforts to provide notice of a suspension and to restore access promptly after the issue is resolved, unless Provider determines that notice would (i) compromise security, (ii) violate law, or (iii) risk harm to Provider, the Service, or third parties.
***
## **4. Fees, Billing, Taxes**
4.1 **Fees and Order Form.** Customer will pay the Fees specified in the applicable Order Form. For self-serve subscriptions, the plan selection and confirmation in the in-product checkout/upgrade flow constitutes an Order Form and no signature is required. If fees or payment terms differ in an Order Form or separate written agreement, the order of precedence in Section 1 applies.
4.2 **Billing Cycle; renewal.** Subscriptions are billed per Billing Cycle as stated in the Order Form and auto-renew unless Customer cancels renewal using the then-current mechanism in the Service or by contacting support. Agreement termination (account closure) is governed by Section 12.
4.3 **Payment method; authorization.** Customer must provide a valid payment method (e.g., credit card) and accurate billing information. By providing a payment method, Customer authorizes Provider (and its payment processor) to charge Customer’s payment method for all Fees, taxes, and other amounts due under the Agreement, including recurring charges and any usage-based charges incurred.
4.4 **Invoicing fallback; late payment; suspension.** If an automatic charge fails, Provider may issue an electronic invoice and Customer will pay the invoiced amount within 14 days of invoice date (unless otherwise stated on the invoice). Amounts not paid when due may accrue interest at the lower of (a) the statutory rate or (b) 1% per month, and Customer will reimburse reasonable costs of collection where permitted by law. Provider may suspend access to the Service for non-payment in accordance with the Agreement, after providing notice where practicable.
4.5 **Taxes.** Fees are exclusive of all taxes, duties, levies, and similar governmental assessments, including VAT/GST and sales/use taxes (other than taxes on Provider’s net income). Customer is responsible for paying all such taxes. If Customer is exempt from certain taxes, it must provide Provider with valid documentation (e.g., a VAT ID) and cooperate with reasonable requests to substantiate exemption or reverse-charge treatment.
4.6 **Time of Billing.** At the beginning of each Billing Cycle, Provider will charge (a) the monthly base fee; and (b) Seat fees for the then-current number of billable Seats. Usage-based fees are billed at the end of each Billing Cycle and/or earlier in shorter intervals at Provider’s choice.
4.7 **Usage-based and seat-based charges.** If the Order Form includes usage-based pricing, seat-based pricing, or both:
* **Usage measurement.** Usage is measured as described in the Documentation and/or pricing/checkout materials. Provider may bill usage-based charges in arrears (at the end of the Billing Cycle or in shorter intervals) and/or charge them as incurred, as stated in the Order Form. Where Customer operates multiple workspaces, usage may be calculated in bundles per workspace and then summed across workspaces for consolidated billing.
* **Overages.** If Customer exceeds plan limits, Provider may charge overage fees at the then-current rates presented in the Service, Documentation, or Order Form.
* **Fair-use limits and API rate limits.** Unless Review Requests are billed on a usage-based basis under the applicable Order Form, Review Requests are subject to a fair-use limit of **10,000 Review Requests per billable Seat per month**. Data Volume is subject to a fair-use limit of **10GB per billable Seat per month**. API requests are subject to a rate limit of **1 request per second**.
* **Seat changes.** If Customer adds Seats/Authorized Users mid-cycle, Provider may charge the incremental seat fees immediately and/or pro-rate them for the remainder of the Billing Cycle (as described in the Order Form or checkout flow). For certain plan types (such as Agency plans), the number of billable Seats may be automatically adjusted based on the number of users in Customer's workspaces (rather than being pre-purchased by Customer), and Customer authorizes Provider to charge for such automatically added Seats. Seats/Authorized Users count and counting rules are as defined in Section 2.
4.8 **Upgrades, downgrades, and add-ons.** Customer may upgrade, downgrade, or add features/add-ons if such options are supported by the Service. Changes may take effect immediately or at the start of the next Billing Cycle, as described in the Service at the time of change. Provider may apply pro-rated charges or credits for changes, and may set minimum terms for certain add-ons, as disclosed at purchase. Upon the effective date, Customer’s access to features, usage limits, and retention periods will be those of the new plan.
4.9 **Fee changes.**
* **Public pricing changes.** Provider may change its publicly listed Fees and pricing for plans from time to time. Such changes apply only to new purchases and renewals after the effective date of the change.
* **Existing subscriptions.** Provider may change Fees for an existing paid subscription effective at renewal of the then-current Billing Cycle by giving at least thirty (30) days’ prior notice (e.g., via email or in-product notification).
* **Mid-cycle changes.** During an ongoing Billing Cycle, Provider will not increase the Fees for that Billing Cycle except for (i) add-ons or upgrades Customer elects, (ii) usage-based overages incurred by Customer, or (iii) changes in applicable taxes.
* **Legally required changes.** If a change is required by law or regulation and materially impacts the Fees mid-cycle, Customer may cancel the affected subscription within thirty (30) days after notice, and Provider will refund any prepaid Fees for the unused portion of the Billing Cycle, to the extent permitted by law.
4.10 **Free Offers (free tier and trials).** Provider may offer free access options (“Free Offers”), such as a free subscription tier and/or time-limited free trials of paid features, as described in the Service’s or on Provider’s website.
* **Free tier.** If Provider offers a free tier, it is provided without charge and does **not** automatically convert to a paid subscription. Customer will incur Fees only if it affirmatively upgrades to a paid plan.
* **Free trials.** If Provider offers a free trial, Provider may require a payment method to start the trial. Unless Customer cancels before the trial ends, the subscription may automatically convert to a paid subscription and Fees will begin at the end of the free trial period, as disclosed at sign-up.
* **Changes and discontinuation.** Provider may modify or discontinue any Free Offer at any time. Changes to Free Offers do not constitute a Materially Adverse Change, and any notice/termination/refund rights for Materially Adverse Changes apply only to paid subscriptions.
* **Disclaimer for Free Offers.** Free Offers are provided **“AS IS”** and, to the maximum extent permitted by law, without warranty, support, service credits, or indemnity obligations.
4.11 **Refunds.** Except as required by applicable law or expressly stated in an Order Form, Fees are **non-refundable** and Customer is not entitled to credits or refunds for partial Billing Cycles, unused usage allowances, or unused Seats.
***
## **5. Customer Responsibilities**
5.1 **Account administration; responsibility for users.** Customer is responsible for all access to and use of the Service under its account, including by its **Authorized Users**. Customer will (a) ensure that only Authorized Users access the Service, (b) manage invitations and permissions appropriately, and (c) remain responsible for its Authorized Users’ compliance with the Agreement.
5.2 **Accurate information.** Customer will provide accurate and complete account, billing, and contact information and keep it up to date.
5.3 **Customer systems and connectivity.** Customer is responsible for obtaining, maintaining, and securing all systems, devices, software, network connectivity, and configurations needed to access the Service, including any systems Customer connects to the Service (e.g., via API and webhooks). Customer is responsible for the security and operation of its own systems and endpoints.
5.4 **Customer Data responsibilities.** Customer’s responsibilities relating to Customer Data are set out in Section 7.3.
5.5 **Credentials and access security.** Customer will protect and keep confidential all credentials, tokens, API keys, and similar access mechanisms for the Service, and will ensure they are used only within the scope permitted by the Agreement. Customer will promptly notify Provider if it becomes aware of unauthorized access to, or use of, Customer’s account, credentials, or the Service.
5.6 **Configuration responsibility (including webhooks).** Where the Service sends Customer Data to Customer-designated systems (e.g., via webhooks), Customer is responsible for (a) configuring destinations correctly, (b) securing those destinations and access credentials, and (c) ensuring it has the necessary rights, permissions, consents, and lawful bases for such transmission, as set out in Section 7.3. Customer acknowledges that Provider is not responsible for the security or operation of Customer-designated endpoints or the handling of Customer Data after delivery to those endpoints.
5.7 **Cooperation and misuse reporting.** Customer will reasonably cooperate with Provider to (a) diagnose issues with the Service, and (b) investigate suspected misuse. Customer will promptly inform Provider if it becomes aware of misuse of the Service under its account.
***
## **6. Acceptable Use**
**6.1 General rule; legal compliance.** Customer may use the Service only for lawful business purposes and in accordance with the Agreement and the Documentation. Customer is responsible for ensuring its and its Authorized Users’ use of the Service complies with applicable laws and regulations (including, where applicable, privacy, consumer protection, anti-spam, and export control/sanctions laws).
**6.2 No circumvention; usage limits; account integrity.** Customer must not circumvent (or attempt to circumvent) any technical limitations, usage limits, seat limits, quotas, or access restrictions (including by creating multiple accounts or using other workarounds). Customer must not share, transfer, or allow unauthorized use of account credentials, and will ensure only Authorized Users access and use the Service.
**6.3 Prohibited technical activities.** Customer will not, and will not permit any Authorized User or third party to: (a) reverse engineer, decompile, disassemble, or otherwise attempt to derive source code, underlying ideas, or algorithms of the Service, except to the extent such restriction is prohibited by applicable law; (b) bypass or attempt to bypass any security or access controls, rate limits, or feature gating; (c) access or use the Service to build, offer, or support a competing product or service, or resell, sublicense, or provide the Service on a service bureau/outsourcing basis, except if expressly permitted in an Order Form or signed agreement; (d) conduct security, penetration, or vulnerability testing of the Service without Provider’s prior written authorization; (e) scrape, crawl, harvest, or extract data or content from the Service using automated means, except as expressly permitted via Provider-provided APIs in accordance with the Documentation; (f) use bots, scripts, or automated means to distort usage, create accounts, simulate activity, send bulk requests/messages, or otherwise abuse the Service; (g) modify, adapt, translate, or create derivative works based on the Service (or any portion thereof), except to the extent expressly permitted by the Agreement or Documentation.
**6.4 Prohibited content and conduct.** Customer will not submit, upload, transmit, store, or make available Customer Data that: (a) is unlawful, infringing, defamatory, threatening, abusive, harassing, hateful, discriminatory, vulgar, obscene, pornographic, or otherwise violates third-party rights (including intellectual property, privacy, and publicity rights); (b) contains malware, viruses, or other harmful code; (c) is deceptive or intended to facilitate fraud, phishing, impersonation, or other wrongdoing (including misrepresenting identity or affiliation); (d) constitutes Restricted Data submitted in violation of Section 7.4; (e) constitutes unsolicited or unauthorized advertising, promotional materials, spam, chain letters, pyramid schemes, or other improper solicitation; or (f) manipulates identifiers, headers, routing information, attribution, logs, or other technical data in order to disguise the origin of content, activity, or messages transmitted through the Service.
**6.5 Security and service integrity.** Customer will not: (a) interfere with or disrupt the Service (or any networks or systems connected to the Service); (b) attempt to gain unauthorized access to the Service or related systems; (c) attack the Service via denial-of-service (DoS) or distributed denial-of-service (DDoS) techniques; or (d) use the Service in a manner that could disable, overburden, damage, or materially impair the Service or other customers’ use of the Service.
**6.6 High-risk uses.** Customer must not use the Service for safety-critical or high-risk activities where failure or malfunction could reasonably be expected to lead to death, personal injury, or significant physical or property damage.
**6.7 Enforcement and reporting.** Violations of this Section 6 may result in suspension or termination of access (as described elsewhere in the Agreement) and/or other remedies available to Provider. If Customer becomes aware of a violation of this Section 6, Customer will report it without undue delay.
***
## **7. Customer Data**
### **7.1 Ownership**
As between the parties, Customer retains all rights, title, and interest in and to Customer Data. Except for the limited rights expressly granted in this Agreement, Provider acquires no rights in Customer Data.
### **7.2 License to Provide the Service**
Customer grants Provider a **worldwide, non-exclusive, limited-term license** to **host, process, transmit, reproduce, and otherwise use Customer Data** solely as necessary to **provide, maintain, secure, and support** the Service in accordance with the Agreement and Customer’s configuration and instructions (including via API and webhooks).
### **7.3 Customer Responsibilities for Customer Data**
Customer is responsible for (a) the accuracy, quality, and legality of Customer Data, (b) obtaining and maintaining all rights, permissions, consents, and (where applicable) lawful bases and notices required to provide Customer Data to Provider and to permit Provider to process it under the Agreement, and (c) Customer’s configuration and use of the Service (including what Customer chooses to send via API and where Customer directs webhooks), and ensuring that such configuration and use complies with applicable law, third-party rights, and Customer’s own policies and commitments to end users.
### **7.4 Restricted Data**
Unless Provider expressly agrees in writing (e.g., in an Order Form or signed agreement), Customer will **not submit Restricted Data** to the Service. If Provider becomes aware that Restricted Data has been submitted, Provider may **remove it, restrict processing, or suspend the Service** to the extent reasonably necessary to protect the Service, Customer, other customers, or comply with law.
### **7.5 No Sale; No Training**
Provider will **not sell Customer Data** to third parties. Provider will **not use Customer Data to train machine learning or AI models**.
If Provider offers an optional feature in the future that involves training or model improvement using Customer Data, that use will require **Customer’s explicit opt-in** (e.g., in-product or in writing) and will be governed by **separate, additional terms** describing scope, controls, and any exclusions.
### **7.6 Service Data**
Provider may generate and use technical and usage data generated by or derived from operation of the Service (e.g., telemetry, logs, performance metrics, diagnostics, and usage analytics) to operate, maintain, secure, support, and improve the Service. Such data may include identifiers (e.g., account and user IDs, device and session identifiers, and IP addresses). To the extent any of this data constitutes personal data, Provider will process it as described in the Privacy Policy and, where applicable, under any executed DPA.
### **7.7 Access and Disclosure**
Provider will not make Customer Data available to other customers except as directed by Customer through the normal operation of the Service (for example, if Customer configures collaboration or shares outputs).
Provider may disclose Customer Data to its affiliates and subprocessors **solely to provide the Service**, provided they are bound by confidentiality obligations.
### **7.8 Data Protection Addendum**
If the parties execute a **DPA**, the DPA will apply to Provider’s processing of **Customer Personal Data** on Customer’s behalf and will control over this Section 7 to the extent of any conflict for that processing. Otherwise, this Agreement does not grant Customer any DPA-specific rights beyond what is expressly stated in the Agreement.
***
## **8. Intellectual Property**
8.1 **Provider Property.** The Service (excluding Customer Data) and its features and functionality, the Documentation, and all improvements, enhancements, modifications, and derivative works thereof (collectively, “Provider Property”) are and will remain the exclusive property of Provider and its licensors. Provider Property is protected by copyright, trademark, and other intellectual property laws.
8.2 **License to use the Service.** Subject to Customer’s compliance with this Agreement and payment of applicable Fees, Provider grants Customer a limited, revocable, non-exclusive, non-transferable right during the subscription Term to access and use the Service and Documentation solely for Customer’s internal business purposes and only in accordance with this Agreement and the applicable Order Form.
8.3 **No implied rights.** Except as expressly stated in this Agreement, no license or other rights are granted by Provider to Customer (whether by implication, estoppel, or otherwise), and all rights not expressly granted are reserved.
8.4 **Trademarks.** Provider’s name, logos, and trademarks are Provider Property. Customer may not use Provider’s trademarks or trade dress in connection with any product or service without Provider’s prior written consent, and no license to Provider’s trademarks is granted by this Agreement.
8.5 **Customer Marks; Publicity.** Customer grants Provider a limited, non-exclusive, worldwide, royalty-free, revocable license to use Customer’s name, logos, and trademarks (“Customer Marks”) solely to identify Customer as a customer of the Service on Provider’s website and in Provider’s promotional and marketing materials. Customer may revoke this permission at any time by contacting Provider in writing, and Provider will promptly cease using the Customer Marks in future materials and, where commercially reasonable, remove the Customer Marks from Provider-controlled channels.
***
## **9. Warranties**
**9.1 Limited warranty.** During an active paid subscription term, Provider warrants that the Service will conform in all material respects to the Documentation. A material failure to conform is a “**Defect**.”
**9.2 Reporting.** Customer must notify Provider of any Defect without undue delay after becoming aware of it and provide reasonable information and cooperation to help Provider verify and address the Defect.
**9.3 Remedies.** Provider will use commercially reasonable efforts to remedy a Defect by (a) correcting the Defect, (b) providing a workaround, or (c) replacing the affected functionality, in Provider’s discretion. If Provider does not remedy the Defect within a reasonable time, Customer may terminate the affected subscription for cause and receive a refund of prepaid Fees for the unused remainder of the then-current Billing Cycle. This Section 9.3 states Customer’s sole and exclusive remedies for breach of the warranty in Section 9.1.
**9.4 Exclusions.** The warranty in Section 9.1 does not apply to issues caused by: (a) Customer Data; (b) Customer’s or Authorized Users’ misuse of the Service or use outside the Agreement or Documentation; (c) Customer’s systems, networks, configurations, or internet access; or (d) third-party services or integrations (including Customer-designated webhook destinations).
**9.5 Disclaimer.** Except as expressly stated in this Section 9, the Service and Documentation are provided “as is” and Provider disclaims all other warranties to the maximum extent permitted by applicable law, including implied warranties of merchantability, fitness for a particular purpose, and non-infringement.
**9.6 Mandatory rights.** Nothing in the Agreement excludes or limits rights or warranties that cannot be excluded or limited under applicable law.
***
## **10. Indemnities**
### **10.1 Customer Indemnity**
Customer will **indemnify and hold harmless** Provider, its affiliates, and their respective directors, officers, employees, and agents from and against any third-party claims, demands, suits, proceedings, and investigations, and all related losses, liabilities, damages, judgments, penalties, and reasonable costs and expenses (including reasonable attorneys’ fees) (together, **“Losses”**) arising out of or relating to:
(a) **Customer Data**, including any allegation that Customer Data, or Customer’s collection, use, transmission, or disclosure of Customer Data, violates applicable law or third-party rights; (b) Customer’s or any Authorized User’s use of the **Service** (including via API, webhooks, or integrations), or Customer’s products/services or systems connected to the Service; or (c) Customer’s or any Authorized User’s breach of this Agreement, applicable law, or third-party terms applicable to Customer.
This Section 10.1 does not apply to the extent a claim is caused solely by Provider’s **willful misconduct** or **gross negligence**.
### **10.2 IP Claims About the Service**
If a third party alleges that the Service infringes or misappropriates its intellectual property rights, Provider may, at its option: (a) modify or replace the Service to resolve the allegation, (b) obtain a right for Customer to continue using the Service, or (c) terminate the affected subscription and refund prepaid fees for the unused portion of the then-current paid subscription term. Provider has no obligation under this Section 10.2 to the extent the allegation arises from Customer Data, combinations with items not provided by Provider, modifications not made by Provider, or use not in accordance with this Agreement or Documentation. This Section 10.2 is Customer’s sole and exclusive remedy for such allegations.
### **10.3 Procedure**
The indemnified party must notify the indemnifying party **without undue delay** after becoming aware of a claim and provide reasonable cooperation (at the indemnifying party’s expense). The indemnifying party may control the defense and settlement, except that it may not settle a claim in a way that imposes non-monetary obligations or admissions of fault on the indemnified party without consent (not to be unreasonably withheld).
***
## **11. Limitation of Liability**
### **11.1 Exclusion of Indirect Damages**
To the maximum extent permitted by applicable law, **neither party** will be liable to the other for any **lost revenues, lost profits, loss of business, loss of goodwill, or any indirect, consequential, incidental, special, exemplary, or punitive damages**, arising out of or relating to this Agreement or the Service, regardless of the theory of liability.
### **11.2 Liability Cap**
To the maximum extent permitted by applicable law, **except** for (a) Customer’s payment obligations and (b) Customer’s obligations under **Section 10.1 (Customer Indemnity)**, each party’s total aggregate liability arising out of or relating to this Agreement will not exceed the **fees actually paid** by Customer to Provider for the Service in the **twelve (12) months** preceding the first event giving rise to the claim.
### **11.3 Cardinal Obligations**
In cases of **simple negligence**, Provider is liable only for breach of a contractual obligation the fulfillment of which is essential to the proper performance of this Agreement and on which Customer may regularly rely (**“cardinal obligation”**), and then only for **foreseeable, typical damages**. In all other cases of simple negligence, liability is excluded to the extent permitted by law.
### **11.4 Non-Excludable Liability**
Nothing in this Agreement limits or excludes liability for **intent, fraud, or gross negligence**, or for **death, personal injury, or health damage**, or for any other liability that cannot be limited under applicable law.
### **11.5 Force Majeure**
Except for payment obligations, neither party will be liable for failure or delay caused by events beyond its reasonable control.
***
## **12. Term, Renewal, and Termination**
**12.1 Auto-renewal.** Unless the Agreement is terminated in accordance with this Section 12 or otherwise agreed in an Order Form, any paid subscription will automatically renew at the end of each Billing Cycle for a further Billing Cycle.
**12.2 Termination by Customer (without cause).** Customer may terminate the Agreement at any time with effect at the end of the then-current Billing Cycle by closing its account in the Service (if available) or by giving written notice (including email) to Provider.
**12.3 Termination by Provider (without cause).** Provider may terminate the Agreement without cause by giving at least thirty (30) days’ prior notice, with effect on the termination date stated in the notice. Provider will refund prepaid Fees for the unused portion after the effective termination date (including any unused portion of the then-current Billing Cycle), to the extent permitted by law.
**12.4 Termination for cause.** Either party may terminate the Agreement immediately for a material breach that cannot be cured, or upon **30 days’** prior written notice if the breach is curable and not cured within that period. If Customer terminates the Agreement due to Provider’s uncured material breach, Provider will refund any prepaid Fees covering the unused portion of the then-current Billing Cycle after the effective termination date.
**12.5 Effects of termination.** On the effective termination date: (a) Customer’s right to access and use the Service ends, and Customer must stop using the Service; and (b) any Fees accrued up to the effective termination date remain payable.
**12.6 Customer Data after termination (account closure and deletion).** Within **30 days** after termination, Provider will close Customer’s account and delete or destroy Customer Data, except to the limited extent retention is required by law, necessary for the establishment, exercise, or defense of legal claims, or persists solely in backups (which will be deleted in the ordinary course). If a DPA applies between the parties, the DPA governs deletion/return of Customer Personal Data.
**12.7 Survival.** Provisions which by their nature should survive termination will survive, including confidentiality, intellectual property, disclaimers, limitation of liability, indemnities, and accrued payment obligations.
***
## **13. Confidentiality**
13.1 **Confidential Information.** Each party (“**Disclosing Party**”) may disclose certain non-public information to the other party (“**Receiving Party**”) in connection with the Agreement. “**Confidential Information**” means any non-public information disclosed in any form (e.g., oral, written, electronic) that a reasonable person would understand to be confidential given the nature of the information and the circumstances of disclosure, including (without limitation) trade secrets, product plans, security information, business and marketing plans, pricing (other than publicly listed pricing), financial information, and technical information. Customer Data is Confidential Information of Customer.
13.2 **Protection and use restrictions.** The Receiving Party will: (a) use the Disclosing Party’s Confidential Information only to perform its obligations or exercise its rights under the Agreement; (b) protect the Confidential Information using at least the same degree of care it uses to protect its own confidential information of similar nature, and in no event less than a reasonable standard of care; and (c) not disclose the Confidential Information to any third party except as expressly permitted under this Section 13.
13.3 **Exclusions.** Confidential Information does not include information that the Receiving Party can demonstrate: (a) is or becomes publicly available through no breach of the Agreement; (b) was rightfully known by the Receiving Party without confidentiality restriction before receipt from the Disclosing Party; (c) is rightfully received by the Receiving Party from a third party without breach of any duty of confidentiality; or (d) is independently developed by the Receiving Party without use of or reference to the Disclosing Party’s Confidential Information.
13.4 **Compelled disclosure.** The Receiving Party may disclose Confidential Information to the extent required by applicable law, regulation, or a valid legal process (e.g., subpoena or court order). Where legally permitted, the Receiving Party will (a) give the Disclosing Party prompt written notice of the required disclosure, and (b) reasonably cooperate (at the Disclosing Party’s expense) to limit the disclosure to the minimum scope required.
13.5 **Permitted disclosures.** The Receiving Party may disclose Confidential Information only to the extent reasonably necessary for purposes of the Agreement and only to: (a) its employees, directors, officers, and contractors who have a need to know and are bound by confidentiality obligations at least as protective as those in this Section 13; (b) its affiliates, under equivalent confidentiality protections; and (c) its professional advisors and service providers (including subcontractors and hosting/infrastructure providers) who are subject to legal, professional, or contractual duties of confidentiality at least as protective as those in this Section 13. The Receiving Party remains responsible for any breach of this Section 13 caused by its permitted recipients.
13.6 **Return or destruction.** Upon the Disclosing Party’s written request, the Receiving Party will promptly return or destroy the Disclosing Party’s Confidential Information, including copies, except that the Receiving Party may retain: (a) copies required to be retained by law or binding regulatory requirements; and (b) copies stored in routine electronic backups or archival systems created in the ordinary course of business, provided that such retained information remains subject to this Section 13 and is not accessed except as required for legal, compliance, or dispute purposes. If Confidential Information is required to continue performing the Agreement, the Disclosing Party may not require return or destruction of that information prior to termination or expiration of the Agreement.
13.7 **Survival.** The confidentiality obligations in this Section 13 survive termination or expiration of the Agreement for so long as the Confidential Information remains confidential, and for trade secrets, for so long as such information remains a trade secret under applicable law.
***
## **14. Changes to the Service and these Terms**
**14.1 Non-material changes.** Provider may update, modify, or enhance the Service, the Documentation, and/or these Terms from time to time. Changes that do not constitute a Materially Adverse Change may take effect immediately and may include, for example, bug fixes, security updates, performance improvements, new features, clarifications, formatting changes, and changes that do not materially reduce Customer’s entitlements or materially increase Customer’s obligations or risk under the Agreement.
**14.2 Materially Adverse Changes (paid subscriptions only).** If Provider makes a Materially Adverse Change affecting a Customer on a paid subscription, Provider will provide Customer at least thirty (30) days’ prior notice (e.g., by email and/or in-product notice). Customer may object to the change by giving notice (including email) before the change takes effect. If Customer does not object within that period, the change is deemed accepted with effect for the future. If Customer objects, Provider may terminate the affected subscription upon two (2) weeks’ prior notice. Provider will notify Customer in the change notice of the effect of not objecting and of Provider’s right to terminate in the event of objection. If Provider terminates under this Section, Provider will refund any prepaid Fees for the unused portion of the subscription term after the effective termination date.
For purposes of this Agreement: (a) **Included Features** means the features, functionality, and limits included in Customer’s subscribed plan as set out in the applicable Order Form (including self-serve checkout confirmation or plan selection) in effect for the then-current Billing Cycle. (b) A **Materially Adverse Change** means a change that would reasonably be expected to have a material negative effect on Customer’s use of the Service or the value of the paid subscription, including any of the following: (i) removing an Included Feature or materially degrading it; (ii) materially reducing included limits/entitlements (e.g., retention periods, included usage, seat entitlements) for the then-current subscription; or (iii) amending these Terms in a way that materially reduces Customer’s rights or materially increases Customer’s obligations, liability exposure, or compliance burden in connection with its use of the Service (excluding changes that are neutral or beneficial, or that are required as described in Section 14.3).
**14.3 Exceptions (security, legal, abuse).** Notwithstanding the foregoing, Provider may implement changes without prior notice (or with shorter notice) if reasonably necessary to (a) address security, privacy, or abuse risks, (b) comply with applicable law or governmental requests, or (c) avoid material harm to Provider, the Service, Customer, or third parties. In such cases, Provider will provide notice as soon as practicable.
**14.4 Changes to Fees.** Changes to Fees are governed by Section 4.9 (Fee changes). Provider may also change plan packaging and the availability of plans or features from time to time. To the extent a plan packaging change results in a Materially Adverse Change to Customer’s Included Features for an existing paid subscription, Customer’s rights under Section 14.2 apply.
***
## **15. Miscellaneous / Final Provisions**
15.1 **No Third-Party Beneficiaries.** The Agreement is for the sole benefit of Provider and Customer and their permitted successors and assigns. No other person or entity has any rights under the Agreement.
15.2 **Assignment.** Customer may not assign or transfer the Agreement, in whole or in part, without Provider’s prior written consent (not to be unreasonably withheld). Provider may assign or transfer the Agreement, in whole or in part (including to an Affiliate or in connection with a merger, acquisition, corporate reorganization, or sale of all or substantially all assets). Provider will provide notice of any such assignment to Customer.
15.3 **Notices.** (a) **To Customer.** Provider may provide notices to Customer by email to the account email address, via the Service (including in-product notifications), or by other reasonable means. (b) **To Provider.** Customer must send notices to Provider by email and, if required by Provider for a specific notice, also to its postal address. (c) **Deemed receipt.** Email notices are deemed received when not bounced. In-product notices are deemed received when made available in the Service. (d) **Customer duty to keep contact details current.** Customer is responsible for keeping its notice contact information current.
15.4 **Compliance With Laws; Export and Sanctions.** Customer will comply with all laws applicable to its use of the Service, including applicable export control and sanctions laws. Customer represents that it is not named on any restricted party list and will not permit access to or use of the Service in violation of applicable sanctions or export laws.
15.5 **Severability.** If any provision of the Agreement is held invalid, illegal, or unenforceable, the remaining provisions will remain in full force and effect, and the invalid provision will be enforced to the maximum extent permitted to best reflect the parties’ intent.
15.6 **Waiver.** A waiver of any provision is effective only if in writing and signed by the waiving party. Failure or delay to enforce any right or provision will not constitute a waiver of that right or provision.
15.7 **Interpretation.** Headings are for convenience only and do not affect interpretation. The words “including” and “such as” mean “including without limitation.”
15.8 **Governing Law.** The Agreement is governed by the laws of the Federal Republic of Germany, excluding conflict-of-laws rules and the UN Convention on Contracts for the International Sale of Goods (CISG).
15.9 **Jurisdiction / Venue.** The exclusive place of jurisdiction for all disputes arising out of or in connection with the Agreement is **Berlin, Germany**, and the parties consent to such venue. Provider may also bring claims against Customer at Customer’s general place of jurisdiction where mandatory law permits.
15.10 **Survival.** Provisions that by their nature should survive termination or expiration will survive, including (as applicable) confidentiality, intellectual property, disclaimers, limitation of liability, indemnities, governing law, and dispute resolution.
# Complete a review
Source: https://docs.gotohuman.com/web-ui
Reviews are fully customizable based on the review types that you create. Reviewers open them from the Agent Inbox or from a notification link.
### Review UI
The UI for each review depends on [the fields that you added](/create-template#design-review-type) to the corresponding review type. Reviewers find pending reviews in their [Agent Inbox](/agent-inbox) or receive a link in an enabled notification channel ([Slack](/slack), [Email](/email-notifications)).\
The response to the [review request](/request-review#response) will also include a link to the review, so you can also forward this link to reviewers.
### External reviewers
You can add external reviewers to your workspace (go to Settings), so they can complete individual reviews. You can set up email notifications to notify them for new review requests. They receive a unique link to review without needing a user account.
The unique review links for external reviewers are also provided in the [response to the review request](/request-review#response), allowing you to distribute them through your own channels if needed.
The gotoHuman branding on the review page for external reviewers can be removed on all paid plans.
# Webhook events
Source: https://docs.gotohuman.com/webhook-events
Payloads gotoHuman sends when a review is completed or a trigger form is submitted.
The webhook is a `POST` request to your endpoint with `Content-Type: application/json`.
### Events
* `review.completed` - Whenever a review is completed
* `trigger.submitted` - When a [trigger form](/manual-triggers) is submitted.
```json title="review.completed" theme={null}
{
"event": "review.completed",
"accountId": "abFMvLv4HafQymWxKDAov",
"reviewId": "123456abcdef",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"formId": "123456abcdef",
"formName": "Review AI Draft",
"reviewResult": {
"response": "approved",
"respondingUser": "jess@acme.org",
"respondedAt": "2027-10-05T14:48:00.000Z",
"data": {
"crmUpdate": {
"entryId": "123456abcdef",
"amount": 42000,
"stage": "proposal",
"contact": {
"name": "John Doe",
"email": "john.doe@example.com",
"phone": "+1234567890"
}
}
}
},
"meta": {
"example": "LLM thread id"
},
"gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/agent123456abcdef/reviews/123456abcdef"
}
```
```json title="trigger.submitted" theme={null}
{
"event": "trigger.submitted",
"accountId": "abFMvLv4HafQymWxKDAov",
"reviewId": "123456abcdef",
"agentId": "agent123456abcdef",
"sessionId": "session789abcdef",
"formId": "abcdef123456",
"formName": "Create Marketing Campaign",
"reviewResult": {
"respondingUser": "jess@acme.org",
"respondedAt": "2027-10-05T14:48:00.000Z",
"data": {
"name": "Black Friday Campaign",
"targetAudience": "customers-active-last-30-days",
"campaignType": "email"
}
},
"gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/agent123456abcdef/reviews/123456abcdef"
}
```
### Properties
`review.completed` or `trigger.submitted`.
ID of the review.
Use it in subsequent [review requests](/api-reference/request-review#sessionId) to link reviews of the same session.
ID of the [review type](/create-template) or [trigger form](/manual-triggers).
ID of the [agent](/agent-setup) this review belongs to.
The reviewer's submission once responded.
`approved` or `rejected`. Reviews only.
Email of the reviewer who submitted.
ISO 8601 timestamp.
Data after the review – same structure as your [request](/api-reference/request-review#data) `data`, including any reviewer edits or selections.
Echo of any `meta` you sent with the request.
Map of original media URLs to CDN URLs. See [Images and videos](/images-videos#cdn-urls-in-webhooks).
Link to open the review in gotoHuman.
# Webhooks
Source: https://docs.gotohuman.com/webhooks
Communication between gotoHuman and your agents and workflows is based on webhooks.
### Webhook requests
gotoHuman calls your webhook to resume your workflow after a review is completed, or when a [trigger form](/manual-triggers) is submitted.
You can configure the webhook URL on the [request](/api-reference/request-review#webhookUrl), [review type](/create-template#type-webhook), or [agent](/agent-setup#webhook).
Find the full payload shapes for `review.completed` and `trigger.submitted` in [Webhook events](/webhook-events).
### Retries
Our webhook delivery follows an **at-least-once** approach: we retry until your endpoint returns a successful HTTP response, or until automatic retries are exhausted.
Failed deliveries are **retried automatically** – up to 7 attempts in total, with exponential backoff between tries (about 1 minute, 5 minutes, 15 minutes, 45 minutes, 2 hours, then 6 hours).
You can monitor delivery status in the review history. You can **stop** auto-retries from there if needed or trigger another delivery **manually**.
### Idempotency
In rare cases, the same event may be delivered more than once. This can happen when your server processed the request but we did not receive a timely success response – for example due to a network error, a timeout, or a non-2xx status code returned after your handler already ran. When that happens, we treat the delivery as failed and **schedule a retry**.
Retriable logic and workflows must therefore be **idempotent**: downstream side effects must be safe to replay. Setting the same value on a database row twice is usually harmless; sending an email twice is not.
#### Idempotency key header
One strategy to ensure webhook events are processed **exactly once** is to persist state somewhere recording that a given event ID has already been processed. For that purpose we provide an `Idempotency-Key` header in each webhook event. The value is unique to that delivery and stays the same across automatic and manual retries.
Before running side effects, check whether you have already processed that key. If so, return a success response without repeating the work.