Webhook Integration
Submit feedback programmatically from any backend, CI pipeline, or third-party service using a single REST endpoint and an API key.
When to use the webhook
Scenario
DataLoop is a B2B analytics platform. Their support team uses Zendesk, but the product team never sees those tickets until someone manually copies them into a spreadsheet during the weekly meeting. By the time a pattern is spotted, three weeks have passed. DataLoop's engineering lead wants every closed Zendesk ticket that includes user feedback to land in Feedqip automatically — no manual copying, no delays.
The webhook is ideal when feedback originates inside a system your code already controls. Common use cases include:
- Forwarding support tickets from Zendesk, Freshdesk, or a custom helpdesk.
- Capturing NPS or CSAT responses from survey tools via Zapier or a direct API call.
- Piping user comments from a mobile app's in-app feedback dialog.
- Batch-importing historical feedback from a CSV or database during initial setup.
For DataLoop, the solution is a 20-line script triggered by a Zendesk webhook. Every time a ticket is closed, the script sends the ticket body to Feedqip. The product team now sees real-time feedback without ever opening Zendesk.
Prerequisites
-
1
Create a product
Navigate to Products in your dashboard and create a product that will receive the feedback.
-
2
Generate an API key
Open the product's Integration → API Keys page and click Generate Key. Copy the key immediately — it's shown only once.
Endpoint reference
URL
POST https://your-domain.com/api/v1/feedback
Headers
Content-Type: application/json
X-API-Key: lc_your_api_key_here
Request body
{
"message": "Your feedback message here",
"metadata": {
"email": "[email protected]",
"page_url": "/pricing",
"user_agent": "MyApp/1.0"
}
}
Fields
| Field | Type | Required | Description |
|---|---|---|---|
| message | string | Yes | The feedback text (1–5 000 characters). |
| metadata | object | No | Arbitrary key/value pairs for context (email, URL, user agent, etc.). |
Response codes
| Code | Meaning |
|---|---|
| 201 | Feedback created successfully. |
| 401 | Missing or invalid API key. |
| 422 | Validation error (missing message, exceeds length, etc.). |
| 429 | Rate limit exceeded (60 requests / minute per key). |
Code examples
Copy the snippet for your language. Replace
YOUR_API_KEY
with the key you generated and
https://your-domain.com
with your Feedqip instance URL.
import requests
resp = requests.post(
"https://your-domain.com/api/v1/feedback",
headers={
"Content-Type": "application/json",
"X-API-Key": "YOUR_API_KEY",
},
json={
"message": "The checkout page is confusing on mobile.",
"metadata": {"email": "[email protected]", "source": "zendesk"},
},
)
print(resp.status_code, resp.json())
Best practices
Include metadata
Add context like the user's email, page URL, or app version. This makes it easier to follow up and helps Feedqip's classifier spot patterns faster.
Handle rate limits gracefully
The API allows 60 requests per minute per key. If you're batch-importing, add a short delay between requests or use exponential back-off on 429 responses.
Rotate keys periodically
Generate a new key every quarter (or sooner if a key may have been exposed). Revoke the old key from the API Keys management page.
Store keys securely
Use environment variables or a secrets manager. Never commit API keys to source control.