# 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/) [https://github.com/gotohuman/examples-langgraph-py](https://github.com/gotohuman/examples-langgraph-py) | 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/) [https://github.com/gotohuman/gotohuman-langgraph-lead-example](https://github.com/gotohuman/gotohuman-langgraph-lead-example) # LangGraph via MCP Source: https://docs.gotohuman.com/Examples/langgraph-mcp An example AI agent using MCP for human approvals in LangChain ### Repo Python code and more details in our repo [https://github.com/gotohuman/examples-langgraph-py/tree/main/mcp-tool-use](https://github.com/gotohuman/examples-langgraph-py/tree/main/mcp-tool-use) # Dify Source: https://docs.gotohuman.com/Integrations/dify A plugin to use gotoHuman in your Dify workflows [https://marketplace.dify.ai/plugins/.../goto\_human](https://marketplace.dify.ai/plugins/yevanchen/goto_human?language=en-US) \*This is a community contribution # Make Source: https://docs.gotohuman.com/Integrations/make-com [Make](https://www.make.com/en?utm_source=gotohuman-app\&utm_medium=partner\&utm_campaign=gotohuman-app-partner-program) is a visual platform that lets you design, build, and automate anything – from simple tasks to complex workflows – in minutes. With Make, you can send information between gotoHuman and thousands of apps. It's fast and easy to use, visually intuitive, and requires zero coding expertise. Build powerful workflows and leverage **gotoHuman** to review AI-generated content, approve critical workflow steps, or provide additional input. To use gotoHuman in your Make automations you'll need to work with these two main modules of our Make app: **1)** A module to **send a request for human review**. You will use this anywhere in your scenario(s) where you used AI to generate some content or need human approval before a critical action. Running this step will show a new request in your inbox at gotoHuman: **2)** A trigger module to **listen to the review responses**. You will have to create a separate scenario that starts with this module. It will be triggered as soon as a review is submitted: Here is a step-by-step guide: ## 1) Create a review template In gotoHuman, [create a new review template](/create-template#design-review-template) and tailor it to your use case. In this example we add *Images* and *Text (Long)* fields with the IDs `ai_image` and `ai_text` because we want to review an AI-generated instagram post with text and an image. ## 2) Send a request from your scenario ### Add request module In Make, add the action module **Create a Review Request** of our [app](https://www.make.com/en/integrations/gotohuman) (search "gotoHuman") to your scenario where you want to include human reviews. ### Create connection When adding the module for the first time, it will ask you to create a new connection. Enter the API key that you can find in your [gotoHuman workspace](https://app.gotohuman.com). ### Select review template Now select the review template that you just created from the list: When changing your review template at any time (e.g. add a field), you need to refresh the fields in the module ### Enter values for review It will automatically find the fields you added to your review template. Go ahead and enter or map the values to be reviewed. If in some cases you don't want to show a field in the review, don't send a value for it or pass `null`. Fields that you don't pass any value for will be hidden. This is handy for optional fields, but also if you need a varying number of a type of field, e.g. 1-n text fields. Then add n fields to the review template and during a run just send values for the ones needed. For text-based fields you might in some cases not have a value for a field, but still want it to be shown to allow user input. To do that, you can just pass `emptystring`. #### Enter meta data (optional) You can optionally pass additional key-value pairs to the review that you will receive back in the response (s.below). This is useful if you have e.g. a document or conversation ID that does not need to be shown as part of the review, but you need it again after the review is completed to continue your workflow. You can also add [workflow metadata](/send-requests#workflow-metadata) to provide reviewers with an overview and navigation for each run of the workflow. #### Assign users Select whether you want everyone on your account to be able to complete the review or you want to assign only selected users. #### Update review When [allowing reviewers to request a retry (AI Retries / Prompt Edits)](/retries), you can update the review with the newly generated content and by entering/mapping its' ID in **Update for Review ID** (Toggle **Show advanced settings** first). ## 3) Handle the human response ### Add response module To handle the response of the human review, create a new scenario and add the **gotoHuman > Watch the Review Response** trigger module. This way the scenario will be triggered whenever a review is submitted. ### Create webhook You will be asked to create a new webhook. Copy the URL/address: ### Copy webhook [Add the webhook](/create-template#setup-webhook) to your review template. ### Handle review response To handle the response, you'll want to submit a test review and **run your scenario once**. Then Make sees the fields included in the `Response Values` and you can easily select it: Alternatively, you can point to the `Response Values` collection and `get()` the nested field value of your choice: `get([Response Values]; yourFormFieldId.value)`: ## 4) Run your scenario When you run your scenario and a review request is sent to gotoHuman, you'll find it in your [gotoHuman inbox](https://app.gotohuman.com). When you submit a review, the webhook trigger in the second scenario will be called and your Make workflow continues. # n8n Source: https://docs.gotohuman.com/Integrations/n8n Use our **verified [n8n](https://n8n.io/) node** to add human review and approval steps to your n8n AI agents and workflows. n8n Flow 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 [tool review](/create-template) with the fields you want reviewers to see or fill in * An [agent](/agent-setup) to select in the node (identifies which agent the review belongs to) ## 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. n8n Adding the gotoHuman node 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/). ## Actions and triggers Search for **gotoHuman** in the nodes panel to see all available actions and triggers. ### Actions **Review Request** | Operation | Description | | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Send and Wait for Response** | Send a review request and pause the workflow. The workflow resumes automatically with the review result once the reviewer submits. No agent webhook setup needed — a dynamic webhook URL is already included in the request. | | **Send** | Send a review request without waiting. Handle the response via the **On message or review/tool result for agent** trigger on your [agent webhook](/agent-setup#agent-webhook). Optionally, use the **Completed Review** trigger if you have a [tool webhook](/create-template#tool-webhook) set up. | | **Delete** | Delete an existing review request by its review ID. | **Message** | Operation | Description | | ------------------------- | ------------------------------------------------------------- | | **Send Message to Human** | Send a chat message to a human for a given agent and session. | ### Triggers | Trigger | Description | | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Completed Review** | A reviewer approved a review. If you have a [tool webhook](/create-template#tool-webhook) set up, use this trigger to execute the tool in response to the approval. | | **On message or review/tool result for agent** | Fires on your [agent webhook](/agent-setup#agent-webhook) for any review completion — and also includes the `toolResult` if a [tool webhook](/create-template#tool-webhook) was called. Also fires for [chat agent](/chat-agents) messages (`session.human_message`). | | **Submitted Agent Trigger Form** | A user submitted a [trigger form](/manual-triggers) for your agent. Output contains the submitted form data. | ## Review Request fields These fields are available when using the **Send** or **Send and Wait for Response** operations. | Field | Description | | ------------------ | -------------------------------------------------------------------------------------------------------------------------- | | **Agent** | The [gotoHuman agent](/agent-setup) this review belongs to. Choose from the list or enter an ID. | | **Tool review** | The [tool review](/create-template) to use. | | **Review Data** | JSON object with the field values to populate the review. Any property can be freely mapped to a field in the tool review. | | **Review Config** | Optional JSON to dynamically configure the review and its fields at request time. | | **Session ID** | Links this review to an ongoing agent session or workflow run. | | **Assigned Users** | Restrict the review to specific users by email. Defaults to all users or the user who triggered the session. | | **Title** | Set the review title shown in the inbox and notifications. | | **Auto Approve** | Set to `true` to automatically approve the request — useful for monitoring runs without requiring human action. | ## Review request as an agent tool You can attach the **Review Request** action as a tool on an n8n AI Agent node. For a conversational setup — where the agent talks to a user in a gotoHuman [chat session](/chat-agents) and can request human review along the way — combine three pieces: 1. **On message or review/tool result for agent** trigger — starts (or resumes) your workflow when a user sends a message or a review result arrives. Pass the `sessionId` from the trigger payload into subsequent actions. 2. **Review Request** (as agent tool) — the agent calls this to request human approval. Use the same **Agent** and pass the `sessionId` to link the review to the conversation. 3. **Send Message to Human** — lets the agent post replies back into the chat session. Pass the same `sessionId`. Without the trigger and **Send Message to Human**, the review action alone cannot maintain a back-and-forth session with the user in gotoHuman. ## Handle review responses How you receive the review result depends on which operation and trigger you use. #### Send and Wait for Response No webhook setup needed. The workflow pauses at the node and resumes automatically once the reviewer submits. The review result is available as the node's output — connect it directly to your next step. #### Completed Review trigger (tool webhook) If your tool review has a [tool webhook](/create-template#tool-webhook) configured, gotoHuman calls that URL when a review is approved. Use the **Completed Review** trigger as that endpoint. This is the right pattern when you want to execute a tool or call an external system in response to an approval. #### On message or review/tool result for agent trigger (agent webhook) All review completions are also delivered to your [agent webhook](/agent-setup#agent-webhook). If a tool webhook was called and returned a response, it is included as `toolResult` in the payload. Use the **On message or review/tool result for agent** trigger to handle these in your workflow. This trigger also fires for [chat messages](/chat-agents) (`session.human_message`), making it the single entry point for agent-driven workflows that combine chat and reviews. See the full [webhook event structure](/webhooks). #### Built-in Webhook node If you need to **return data** from your workflow back to gotoHuman as the tool webhook response — so it gets passed along to the agent webhook as `toolResult` — use n8n's built-in **Webhook** node combined with the **Respond to Webhook** node. Set your Webhook node's URL as the tool webhook URL in gotoHuman. When a review is approved, gotoHuman calls that URL, your workflow runs, and the Respond to Webhook node returns the result. gotoHuman then forwards that result to your agent webhook as `toolResult`. ## Multiple items input Just like other Human-in-the-Loop / sendAndWait nodes in n8n, passing multiple items as input won't work correctly — the node would only resume once for the first response. This is due to n8n's limitation that it does not allow splitting items into separate parallel execution paths. If multiple items flow in parallel, you have these options: #### Split workflows Create a separate workflow that starts with a **When executed by another workflow** trigger node (choose "Accept all data"), followed by the gotoHuman node and the rest of your flow. Your original workflow ends with an **Execute Workflow** node (select the target workflow and choose "Run once for each item"). #### Loop over items If processing reviews sequentially is acceptable, use a **Loop over Items** node. Start the loop before the gotoHuman node, include all nodes after it, and connect the final node back to the loop input. #### Webhook + Review Request (Send) To avoid sequential processing without creating a separate workflow, use a **Webhook** node to fan out into separate execution paths on the same canvas. Each path uses the **Review Request** action with **Send** (not Send and Wait for Response) to submit the review, then handles the response via the **On message or review/tool result for agent** trigger or **Completed Review** trigger. # Reviews API Source: https://docs.gotohuman.com/agent-memory To create self-improving AI workflows and agents, use previously submitted human review responses as examples in your prompts. This is also called . You can fetch this dataset via API. ### Fetch **Endpoint:** ``` GET https://api.gotohuman.com/fetchResponses ``` **Auth Header:** ``` x-api-key: YOUR_API_KEY ``` **Query Parameters:** * `formId` (string, **required**): The ID of the tool review / form. * `fieldIds` (string, **required**): The comma-separated IDs of the fields you are interested in. * `filterResponse` (string, *optional*): Filter by review status. Possible values: `approved`, `rejected`. * `filterResponseValues` (string, *optional*): Filter by response values. See [Filtering Response Values](#filtering-response-values) for more details. * `groupByField` (boolean, *optional*, default: `false`): Whether to group the responses by field. If not, grouped by review. * `approvedValuesOnly` (boolean, *optional*, default: `false`): Lists only the response values for approved reviews. * `rejectedValuesOnly` (boolean, *optional*, default: `false`): Lists only the request values for rejected reviews. * `limit` (number, *optional*, max: 500 (Team: 100, Starter: limited)): The number of responses to return. Example: ``` https://api.gotohuman.com/fetchResponses?formId=FORM_ID&fieldIds=FIELD_ID1,FIELD_ID2&filterResponse=approved ``` ### Response Receive the values of the given fields for past submitted reviews. * `groupByField=false` ```json 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": "..." } } }, ... ] ``` * `groupByField=true` ```json 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..." }, ... ] } ``` * `approvedValuesOnly=true` `groupByField=false` (works the same for `rejectedValuesOnly=true` but would include suggested values) ```json 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": "..." }, ... ] ``` * `approvedValuesOnly=true` `groupByField=true` (works the same for `rejectedValuesOnly=true` but would include suggested values) ```json 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 tool review.{ "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 ``` # 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 URL

