Webhooks API¶
Receive real-time HTTP notifications when events occur in Vellocity — listing changes, co-sell updates, and content generation completions.
Base URL: https://api.vell.ai/api/v1
Authentication: Bearer token
Prefix: /partners/webhooks
Rate Limiting: throttle:partner
Endpoints¶
List Webhooks¶
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
per_page |
integer | No | 20 |
Items per page |
Response:
{
"data": [
{
"type": "webhook",
"id": 1,
"attributes": {
"url": "https://your-app.com/webhooks/vellocity",
"events": ["listing.updated", "cosell.created"],
"description": "Production webhook",
"active": true,
"last_triggered_at": "2026-02-25T14:30:00Z",
"last_response_code": 200,
"failure_count": 0,
"created_at": "2026-01-15T10:00:00Z"
}
}
],
"meta": {
"total": 2,
"page": 1,
"per_page": 20,
"total_pages": 1
}
}
Create Webhook¶
| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string | Yes | Webhook delivery URL (max 2048 chars) |
events |
array | Yes | Event types to subscribe to (min 1) |
description |
string | No | Human-readable label (max 255 chars) |
active |
boolean | No | Enable immediately (default: true) |
Response (201):
{
"data": {
"type": "webhook",
"id": 3,
"attributes": {
"url": "https://your-app.com/webhooks/vellocity",
"events": ["listing.updated", "cosell.created"],
"active": true
}
},
"meta": {
"secret": "a1b2c3d4e5f6...64chars...",
"warning": "Store this secret securely. It will not be shown again."
}
}
Save the secret
The webhook signing secret is returned only once in the create response. Store it securely — you need it to verify webhook signatures.
Webhook Limits by Plan¶
| Plan | Max Webhooks |
|---|---|
| Starter | 2 |
| Accelerate | 5 |
| Command+ | 20 |
| Enterprise | 100 |
Delete Webhook¶
Returns 204 No Content on success.
List Available Events¶
Response:
{
"data": [
{
"name": "listing.created",
"description": "Triggered when a new marketplace listing is created",
"payload_example": {
"event": "listing.created",
"listing_id": 123,
"provider": "aws",
"status": "pending"
}
},
{
"name": "listing.updated",
"description": "Triggered when a listing is updated",
"payload_example": {
"event": "listing.updated",
"listing_id": 123,
"changes": ["status", "compliance_score"]
}
},
{
"name": "listing.published",
"description": "Triggered when a listing is published to the marketplace",
"payload_example": {
"event": "listing.published",
"listing_id": 123,
"published_at": "2026-02-26T12:00:00Z"
}
},
{
"name": "listing.failed",
"description": "Triggered when listing processing fails",
"payload_example": {
"event": "listing.failed",
"listing_id": 123,
"error": "Processing timeout"
}
},
{
"name": "cosell.created",
"description": "Triggered when a new co-sell opportunity is created"
},
{
"name": "cosell.updated",
"description": "Triggered when a co-sell opportunity is updated"
},
{
"name": "cosell.completed",
"description": "Triggered when a co-sell opportunity is completed"
},
{
"name": "content.generated",
"description": "Triggered when AI content is generated"
}
]
}
Test Webhook¶
| Parameter | Type | Required | Description |
|---|---|---|---|
webhook_id |
integer | Yes | Webhook ID to test |
Sends a test payload to the webhook URL:
{
"event": "webhook.test",
"webhook_id": 1,
"timestamp": "2026-02-26T10:00:00Z",
"message": "This is a test webhook payload"
}
Payload Format¶
When events occur, Vellocity sends POST requests to your webhook URL:
POST https://your-app.com/webhooks/vellocity
Content-Type: application/json
X-Vellocity-Signature: sha256=a1b2c3d4...
X-Vellocity-Event: listing.updated
X-Vellocity-Delivery: evt_abc123
{
"id": "evt_abc123",
"type": "listing.updated",
"timestamp": "2026-02-26T14:20:00Z",
"data": {
"listing_id": 123,
"changes": ["status", "compliance_score"]
}
}
Verifying Signatures¶
Validate the X-Vellocity-Signature header using the secret from webhook creation:
import hmac
import hashlib
def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode(),
payload,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(signature, expected)
# In your webhook handler:
is_valid = verify_webhook(
request.body,
request.headers["X-Vellocity-Signature"],
WEBHOOK_SECRET,
)
Use Cases¶
Monitor Listing Changes¶
- Create a webhook:
POST /partners/webhookssubscribing tolisting.updatedandlisting.published - When notified, fetch the updated listing via Partner API
- Sync changes to your internal CRM or monitoring system
Co-Sell Pipeline Automation¶
- Subscribe to
cosell.createdandcosell.updated - When a new opportunity arrives, create a corresponding record in your CRM
- When status changes, update your pipeline dashboard
- Subscribe to
cosell.completedto trigger post-deal workflows
Content Generation Monitoring¶
- Subscribe to
content.generated - When content is ready, automatically push it through your review workflow
- Combine with the Content Workflow API kanban for full lifecycle management