How AI is applied across API Evangelist and APIs.io. Read my AI disclosure →
API Evangelist API Evangelist
Discovery
Learnings
Guidance
Toolbox
Alignment
API Evangelist LLC

Hootsuite Vai Webhooks API

### Webhook authenticationWhen setting up a virtual agent, you received a secret key that you can use to verify whether an incoming webhookrequest really comes from Inbox 2.0 without alterations. In the request headers of each webhook call is the`X-Hootsuite-Signature`. This contains an `HMAC-SHA256` signature based on the body of the request. Both the secret key you received and the signature are encoded as hexadecimal strings. Most languages come with libraries out of the box to verify this signature. Here is some sample code to verify it in Node.js:```javascriptconst secret = "..."; // do not share!const expectedSignature = request.headers["X-Hootsuite-Signature"];const actualSignature = crypto.createHmac("sha256", Buffer.from(secret, "hex")).update(request.body, "utf-8").digest("hex");if (actualSignature !== expectedSignature) {throw new createError.Unauthorized("X-Hootsuite-Signature wrong");}```Note: Make sure you calculate the signature off the body as is, before you deserialize it from JSON. During the calculation of the signature, all white space is considered significant.As part of the request body, you will find a timestamp. This is the time a request was sent. To prevent replay attacks,we recommend verifying that this timestamp is no older than 5 minutes:```javascriptif (moment(JSON.parse(request.body).timestamp).isBefore(moment().subtract(5, "minutes"))) { throw new createError.Unauthorized("Request too old");}```### EventsWhen a conversation is assigned to the virtual agent you registered in the previous section, Inbox 2.0 sends you an event via the URL you configured.Three important events are sent: - `CONVERSATION_STARTED` - `CONVERSATION_DELEGATED` - `INBOUND_MESSAGE_RECEIVED`### Common fieldsAll events have certain common fields: - type: A string that defines what kind of event occurred (currently `CONVERSATION_STARTED`, `CONVERSATION_DELEGATED`, or `INBOUND_MESSAGE_RECEIVED`). New events can be added in the future. Avoid responding with an error to unknown values; instead, ignore them. Depending on this type, the structure of data will be different. - version: A number designating the version of the type of request. Currently, the version is always 1. Versions will be used in the future for introducing non-backward-compatible changes. - idempotencyKey: A string that uniquely identifies each event. When a timeout occurs when sending you the event, (or we receive an error response), we will retry the event. This key can help you to ensure that a request is processed only once. - timestamp: The timestamp when we sent the request. This is used to counter possible replay attacks. - data: An object that contains structured data for the specific type. For example, an `INBOUND_MESSAGE_RECEIVED` type event has fields such as `conversationId` and `message`. Fields may be added in the future.### RequirementsTo provide a good customer experience, some non-functional requirements are imposed on the webhook. When a webhook issent, you have 10 seconds to respond with a 200 OK. If a timeout occurs, we will retry 3 times using an exponentialbackoff (up to 2 seconds). If the failures persisted during the retries, the assigned conversation will be handed overto a human agent by placing it in the New queue.When the contact sends a message through Inbox 2.0, by default we expect the virtual agent to reply to that messagewithin 5 minutes (using either the response to the webhook call or the REST API). You can configure the timeout on thesettings page for your virtual agent (Timeout virtual agent). If the virtual agent does not answer the contact, bydefault the conversation is placed in the New queue for a human agent to pick up. This can also be configuredin `Settings`. If you prefer, you can automatically resolve the conversation and send a message to the contact (suchas "Please try again in a little while"). The virtual agent could also decide to immediately return control bysending `RESOLVED` or `HANDOVER` in the `complete` field.Similarly, after a `CONVERSATION_DELEGATED` event, your virtual agent has 5 minutes to pose a question to the contact bydefault. If the virtual agent fails to do this, the conversation is handed back to the previous owner of theconversation or placed in the New queue, depending on the handoff rule.### ResponseYour response to the webhook should be a status `200 OK`. In the body, you can return the response you want to send to the contact: ```json { "sendMessage": { "text": "Hi! How can I help you?", "attachment": "funny_cat.gif" }, "applyTopics": [ "Hotel Reservation" ], "applyTags": [ "Happy" ], "setContactAttributes": { "account_number": "19758293529351" }, "complete": "HANDOVER" } ```- sendMessage: (Optional) The message you want to send to the contact. You can send only text, only an attachment, or both at the same time. If you want to send an attachment, you must upload it first, so we recommend using the asynchronous flow.- applyTopics: (Optional) The list of topics you want to apply to the conversation (the intent or action that your Virtual Agent matched). Topics that do not exist in Inbox 2.0 will be ignored.- applyTags: The list of tags you want to apply to the message from the contact. Tags that do not exist in Inbox 2.0 will be ignored. It's only possible to use `applyTags` in response to an `INBOUND_MESSAGE_RECEIVED`. It's also possible to tag a specific message by specifying the `messageId`. In that case you can respond using ```json { "applyTags": [{ "messageId": "cc75552a-1a78-11e9-855e-6d1e71016abf", "tag": "Happy" }] } ```- setContactAttributes: The attributes you want to set on a contact. The object is a map between the attribute definition's alias and value to set.- complete: (Optional) This can be either `HANDOVER` if you want to give the conversation to another agent, or `RESOLVED` if you want to resolve the conversation. When you pass HANDOVER, the handoff rule you configured in settings determine what will happen next. If the handoff rule is "No one," the conversation is placed in the New queue without an owner. Any human agent can pick up the conversation. If the rule has been set to "Previous agent,"the conversation will be assigned back to the previous human agent. If there was no previous agent, the conversation is placed in the New queue without an owner. If you are integrating with an asynchronous bot platform, you can simply return an empty JSON body {} and send this message using a POST request. We also recommend using the REST API when you want to send an attachment. You can respond with {}, upload an attachment using a PUT request, and then send the attachment using a POST request.

