This is a paid bot, and its usage will be counted toward your plan's credits limit. For more information about credit usage, refer to this article.
How the Send webhook on documents completion bot works
Trigger custom integrations via webhooks when altaFlow documents are completed. Subscribe your service to completion events using the REST API, then receive POST callbacks with document metadata (flow_id, slate_id, revision_id) — perfect for connecting altaFlow to any external system that supports incoming webhooks.
Use case example: Sync completed contracts with your custom CRM, trigger a data pipeline in Snowflake, or push completion events into your internal audit dashboard — anywhere you can receive an HTTP POST request.
Installation
1. To add the bot to your workflow, select where you'd like to put it on the diagram and click the plus icon and select Bot from the menu.
2. Find the Send webhook on documents completion bot and click Install bot to add it to your workflow.
3. In the infobox, you'll find the Authorization token, which you will need for all API requests related to this bot.
Copy it and paste it as the Authorization header value in Postman or any other console of your choice.
Note: The slate_addons will have a single token within different workflow versions. Using this token, users will be able to access the data from all slate_addons and different workflow versions.
The bot operates within versioning. If versioning doesn't display, it means that your workflow only has one version by default that is always up to date. Versioning will become available right after you create another workflow version.
4. Configure the bot execution conditions and advanced settings as needed.
Conditions
Set conditions to send webhooks only in specific scenarios. Common use cases include:
Signed contracts only: Send webhook only when a "Status" field equals "Signed" — avoids triggering downstream automation on drafts or aborted signings.
Environment routing: Send to a staging callback URL when the "Environment" field equals "Test", and production URL otherwise — safe for CI/CD pipelines.
High-value events: Trigger webhooks only when the deal amount exceeds a threshold (e.g., $50,000) — keeps your data pipeline free of noise.
Skip on decline: Add a "decline reason is empty" condition to prevent webhook fires on voided documents.
Learn more about bot conditions usage in the dedicated bot execution conditions article.
Advanced settings
Fine-tune webhook delivery:
Run frequency: The bot fires once per workflow completion by default. Enable per-revision if downstream services need real-time updates on every iteration.
Failure handling: If the callback service returns non-200, the bot retries 3 times at 1-hour intervals. Choose whether to skip after retries exhausted or halt the workflow.
Document tags: Tag documents that triggered a webhook (e.g., "webhook-sent") for audit trails — check the bots log section to see all webhook attempts.
Learn more about adjusting Advanced settings in the bot setup glossary.
Once ready, click Apply.
Make a request to subscribe for document completion events
Use the POST /webhook-bot/v2/subscription endpoint to subscribe for document completion events.
Request example:
curl \
--request POST \
--url 'https://bots.airslate.com/webhook-bot/v2/subscription' \
--header 'Authorization: {{authorization_token}}' \
--header 'Content-Type: text/plain' \
--data-raw '{
"data": {
"type": "subscriptions",
"attributes": {
"callback_url": "https://automation.pdffillers.com/report/whprefill"
}
}
}'bots.airslate.com — the hostname that should be used in subsequent requests for US-based services.
bots.airslate-au.com — the hostname that should be used in subsequent requests for AU-based services.
Example:
POST https://bots.airslate-au.com/webhook-bot/v2/subscription
callback_url — the service URL that will receive webhooks.
Response example:
{
"data": {
"type": "subscriptions",
"id": "A88CB620-0000-0000-00002D5D",
"attributes": {
"callback_url": "https://automation.pdffillers.com/report/whprefill"
},
"relationships": {
"slates": { "data": { "type": "slates", "id": "B2D12859-9300-0000-0000BA29" } },
"slate_addons": { "data": { "type": "slate_addons", "id": "51131C22-A700-0000-000093F0" } },
"flow_revisions": { "data": { "type": "flow_revisions", "id": "6602784C-9300-0000-000049B7" } }
}
}
}data.id | The unique subscription identifier. |
slates.data.type | The 'slates' value means the slates.data object describes the attributes of a particular workflow. |
slates.data.id | The unique document identifier. |
flow_revisions.data.id | The unique document revision identifier. |
slate_addons.data.id | The unique identifier of a bot setup in a particular workflow version. |
Status codes: 200 (success), 400 (bad request), 401 (unauthorized), 403 (bot disabled).
Webhook response
Every time the bot is triggered (when an altaFlow user completes documents), a webhook containing the data needed to get the completed document will be sent in a POST request to the {callback_url} of your service.
flow_id — the unique workflow identifier where a document was opened or a revision created.
slate_addon_id — the unique identifier of the bot setup in a particular workflow.
slate_id — the unique identifier of the opened document.
revision_id — the unique identifier of the opened document revision.
organization_id — the unique identifier of your workspace.
Note: If the callback service is currently unavailable or the response code is not 200, the bot will retry sending the webhook three times at one-hour intervals. You can always check the status of the webhook in the bots log section.
Webhook management endpoints
Full API reference with Fetch, Subscription review, Delete, and Statistics endpoints — plus PHP and Node.js code examples — is available in the sections below.
Fetch
Send a GET request to the /webhook-bot/fetch endpoint to retrieve every document from all workflows and their versions for which the bot has sent webhooks. Optionally filter by document ID, revision ID, or workflow version ID.
curl \
--request GET \
--url 'https://bots.airslate.com/webhook-bot/v2/fetch?filter[slate_id]={slate_id_1}&filter[revision_id]={revision_id_1}' \
--header 'Authorization: {{authorization_token}}'Subscription review
Send a GET request to /webhook-bot/v2/subscription to review the active subscriptions of the bot.
curl \
--request GET \
--url 'https://bots.airslate.com/webhook-bot/v2/subscription' \
--header 'Authorization: {{authorization_token}}'Delete (unsubscribe)
To unsubscribe, send a DELETE request to /webhook-bot/v2/subscription/{subscription_id}.
curl \
--request DELETE \
--url 'https://bots.airslate.com/webhook-bot/v2/subscription/{subscription_id}' \
--header 'Authorization: {{authorization_token}}'Returns 204 on success (no response body).
Statistics
Retrieve a list of webhooks sent by the bot by sending a GET request to /webhook-bot/stats.
curl \
--request GET \
--url 'https://bots.airslate.com/webhook-bot/stats' \
--header 'Authorization: {{authorization_token}}'Filter by document IDs, revision IDs, or flow revision IDs using query parameters like filter[slate_ids], filter[revision_ids], or filter[flow_revision_ids].
Code examples
Find below the PHP and Node.js code examples for the requests described above.
PHP code
<?php
require 'vendor/autoload.php';use GuzzleHttp\Client;$client = new Client([
'base_uri' => 'https://bots.airslate.com/',
'headers' => ['Authorization' => 'your-token']
]);$url = '/webhook-bot/v2/subscription';
$statsUrl = '/webhook-bot/stats';$body = [
"data" => [
"type" => "subscriptions",
"attributes" => ["callback_url" => 'https://your-callback-url']
]
];// Add new subscription
$subscribeResponse = $client->post($url, ['json' => $body]);// Review subscriptions
$viewResponse = $client->get($url);
echo $viewResponse->getBody()->getContents();// Unsubscribe
$id = json_decode($subscribeResponse->getBody()->getContents(), true)['data']['id'];
$client->delete($url . '/' . $id);// Review webhook statistics
$statsResponse = $client->get($statsUrl);
echo $statsResponse->getBody()->getContents();You can also find the code in this GitHub example.
Node.js code
const https = require('https');// Add new subscription
const subscribeReq = https.request({
hostname: 'bots.airslate.com',
path: '/webhook-bot/v2/subscription',
method: 'POST',
headers: { Authorization: 'your-token' }
}, res => {
res.on('data', d => process.stdout.write(d));
});const data = new TextEncoder().encode(JSON.stringify({
data: {
type: 'subscriptions',
attributes: { callback_url: 'https://your-callback-url' }
}
}));subscribeReq.write(data);
subscribeReq.end();Additional GET/DELETE examples follow the same pattern. Find the full Node.js code in this GitHub example.