Add a **webhook URL** to your agent. gotoHuman will `POST` all events for that agent to this endpoint — review completions (or tool results if a separate [tool webhook](/create-template#tool-webhook) is set up that gets called on completion first), trigger form submissions, and chat messages. See [Webhook events](/webhooks) for the full list of event types and payloads. You can also set a dynamic **webhook URL** in the [review requests](/send-requests#webhookurl) you send. ### Launching agents and workflows gotoHuman works great for adding approval steps to agents that run in the background.\ But it also lets your team **start** agent runs or workflows directly in gotoHuman: * **[Trigger forms](/manual-triggers)** — let users launch a workflow from an input form. Useful for creating an agentic app that is always triggered from a predefined set of inputs. * **[Chat agents](/chat-agents)** — a common chat interface to interact with conversational agents. Both route submissions to your agent webhook, so you can continue from there. gotoHuman works perfectly well as a pure human-in-the-loop review layer without using trigger forms or chat. # Chat Agents Source: https://docs.gotohuman.com/chat-agents Let your team start agent workflows through a chat interface. Enable chat on an agent to collect input in a conversation and route it to your webhook. ### Enable chat Open your agent's settings and turn on **Enable chat**. This lets team members start new conversations from the agent inbox. Use **Reply only** when you want the agent to respond in existing chat sessions but not allow starting new ones from the inbox. ### Webhook Like [trigger forms](/manual-triggers), chat sessions use your agent's [webhook](/agent-setup#agent-webhook). When someone sends a message, gotoHuman posts a [`session.human_message` event](/webhooks) to your endpoint so you can run your app or agentic workflow. ### Starting a chat When chat is enabled, your team sees a **New chat** button on the agent inbox. Click it, send a message, and gotoHuman creates a new session and forwards the message to your webhook. ### Sessions All chats for an agent appear under **All Sessions** in the inbox. Use sessions to follow ongoing conversations and link follow-up [review requests](/send-requests) to the same run using the `sessionId`. # Create tool reviews Source: https://docs.gotohuman.com/create-template Before you can trigger a human review, you need to create a tool review that serves as a template for your reviews. ### Design tool review #### Fields Fields are the building blocks of your review interface. [Map them to properties in your request](#request-schema) to display data or capture 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. gotoHuman - Add fields #### Layout You can structure the review interface by adding columns and grids, which you can then add fields to. This gives you control over which fields should be grouped and which information should be easily scannable side-by-side. Grouping (also as a simple vertical "Group") can also be helpful for defining a single rule (see below) for conditionally showing multiple fields. #### 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 excluded by these rules will not be considered part of the current review - meaning no input validation will be performed on them, and they won't be included in the webhook event upon review submission. gotoHuman - Field rules #### Interface width You can increase the width of the review interface if more horizontal space is needed, especially when using columns or grids to show fields side by side. #### Review title When adding a text field to your tool review, you can configure it to be used as the review title in the field's settings. This title will be displayed in the [Agent Inbox](/web-ui#agent-inbox) and in [notification emails](/email-notifications) and [Slack messages](/slack), making it easier for reviewers to identify and prioritize pending reviews. The review title can be overridden for individual requests by passing a `title` attribute in your [review request](/send-requests#title). This is useful when you want to dynamically set the title based on request-specific data. #### Auto-approval You can set up a tool review to have its related requests automatically be approved. This is useful to keep monitoring even autonomously acting 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 using the [`autoApprove`](/send-requests#autoapprove) request parameter (or `meta._gthAutoApprove` set to `true`). ### Request schema When you add fields we already show you the data you need to send in your requests to fill or capture input from fields. But you are free to send any payload and just map a request property for each field. Read more about how to [send a review request](/send-requests).

Setup tool webhook (optional)

If you want your tool to be executed at a separate URL, you can add a tool webhook that will be called for all **approved** tool reviews.\ Regardless, all review submissions will be sent to your [agent webhook](/agent-setup#agent-webhook). If a tool webhook is set up, its result will also be delivered to the agent webhook so you can passthrough response data. You can add a tool webhook endpoint on the details page of the tool review. ### Webhook schema The schema of the `reviewResult` in the event we deliver to your agent and/or tool webhook will match 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 tool review 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. This is useful when you want certain types of reviews to always go to specific team members based on their expertise or role. On the details page of a tool review, you can select which users should receive reviews of this type. Only the assigned reviewers will see these reviews in their [Agent Inbox](/web-ui#agent-inbox) and receive [notifications](/notifications). While you can set reviewers in the template settings, you can also [dynamically assign reviewers](/send-requests#assign-reviewers) for individual requests. This can also be used to selectively override any template default assignments. ### External reviewers If you want to allow certain reviewers to access individual reviews without a user account, you can invite them as external reviewers. They will receive a unique link in the email notification for each review request. # 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 # Add human reviews Source: https://docs.gotohuman.com/human-reviews Drop human review steps into any AI workflow or agent — for approval gates, quality checks, or collecting input. **Human reviews** (tool reviews) let you add a human-in-the-loop step anywhere in an AI workflow or agent. They work equally well for: * **Linear workflows** — a pipeline step pauses and waits for a reviewer to approve or edit values before it continues. * **Agent tool calls** — an autonomous agent calls a review as a tool; execution blocks until a human approves or rejects. * **User-initiated agents** — workflows started by a reviewer via a [trigger form](/manual-triggers) or [chat](/chat-agents) that need a review step later in the run. ### How it works 1. **[Create a tool review](/create-template)** — design the review interface: fields to display AI-generated content, capture decisions, and collect input. Set up a webhook for results. 2. **[Request a review](/send-requests)** — call our API or SDK from your workflow to create a review request. Reviewers are notified and find the review in their Agent Inbox. 3. **[Complete a review](/web-ui)** — reviewers open the request, make edits or selections, and approve or reject. 4. **[Handle the result](/review-response)** — gotoHuman posts the result to your webhook so your workflow can continue with the reviewer's input. # 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](/webhooks) (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](/webhooks) 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": "[email protected]", "respondedAt": "2024-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 review AI‑generated content, approve actions of AI agents and workflows or provide input. Here is how to get started: * Add an [agent](/agent-setup) * Set up a [**tool review**](/create-template) * Invite your team to add reviewers * [Request reviews](/send-requests) from your AI agents and workflows using * [**n8n node**](/Integrations/n8n) * [**Make module**](/Integrations/make-com) * [**HTTP**](/send-requests#http) * [**Typescript SDK**](/send-requests#js-sdk) * [**Python SDK**](/send-requests#python-sdk) * [**MCP**](/mcp-server) * Reviewers use a [link](/notifications) or our [**Agent Inbox**](/web-ui) to edit and approve AI actions ### Get in touch 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) gotoHuman - Human approvals for AI # Trigger forms Source: https://docs.gotohuman.com/manual-triggers Offer users input forms to launch an agent from a structured set of properties ### Create form Creating a trigger form works similarly to adding fields to a tool review. Add a trigger form to an agent on its details page. gotoHuman - Manual triggers ### Webhook Trigger form submissions are sent to your [**agent webhook**](/agent-setup#agent-webhook). When a reviewer submits the form, gotoHuman posts a `event: "trigger.submitted"` event to your endpoint. See [Webhook events](/webhooks) for the full payload shape. ### Accessing the form #### Inbox UI Every trigger form adds a button to your team's Agent Inbox, so it's easily accessible. gotoHuman - Manual triggers #### 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 server 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 Use with Cursor / Claude / Windsurf ``` { "mcpServers": { "gotoHuman": { "command": "npx", "args": [ "-y", "@gotohuman/mcp-server" ], "env": { "GOTOHUMAN_API_KEY": "your-api-key" } } } } ``` [Install MCP Server](cursor://anysphere.cursor-deeplink/mcp/install?name=gotoHuman\&config=eyJjb21tYW5kIjoibnB4IC15IEBnb3RvaHVtYW4vbWNwLXNlcnZlciIsImVudiI6eyJHT1RPSFVNQU5fQVBJX0tFWSI6InlvdXItYXBpLWtleSJ9fQ==) ### Repo Find more details in our repo [https://github.com/gotohuman/gotohuman-mcp-server](https://github.com/gotohuman/gotohuman-mcp-server) # 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. # Handle result Source: https://docs.gotohuman.com/review-response Each review submission triggers a webhook with the review result. ### Agent and tool webhooks We generally send review results to the webhook you set up for each agent. Additionally, you can optionally [set up a tool webhook](/create-template#setup-tool-webhook) to be called for executing this tool: * **Tool webhook (optional)** — called when a tool review is **approved** * **Agent webhook** — receives all review completions for that agent; if a tool webhook is called, its response body is also included in the agent webhook as `toolResult` ### Payload The webhook is a `POST` request to your endpoint with `Content-Type: application/json`. Values in `reviewResult.data` follow the same shape as the `data` object in your [review request](/send-requests) — plus any reviewer edits or selections. ```json 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": "2024-10-05T14:48:00.000Z", "data": { "blogPost": "Regarding the very interesting topic of...", "rating": 7.5, "decisionSelect": "approve" } }, "meta": { "example": "LLM thread id" }, "gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/all/reviews/123456abcdef" } ``` ### 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 to gotoHuman. Make sure you have created your customized review template in gotoHuman first. ## Prepare 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 ``` Setup an environment variable with your gotoHuman API key: ``` GOTOHUMAN_API_KEY=YOUR_API_KEY ``` 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} gotoHuman = GotoHuman() ``` Install our SDK: ``` npm i gotohuman ``` Initialize the SDK: ```javascript theme={null} const gotoHuman = new GotoHuman(GOTOHUMAN_API_KEY) ``` Find your API key in gotoHuman. Send requests for review with `POST` requests to our API at `https://api.gotohuman.com/requestReview`. Include an `x-api-key` header with your gotoHuman API key. ## Send request Select the review template you created in gotoHuman. It will automatically load the fields you added to your review template and allow you to enter or map values to them. Read more in our [n8n integration guide](/Integrations/n8n). Select the review template you created in gotoHuman. It will automatically load the fields you added to your review template and allow you to enter or map values to them. Read more in our [Make integration guide](/Integrations/make-com). Create a request with the ID of the form/review template you created. Pass the field values as shown in the review template editor (click "API Request") and optionally add some meta data. ```python theme={null} review = gotoHuman.create_review("YOUR_FORM_ID") review.add_field_data("exampleField1", value1) review.add_field_data("exampleField2", value2) review.add_meta_data("threadId", threadId) review.assign_to_users(["[email protected]"]) try: response = review.send_request() print("Review sent successfully:", response) except Exception as e: print("An error occurred:", e) ``` Create a request with the ID of the form/review template you created. Pass the field values as shown in the review template editor (click "API Request") and optionally some meta data. ```javascript theme={null} const reviewRequest = gotoHuman.createReview(GOTOHUMAN_FORM_ID) .addFieldData("exampleField1", value1) .addFieldData("exampleField2", value2) .addMetaData("threadId", threadId) .assignToUsers(["[email protected]"]) await reviewRequest.sendRequest() ``` Here is the structure of the API request. Pass the ID of the form/review template you created. Pass the field values as shown in the review template editor (click "API Request") and optionally some meta data. ```json theme={null} { "formId": "abcdef12345", "fields": { ... }, "meta": { ... }, "assignTo": ["[email protected]"] } ``` ### Request attributes #### `formId` The `formId` is the ID of your review template. You can find it in the template details and the example request. #### `fields` When creating your form/review template in [our web app](https://app.gotohuman.com), you add different components to show dynamic content or collect user input. These added components determine the payload that you need to send with your request. You can find the expected format in the example request shown for your created review template (click "API Request"). Fields that you don't send any value for will be hidden. This is handy for optional fields, but also if you need a varying number of a type of field, e.g. 1-n text fields. Then add n fields and just send values for the ones needed during this run. For text-based fields you might in some cases not have a value for a field, but still want it to be shown to allow user input. To do that, simply send an empty string. #### `title` Set a custom title for the review request. This title is displayed in the [Agent Inbox](/web-ui#agent-inbox) and in [notification emails](/email-notifications) and [Slack messages](/slack), making it easier for reviewers to identify pending reviews. This overrides any title configured in the [review template field settings](/create-template#review-title). The title can also be set as a metadata property `_gthTitle` when using integrations like n8n. #### `meta` Add additional data to your request that you will receive back in the webhook. [Read more below](#add-additional-meta-data). #### `assignTo` Assign reviewers from your organization. [Read more below](#assign-reviewers). #### `updateForReviewId` When [allowing reviewers to request a retry (AI Retries / Prompt Edits)](/retries), you can update the review by referencing its' ID. #### `webhookUrl` In most cases you'll enter a static webhook URL for your agent. But in some cases you might want to pass along a dynamic webhook URL with each request using this attribute (This is what the send-and-wait node of our [n8n integration](/Integrations/n8n) does under the hood). #### `autoApprove` Set to `true` to automatically approve the review request. This is useful to keep monitoring even autonomously acting agents in gotoHuman and to easily switch back to human reviews at any time (think agent, prompt, or model updates). This can also be set at the template level or via the metadata property `_gthAutoApprove`. ### Example request Given that a urlLink (id: `linkedin`) and a text component (id: `aiDraft`) was added to a review template with ID "abcdef12345", a request might look like this: Our n8n node will automatically show you the necessary inputs according to your review template. Read more in our [n8n integration guide](/Integrations/n8n). Our Make module will automatically show you the necessary inputs according to your review template. Read more in our [Make integration guide](/Integrations/make-com). ```python theme={null} review = gotoHuman.create_review("abcdef12345") review.add_field_data("linkedin", { "label": "Rodrigo G.", "url": "https://www.linkedin.com/in/rodrigog12/" }) review.add_field_data("aiDraft", "Hey there, I saw...") 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") .addFieldData("linkedin", { label: "Rodrigo G.", url: "https://www.linkedin.com/in/rodrigog12/" }) .addFieldData("aiDraft", "Hey there, I saw...") await reviewRequest.sendRequest() ``` ```json theme={null} { "formId": "abcdef12345", "fields": { "linkedin": { "label": "Rodrigo G.", "url": "https://www.linkedin.com/in/rodrigog12/" }, "aiDraft": "Hey there, I saw..." } } ``` ### Images / Videos For images and videos—including CDN storage, URLs, base64, file uploads, and image editing—see [Images and videos](/images-videos). ### Add additional meta data When a user is done reviewing and submits the form, you will receive a webhook. For convenience, you can add additional data to your request that you will receive back in the webhook. This could be an ID of your workflow run or of a conversation thread. It could look like this: When using our sendAndWait n8n node, you shouldn't need to add meta data as you will still have access to data from previous nodes in the same workflow run. Our module shows a dedicated `Meta Data` field to add key-value pairs. Read more in our [Make integration guide](/Integrations/make-com). ```python theme={null} review = gotoHuman.create_review("abcdef12345") review.add_field_data(...) review.add_meta_data('threadId', 'oai-thread-443289') 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") .addFieldData(...) .addMetaData("threadId", "oai-thread-443289") await reviewRequest.sendRequest() ``` ```json theme={null} { "formId": "abcdef12345", "fields": { ... }, "meta": { "threadId": "oai-thread-443289" } } ``` ### 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. You can also [assign reviewers at the template level](/create-template#assign-to-specific-reviewers) for all requests from that template. Note that any request-level assignment will take precedence over the template assignment. 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.add_field_data(...) review.assign_to_users(["[email protected]"]) 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") .addFieldData(...) .assignToUsers(["[email protected]"]) await reviewRequest.sendRequest() ``` ```json theme={null} { "formId": "abcdef12345", "fields": { ... }, "assignTo": ["[email protected]"] } ``` ### Selectable options & default values When using **Buttons**, **Checkboxes**, or **Dropdowns** in your review templates, you can either define a fixed set of selectable options or send dynamic options with each request. Either way, you can also set default values that will be preselected. Read our [n8n integration guide](/Integrations/n8n#enter-values) about how to send dynamic options and defaults. For any of the mentioned field types you will see a field `Options to show` to optionally enter the selectable options and a field `Preselected Options` to enter any preselected option(s). ```python theme={null} review.add_field_data("buttons", { "options": [ { "id": "choice1", "label": "Choice 1" }, { "id": "choice2", "label": "Choice 2" } ], "default": "choice2" }) ``` ```javascript theme={null} review.addFieldData("buttons", { "options": [ { "id": "choice1", "label": "Choice 1" }, { "id": "choice2", "label": "Choice 2" } ], "default": "choice2" }) ``` ```json theme={null} { "fields": { "buttons": { "options": [ { "id": "choice1", "label": "Choice 1" }, { "id": "choice2", "label": "Choice 2" } ], "default": "choice2" } } } ``` ### Workflow metadata If your workflow includes [manual triggers](/manual-triggers) and/or multiple review steps, you can send workflow metadata, so we can provide reviewers with an overview and navigation for each run of the workflow. gotoHuman - workflow navi In the **Meta Data** field, enter JSON with a field `_gthWorkflow` holding the workflow information: ```json theme={null} { "_gthWorkflow": { "runId": "1234567890", "runName": "My Workflow", "prevSteps": [ "1234567890" ] } } ``` In the **Meta Data** field, add a key `_gthWorkflow` and enter JSON with the workflow information: ```json theme={null} { "_gthWorkflow": { "runId": "1234567890", "runName": "My Workflow", "prevSteps": [ "1234567890" ] } } ``` ```python theme={null} review.add_meta_data("_gthWorkflow", { "runId": "1234567890", "runName": "My Workflow", "prevSteps": [ "1234567890" ] }) ``` ```javascript theme={null} reviewRequest.addMetaData("_gthWorkflow", { "runId": "1234567890", "runName": "My Workflow", "prevSteps": [ "1234567890" ] }) ``` ```json theme={null} { "meta": { "_gthWorkflow": { "runId": "1234567890", "runName": "My Workflow", "prevSteps": [ "1234567890" ] } } } ``` * `runId` is a unique identifier for the current run of the workflow. You need to incl. the same `runId` in each review request of the same run to link them together. If you incl. a workflow object but no `runId` (even `{}`), and also for [manual triggers](/manual-triggers), we'll create a new runId for you and return it in the review response as `workflowRunId` so you can reference it in your subsequent review requests. * `runName` is an optional name identifying the current run of the workflow (for display purposes). You can set or overwrite it in any of your review requests during a run. * `prevSteps` is an array of reviewIds of any previous gotoHuman review step(s) (omit for first step). We need this to know how the steps are linked together. ## Response Our API responds with a `200 OK` incl. a link to the pending review: ```json theme={null} { "reviewId": "iVcn4fvRpPhAdVnZ7v0d", "gthLink": "https://app.gotohuman.com/accounts/Kb6A8ZqIaJkueTA76vv5/inbox/agents/all/reviews/iVcn4fvRpPhAdVnZ7v0d", "extReviewerLinks": [ { "email": "[email protected]", "link": "https://app.gotohuman.com/..." } ] } ``` The `extReviewerLinks` property is included when [external reviewers](/web-ui#external-reviewers) have been added/assigned to the review request. # 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. gotoHuman - Slack notification pending ### 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. gotoHuman - Slack notification done # 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 gotoHuman comes with an off-the-shelf web UI providing reviewers with an inbox to find pending reviews. Reviews themselves are fully customizable based on the that you create. ### Agent Inbox gotoHuman - Inbox ### Review UI The UI for each review depends on [the fields that you added](/create-template#design-review-template) to the corresponding review template. Reviewers find pending reviews in their Agent Inbox or receive a link in an enabled notification channel ([Slack](/slack), [Email](/email-notifications)). The response to the [review request](/send-requests#response) will also include a link to the review. If accessible (not with our n8n send-and-wait node) you can also forward this link to reviewers. gotoHuman - Inbox ### 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](/send-requests#response), allowing you to distribute them through your own channels if needed. ### Branding The gotoHuman branding on the review page for external reviewers can be removed on all paid plans. On the business plan you can also add your own logo and colors to the agent inbox, review pages and notification emails. # Webhook events Source: https://docs.gotohuman.com/webhooks Communication between gotoHuman and you agents and workflows is based on webhooks. ### Webhook requests The webhook is a `POST` request to your endpoint ([agent](/agent-setup#agent-webhook) or [tool](/create-template#tool-webhook)) with `Content-Type: application/json`. Values in `reviewResult.data` follow the same shape as the `data` object in your [review request](/send-requests) — plus any reviewer edits or selections. ### Events **Review completed** (`event: "review.completed"`): ```json 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": "2024-10-05T14:48:00.000Z", "data": { "blogPost": "Regarding the very interesting topic of...", "rating": 7.5, "decisionSelect": "approve" } }, "meta": { "example": "LLM thread id" }, "gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/all/reviews/123456abcdef" } ``` **Trigger form submitted** (`event: "trigger.submitted"`): Similar structure, but omits some fields: ```json theme={null} { "event": "trigger.submitted", "accountId": "abFMvLv4HafQymWxKDAov", "reviewId": "123456abcdef", "formId": "abcdef123456", "formName": "Start workflow", "reviewResult": { "respondingUser": "jess@acme.org", "respondedAt": "2024-10-05T14:48:00.000Z", "data": { "taskDescription": "Summarize the Q3 board deck" } }, "gthLink": "https://app.gotohuman.com/accounts/abFMvLv4HafQymWxKDAov/inbox/agents/all/reviews/123456abcdef" } ``` | Property | Description | | ----------------------------- | ----------------------------------------------------------------------------------------------------- | | `event` | `review.completed` or `trigger.submitted` | | `reviewResult.data` | Values after review — same structure as your request `data` | | `reviewResult.response` | `approved` or `rejected` (review forms only) | | `reviewResult.respondingUser` | Email of the reviewer who submitted | | `reviewResult.respondedAt` | ISO 8601 timestamp | | `sessionId` | Workflow session id, when the review is part of a session | | `meta` | Echo of any `meta` you sent with the request | | `fileCache` | Map of original media URLs to CDN URLs — see [Images and videos](/images-videos#cdn-urls-in-webhooks) | | `gthLink` | Link to open the review in gotoHuman | **Chat message sent** (`event: "session.human_message"`): Sent whenever a team member sends a message in a [chat agent](/chat-agents) session: ```json theme={null} { "event": "session.human_message", "accountId": "abFMvLv4HafQymWxKDAov", "agentId": "agent123456abcdef", "sessionId": "session789abcdef", "message": "Please make the tone more formal.", "createdAt": "2024-10-05T14:48:00.000Z" } ``` | Property | Description | | ----------- | ------------------------------------ | | `event` | `session.human_message` | | `agentId` | Chat agent id | | `sessionId` | Id to resume the session from memory | | `message` | Message text | ### 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** — for example after fixing your endpoint. ### 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. ### 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.