Hootsuite Vai Webhooks API is one of 21 APIs that Hootsuite publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

The published artifact set on APIs.io includes an OpenAPI specification, API documentation, an API reference, a getting-started guide, authentication docs, and rate-limit docs.

This API exposes 0 operations across 0 paths, and defines 7 schemas. It is described by OpenAPI 3.2.0, at version v1.

Requests are made against a single base URL, https://platform.hootsuite.com.

0 operations 0 paths 7 schemas

Metadata

The identity and technical contract details declared by the specification.

Specification
OpenAPI 3.2.0
API Version
v1
Base URL
https://platform.hootsuite.com/v1
Authentication
HTTP Bearer, HTTP Basic, OAuth 2.0, API Key

Authentication & Security 4

Hootsuite Vai Webhooks API declares 4 security schemes for authenticating requests. It accepts HTTP bearer tokens (bearer-token). It accepts HTTP basic authentication (basic-auth). It supports OAuth 2.0 (Oauth2ClientCredentials) using the clientCredentials flow, exposing 1 scope. An API key is passed in the header as X-Hootsuite-Signature (SharedSecret). By default, every request must be authenticated.

Schemas 7

The contract defines 7 schemas that model the data the API accepts and returns. The most detailed are ConversationManipulation (8 properties), ConversationData (6 properties), VaiWebhookEvent (3 properties), Message (2 properties). Each schema is shown below with its type and property counts.

Message
object
The messages you want to send
2 properties
ConversationManipulation
object
8 properties
InboundMessageReceivedEvent
ConversationDelegatedEvent
ConversationData
object
6 properties
VaiWebhookEvent
object
3 properties
ConversationStartedEvent

Specification

The full machine-readable OpenAPI contract behind this narrative.

Source

hootsuite-vai-webhooks-api-openapi.yml Raw ↑

Other APIs Hootsuite publishes across the network.

Hootsuite Developer Documentation MCP
Hootsuite Analytics API
Hootsuite Authentication API
Hootsuite Comments API
Hootsuite CRM Rest API
Hootsuite CRM Webhooks API
Hootsuite Me API
Hootsuite Media API
Hootsuite Members API
Hootsuite Messages API
Hootsuite Organizations API
Hootsuite Proactive Messaging Rest API
Where this information came from

This is an independent, third-party profile of Hootsuite Vai Webhooks API, published by API Evangelist. We do not operate, host, resell, or support these APIs, and we are not affiliated with or endorsed by the company unless stated above. Everything here is built from publicly available information — the company's own site, developer portal, documentation, public repositories, and the specifications it publishes for public use. Nothing is obtained by breaching a system, defeating an access control, or using credentials.

The Kin Score and Agent Readiness rating are independently calculated assessments of a company's public API artifacts, scored against a published rubric. They are not certifications, endorsements, security assessments, or audits.

Corrections, re-scores, and removal are free — no partnership or purchase required, and you do not need to justify the request. A removed company is recorded as unrated, never scored zero for having asked. Acknowledgement within one business day; removal within two.

info@apievangelist.com · Read the full data-sourcing policy →
On a security or compliance team? Put security in the subject line and you will get a person, not a form — we will tell you exactly which public URLs this profile was built from.