The Pabbly Hook API lets you programmatically manage webhook connections, transformations, events, and folders. Build, modify, and route incoming webhook payloads to downstream services through code, and automate the connections you would otherwise wire up in the Pabbly Hook dashboard.
curl https://hook.pabbly.com/api/v1/folders \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}All endpoints are relative to the base URL below. Combine the base URL with the path on each endpoint to get the full request URL.
https://hook.pabbly.com/api/v1The API accepts JSON request bodies and returns JSON responses. Send Content-Type: application/json on every request that has a body. Path parameters are interpolated into the URL; query parameters and body fields are documented per endpoint.
{
"success": true,
"data": { /* … */ }
}When a request fails, the response status code reflects the error category and the body carries a human-readable message. Treat any non-2xx status as a failure.
| Status | Meaning |
|---|---|
| 200, 201 | Success |
| 400 | Bad request — missing or malformed parameters |
| 401 | Unauthorized — missing or invalid API credentials |
| 404 | Not found — the resource does not exist |
| 429 | Too many requests |
| 5xx | Server error — retry with backoff |
{
"success": false,
"error": "A human-readable explanation"
}The Pabbly Hook API uses HTTP Basic Auth. Every request must include your API Key and Secret Key as the username and password.
Authorization: Basic <base64({{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}})>Sign in to your Pabbly account and navigate to Settings → API Settings → Generate the Keys. You will see (or be able to generate) an API Key and a matching Secret Key. Treat the Secret Key like a password.
Send your API Key as the HTTP Basic username and your Secret Key as the password on every request. The examples on the right show how to call /folders with proper authentication.
curl https://hook.pabbly.com/api/v1/folders \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}const credentials = Buffer
.from('{{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}')
.toString('base64');
const response = await fetch(
'https://hook.pabbly.com/api/v1/folders',
{ headers: { Authorization: `Basic ${credentials}` } }
);
const data = await response.json();import requests
from requests.auth import HTTPBasicAuth
response = requests.get(
'https://hook.pabbly.com/api/v1/folders',
auth=HTTPBasicAuth('{{YOUR_API_KEY}}', '{{YOUR_SECRET_KEY}}'),
)
data = response.json()Your credentials grant full access to your account. Never embed them in browser-side code, commit them to version control, or share them in support tickets. If you suspect a credential has been exposed, rotate it from the dashboard (Settings → API Settings → Generate the Keys) and update any servers that use it.
/foldersCreate a new folder to group related webhook connections in your Pabbly Hook workspace.
e.g. sample
/folderscurl -X POST https://hook.pabbly.com/api/v1/folders \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "sample"
}'/foldersReturn every folder in the account along with its ID and name.
/folderscurl https://hook.pabbly.com/api/v1/folders \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/folders/rename/{{folderId}}Change the display name of an existing folder identified by its ID.
e.g. subfolder 5
/folders/rename/{{folderId}}curl -X PUT https://hook.pabbly.com/api/v1/folders/rename/{{folderId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "subfolder 5"
}'/folders/move-connectionMove a connection out of its current folder and into a different one.
e.g. ["conn_4d2890e85bc340b3be31406456a1a7a6"]
e.g. 664ef7516cf2e1f425971214
e.g. 664edfc3b2be40a4309362be
/folders/move-connectioncurl -X PUT https://hook.pabbly.com/api/v1/folders/move-connection \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"connectionIds": [
"conn_4d2890e85bc340b3be31406456a1a7a6"
],
"fromFolderId": "664ef7516cf2e1f425971214",
"toFolderId": "664edfc3b2be40a4309362be"
}'/folders/{{folderId}}Delete a folder and relocate every connection inside it to the root (home) folder.
/folders/{{folderId}}curl -X DELETE https://hook.pabbly.com/api/v1/folders/{{folderId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/connectionsCreate a new webhook connection that accepts incoming HTTP requests and forwards them through your configured workflow.
e.g. Create Custom Response for test 1
e.g. 67592783069f7717b89ba992
e.g. {"allowed_http_methods":["PUT","POST"],"custom_response":{"status":"active","content_type":"text/plain","content":{"name":"$request.query.name$","details":{"age":"$request.query.age$"}}}}
e.g. {"url":"https://webhook.site/60e71a16-e9fe-4bb0-b906-35f66277ddd1","rate_limit":4,"rate_limit_period":"minute","http_method":"POST"}
e.g. {"status":"active","limit":5,"interval":1,"time_limit_period":"minute","strategy":"linear"}
e.g. {"status":"inactive","interval":0}
e.g. trs_672cade8d3adcf3a0d314b1b
e.g. {"status":"active","body":{"amount":{"$gt":100},"category":{"$eq":"electronics"}},"headers":{"content_type":"text/plain"},"query":{"param1":"value1","param2":"value2"},"path":"/webhook/"}
/connectionscurl -X POST https://hook.pabbly.com/api/v1/connections \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "Create Custom Response for test 1",
"folder_id": "67592783069f7717b89ba992",
"source": {
"allowed_http_methods": [
"PUT",
"POST"
],
"custom_response": {
"status": "active",
"content_type": "text/plain",
"content": {
"name": "$request.query.name$",
"details": {
"age": "$request.query.age$"
}
}
}
},
"destination": {
"url": "https://webhook.site/60e71a16-e9fe-4bb0-b906-35f66277ddd1",
"rate_limit": 4,
"rate_limit_period": "minute",
"http_method": "POST"
},
"retry": {
"status": "active",
"limit": 5,
"interval": 1,
"time_limit_period": "minute",
"strategy": "linear"
},
"delay": {
"status": "inactive",
"interval": 0
},
"trs_id": "trs_672cade8d3adcf3a0d314b1b",
"filter": {
"status": "active",
"body": {
"amount": {
"$gt": 100
},
"category": {
"$eq": "electronics"
}
},
"headers": {
"content_type": "text/plain"
},
"query": {
"param1": "value1",
"param2": "value2"
},
"path": "/webhook/"
}
}'/connections/{{connectionId}}Partially update a connection's attributes — name, settings, transformations — without replacing the full resource.
e.g. Sample
e.g. {"allowed_http_methods":["PUT","POST","GET"],"custom_response":{"status":"active","content_type":"text/plain","content":{"name":"$request.query.name$","details":{"age":"$request.query.age$"}}}}
e.g. {"url":"https://webhook.site/60e71a16-e9fe-4bb0-b906-35f66277ddd1","rate_limit":1,"rate_limit_period":"minute","http_method":"GET"}
e.g. {"status":"active","limit":5,"interval":1,"time_limit_period":"minute","strategy":"linear"}
e.g. {"status":"active","interval":1,"time_limit_period":"minute"}
e.g. trs_672cade8d3adcf3a0d314b1b
e.g. {"status":"active","body":{"amount":{"$gt":100},"category":{"$eq":"electronics"}},"headers":{"content_type":"text/plain"},"query":{"param1":"value1","param2":"value2"},"path":"/webhook/"}
/connections/{{connectionId}}curl -X PATCH https://hook.pabbly.com/api/v1/connections/{{connectionId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "Sample",
"source": {
"allowed_http_methods": [
"PUT",
"POST",
"GET"
],
"custom_response": {
"status": "active",
"content_type": "text/plain",
"content": {
"name": "$request.query.name$",
"details": {
"age": "$request.query.age$"
}
}
}
},
"destination": {
"url": "https://webhook.site/60e71a16-e9fe-4bb0-b906-35f66277ddd1",
"rate_limit": 1,
"rate_limit_period": "minute",
"http_method": "GET"
},
"retry": {
"status": "active",
"limit": 5,
"interval": 1,
"time_limit_period": "minute",
"strategy": "linear"
},
"delay": {
"status": "active",
"interval": 1,
"time_limit_period": "minute"
},
"trs_id": "trs_672cade8d3adcf3a0d314b1b",
"filter": {
"status": "active",
"body": {
"amount": {
"$gt": 100
},
"category": {
"$eq": "electronics"
}
},
"headers": {
"content_type": "text/plain"
},
"query": {
"param1": "value1",
"param2": "value2"
},
"path": "/webhook/"
}
}'/connections/disableStop a connection from accepting incoming webhook requests. Existing history is retained; new triggers are rejected until re-enabled.
e.g. ["conn_ee3a07ef5a574f58abc4a2d98a5c2d3b"]
/connections/disablecurl -X PUT https://hook.pabbly.com/api/v1/connections/disable \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"connection_ids": [
"conn_ee3a07ef5a574f58abc4a2d98a5c2d3b"
]
}'/connections/enableRe-activate a previously disabled connection so it can receive webhook requests again.
e.g. ["conn_ee3a07ef5a574f58abc4a2d98a5c2d3b"]
/connections/enablecurl -X PUT https://hook.pabbly.com/api/v1/connections/enable \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"connection_ids": [
"conn_ee3a07ef5a574f58abc4a2d98a5c2d3b"
]
}'/connections/Soft-delete a connection by moving it to trash. Can be restored within the retention window before permanent deletion.
e.g. ["conn_bdafbe30d2f04625822304af01e8216e"]
/connections/curl -X DELETE https://hook.pabbly.com/api/v1/connections/ \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/connections?filter={filter}&status={status}&folder_id={folder_id}&name={name}&page={page}&limit={limit}List connections matching the specified filters (folder, status, name).
e.g. true
e.g. active
e.g. 67592783069f7717b89ba992
e.g. Sample
e.g. 1
e.g. 10
/connections?filter={filter}&status={status}&folder_id={folder_id}&name={name}&page={page}&limit={limit}curl https://hook.pabbly.com/api/v1/connections?filter={{filter}}&status={{status}}&folder_id={{folder_id}}&name={{name}}&page={{page}}&limit={{limit}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/connections/{{connectionId}}Fetch the full details of one connection by its unique ID.
/connections/{{connectionId}}curl https://hook.pabbly.com/api/v1/connections/{{connectionId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/transformationsCreate a transformation rule that modifies incoming webhook payloads before they're forwarded to downstream services.
e.g. fourth Transformation
e.g. (request, context) => {let itemCounter = 0;request.payload.items = request.payload.items || [];request.payload.items.forEach(item => {if (item.status === 'active') {itemCounter++;item.updated_at = new Date().toISOString(); } else { item.status = 'inactive'; } });request.payload.summary = {activeItemCount: itemCounter, totalItems: request.payload.items.length};request.headers['X-Item-Count'] = itemCounter.toString(); request.queryParams.processedAt = new Date().toISOString();try { if (!request.payload.customerId) { throw new Error('customerId is missing'); } } catch (error) { console.error('Transformation error:', error.message); throw error;} return request;}
/transformationscurl -X POST https://hook.pabbly.com/api/v1/transformations \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "fourth Transformation",
"code": "(request, context) => {let itemCounter = 0;request.payload.items = request.payload.items || [];request.payload.items.forEach(item => {if (item.status === 'active') {itemCounter++;item.updated_at = new Date().toISOString(); } else { item.status = 'inactive'; } });request.payload.summary = {activeItemCount: itemCounter, totalItems: request.payload.items.length};request.headers['X-Item-Count'] = itemCounter.toString(); request.queryParams.processedAt = new Date().toISOString();try { if (!request.payload.customerId) { throw new Error('customerId is missing'); } } catch (error) { console.error('Transformation error:', error.message); throw error;} return request;}"
}'/transformations/{{transformationId}}Fetch the full configuration of one transformation by its unique transformation ID.
/transformations/{{transformationId}}curl https://hook.pabbly.com/api/v1/transformations/{{transformationId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/transformations/get-all/List every transformation defined in the account.
/transformations/get-all/curl https://hook.pabbly.com/api/v1/transformations/get-all/ \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/transformations/{{transformationId}}Update an existing transformation's rules or output mapping.
e.g. five transformation
e.g. (request, context) => {let itemCounter = 0;request.payload.items = request.payload.items || [];request.payload.items.forEach(item => {if (item.status === 'active') {itemCounter++;item.updated_at = new Date().toISOString(); } else { item.status = 'inactive'; } });request.payload.summary = {activeItemCount: itemCounter, totalItems: request.payload.items.length};request.headers['X-Item-Count'] = itemCounter.toString(); request.queryParams.processedAt = new Date().toISOString();try { if (!request.payload.customerId) { throw new Error('customerId is missing'); } } catch (error) { console.error('Transformation error:', error.message); throw error;} return request;}
/transformations/{{transformationId}}curl -X PUT https://hook.pabbly.com/api/v1/transformations/{{transformationId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}} \
-H "Content-Type: application/json" \
-d '{
"name": "five transformation",
"code": "(request, context) => {let itemCounter = 0;request.payload.items = request.payload.items || [];request.payload.items.forEach(item => {if (item.status === 'active') {itemCounter++;item.updated_at = new Date().toISOString(); } else { item.status = 'inactive'; } });request.payload.summary = {activeItemCount: itemCounter, totalItems: request.payload.items.length};request.headers['X-Item-Count'] = itemCounter.toString(); request.queryParams.processedAt = new Date().toISOString();try { if (!request.payload.customerId) { throw new Error('customerId is missing'); } } catch (error) { console.error('Transformation error:', error.message); throw error;} return request;}"
}'/transformations/{{transformationId}}Permanently delete a transformation. Connections using it fall back to passing payloads through unchanged.
/transformations/{{transformationId}}curl -X DELETE https://hook.pabbly.com/api/v1/transformations/{{transformationId}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/requests?filter={filter}&connection_id={connection_id}&requestId={requestId}&status={status}&dateRange={dateRange}&page={page}&limit={limit}List incoming webhook requests matching the specified filters (connection, date range, status).
e.g. true
e.g. conn_38657a4a43544e4fa9a911696d72a20e
e.g. req_e038786447e14a2e9282f69229d809a1
e.g. blocked
e.g. 2024-05-01,2024-06-31
e.g. 220
e.g. 1
/requests?filter={filter}&connection_id={connection_id}&requestId={requestId}&status={status}&dateRange={dateRange}&page={page}&limit={limit}curl https://hook.pabbly.com/api/v1/requests?filter={{filter}}&connection_id={{connection_id}}&requestId={{requestId}}&status={{status}}&dateRange={{dateRange}}&page={{page}}&limit={{limit}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/requests?page={page}&limit={limit}Return the full history of incoming webhook requests for the account.
e.g. 1
e.g. 100
/requests?page={page}&limit={limit}curl https://hook.pabbly.com/api/v1/requests?page={{page}}&limit={{limit}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/events?filter={filter}&limit={limit}&requestId={requestId}&status={status}List webhook delivery events matching the specified filters (connection, status, date range).
e.g. true
e.g. 10
e.g. req_cd5a26f12b4549c59247742e12e9f7ab
e.g. SUCCESSFUL
/events?filter={filter}&limit={limit}&requestId={requestId}&status={status}curl https://hook.pabbly.com/api/v1/events?filter={{filter}}&limit={{limit}}&requestId={{requestId}}&status={{status}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}/events?page={page}&limit={limit}Return the full event log of webhook deliveries for the account.
e.g. 1
e.g. 100
/events?page={page}&limit={limit}curl https://hook.pabbly.com/api/v1/events?page={{page}}&limit={{limit}} \
-u {{YOUR_API_KEY}}:{{YOUR_SECRET_KEY}}