Webhooks push data out of Feedbaxster when events happen. The API lets you pull data in whenever you need it. If you're building a custom dashboard, syncing feedback to an internal tool, or automating workflows that need to read or write data on demand, the API is what you want.
This guide covers creating an API key, making your first request, and the most common endpoints you'll use.
Note: API access requires a Business plan or higher. You can upgrade from your billing settings.
Creating an API key
In your Feedbaxster dashboard, go to Settings > Integrations and scroll to the API Keys section. Click Create API Key.
Give the key a descriptive name. This helps you remember what each key is for, especially if you create several. Examples: Mobile App, Internal Dashboard, Zapier Sync.
After you click Create Key, the full API key is shown once. Copy it immediately and store it somewhere secure (a password manager, environment variable, or secrets vault). You will not be able to see the full key again. The dashboard only shows a prefix after creation.
If you lose a key, revoke it and create a new one.
Authentication
Every API request must include your API key in the Authorization header as a Bearer token:
Authorization: Bearer fbx_your_api_key_here
Requests without a valid key return a 401 Unauthorized response.
Base URL
All API endpoints are served from:
https://api.feedbaxster.com
For local development, the API runs at http://localhost:7101.
Your First Request: List Suggestions
Let's start with something simple. To fetch all suggestions for a business:
curl:
curl -s https://api.feedbaxster.com/businesses/YOUR_BUSINESS_ID/suggestions \
-H "Authorization: Bearer fbx_your_api_key_here" | jq .
JavaScript (fetch):
const response = await fetch(
'https://api.feedbaxster.com/businesses/YOUR_BUSINESS_ID/suggestions',
{
headers: {
'Authorization': 'Bearer fbx_your_api_key_here',
},
}
);
const { data, total } = await response.json();
console.log(`${total} suggestions found`);
Python (requests):
import requests
response = requests.get(
f'https://api.feedbaxster.com/businesses/{BUSINESS_ID}/suggestions',
headers={'Authorization': f'Bearer {API_KEY}'}
)
result = response.json()
print(f"{result['total']} suggestions found")
The response includes a data array of suggestion objects and a total count for pagination.
Common Endpoints
Here are the endpoints you'll use most often. All paths are relative to /businesses/{businessId}.
Suggestions
| Method | Path | Description |
|---|---|---|
| GET | /suggestions | List all suggestions (paginated) |
| GET | /suggestions/:id | Get a single suggestion |
| POST | /suggestions | Create a new suggestion |
| PATCH | /suggestions/:id | Update status, priority, etc. |
Query parameters for listing: status, priority, sentiment, limit, offset, sort.
Issues
| Method | Path | Description |
|---|---|---|
| GET | /issues | List all issues |
| GET | /issues/:id | Get a single issue |
| POST | /issues | Create a new issue |
| PATCH | /issues/:id | Update status, assignee, etc. |
QR Codes
| Method | Path | Description |
|---|---|---|
| GET | /qr-codes | List all QR codes |
| POST | /qr-codes | Create a new QR code |
| PATCH | /qr-codes/:id | Update label or active status |
| DELETE | /qr-codes/:id | Delete a QR code |
Team
| Method | Path | Description |
|---|---|---|
| GET | /team | List team members and pending invites |
| POST | /team/invite | Invite a new team member |
Analytics
| Method | Path | Description |
|---|---|---|
| GET | /analytics/overview | Dashboard summary (counts, sentiment breakdown, recent activity) |
Pagination
List endpoints return paginated results. Use limit and offset query parameters:
# Get suggestions 21-40
curl "https://api.feedbaxster.com/businesses/{id}/suggestions?limit=20&offset=20" \
-H "Authorization: Bearer fbx_..."
The response includes total so you can calculate the number of pages.
Error Handling
The API returns standard HTTP status codes:
| Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 400 | Bad request (missing or invalid fields) |
| 401 | Unauthorized (missing or invalid API key) |
| 403 | Forbidden (key doesn't have access to this business) |
| 404 | Resource not found |
| 429 | Rate limited (too many requests) |
| 500 | Server error |
Error responses include a message field explaining what went wrong:
{
"statusCode": 400,
"message": "Validation failed: content must not be empty"
}
Rate Limits
API keys are rate-limited to prevent abuse. The current limits are generous for normal use, but if you're polling aggressively or running batch imports, you may hit them.
When rate-limited, the API returns a 429 status with a Retry-After header indicating how many seconds to wait before trying again.
For real-time updates, use webhooks instead of polling. Webhooks push data to you as events happen, which is both faster and lighter on both sides.
Example: Export All Feedback to CSV
Here's a practical script that pulls all suggestions and writes them to a CSV file:
import requests
import csv
API_KEY = 'fbx_your_key_here'
BUSINESS_ID = 'your-business-id'
BASE_URL = 'https://api.feedbaxster.com'
def fetch_all_suggestions():
suggestions = []
offset = 0
limit = 50
while True:
response = requests.get(
f'{BASE_URL}/businesses/{BUSINESS_ID}/suggestions',
headers={'Authorization': f'Bearer {API_KEY}'},
params={'limit': limit, 'offset': offset}
)
result = response.json()
suggestions.extend(result['data'])
if offset + limit >= result['total']:
break
offset += limit
return suggestions
suggestions = fetch_all_suggestions()
with open('feedback_export.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=[
'id', 'content', 'status', 'priority',
'sentiment', 'sentiment_score', 'created_at'
])
writer.writeheader()
for s in suggestions:
writer.writerow({
'id': s['id'],
'content': s['content'],
'status': s['status'],
'priority': s['priority'],
'sentiment': s.get('sentiment', ''),
'sentiment_score': s.get('sentiment_score', ''),
'created_at': s['created_at'],
})
print(f"Exported {len(suggestions)} suggestions to feedback_export.csv")
Revoking and Rotating Keys
If a key is compromised or no longer needed, revoke it immediately from Settings > Integrations. Revoking is instant and permanent. Any request using that key will start returning 401 right away.
To rotate a key (replace it without downtime), create the new key first, update your application to use it, verify it works, then revoke the old one.
What's Next
The API is the foundation for building custom integrations that go beyond what Slack and webhooks offer. Combined with webhooks for real-time events and the API for on-demand reads and writes, you can connect Feedbaxster to practically any system in your stack.
If you haven't set up Slack or webhook integrations yet, check out our guides on connecting Feedbaxster to Slack and sending feedback events with webhooks.