Support & Ticket System
Create support tickets, reply with attachments, search the knowledge base, and manage how you get notified about updates — all via the dashboard or the API.
Dashboard Access
Creating Tickets
There are two ways to create a ticket: authenticated (requires login) for users with an AlterLab account, and a public endpoint for the contact form.
Authenticated Ticket
/api/v1/support/ticketsCreates a ticket linked to your account. Automatically enriches the ticket with your account details and usage context.
curl -X POST https://api.alterlab.io/api/v1/support/tickets \
-H "Authorization: Bearer YOUR_SESSION_JWT" \
-H "Content-Type: application/json" \
-d '{
"subject": "Scrape returning empty content for JavaScript-heavy site",
"body": "I am scraping https://example.com but getting empty content...",
"category_slug": "technical-issue",
"priority": "medium"
}'Response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"readable_id": "ALT-1042",
"subject": "Scrape returning empty content for JavaScript-heavy site",
"status": "open",
"priority": "medium",
"category": "Technical Issue",
"created_at": "2026-05-18T10:23:00Z",
"updated_at": "2026-05-18T10:23:00Z"
}| Field | Required | Description |
|---|---|---|
| subject | Yes | Brief description (max 255 chars) |
| body | Yes | Detailed description of the issue |
| category_slug | No | Category slug (see Categories). Auto-categorized if omitted. |
| priority | No | low, medium, high, or urgent (default: medium) |
| metadata | No | Key-value pairs for additional context (e.g. affected URL, job ID) |
Public / Contact Form
/api/v1/support/tickets/publicUnauthenticated endpoint for the contact form at /contact. No login required — submit name, email, and message. Includes a honeypot field to block bot submissions.
curl -X POST https://api.alterlab.io/api/v1/support/tickets/public \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Smith",
"email": "[email protected]",
"subject": "Question about pricing",
"body": "I would like to know more about the Pro plan features...",
"honeypot": ""
}'Rate limited
Viewing Your Tickets
List Tickets
/api/v1/support/tickets# All open tickets
curl "https://api.alterlab.io/api/v1/support/tickets?status=open" \
-H "Authorization: Bearer YOUR_SESSION_JWT"
# Filter by category, search by keyword
curl "https://api.alterlab.io/api/v1/support/tickets?status=open&category=technical-issue&q=scrape" \
-H "Authorization: Bearer YOUR_SESSION_JWT"Query params: status (open, closed, pending), category, q (full-text search), page, per_page
Get a Single Ticket
/api/v1/support/tickets/{ticket_id}curl "https://api.alterlab.io/api/v1/support/tickets/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_SESSION_JWT"Replying to Tickets
/api/v1/support/tickets/{ticket_id}/repliesAdd a reply to an existing ticket. Automatically re-opens a closed ticket. Rate limited to 30 replies per hour per user.
curl -X POST "https://api.alterlab.io/api/v1/support/tickets/{ticket_id}/replies" \
-H "Authorization: Bearer YOUR_SESSION_JWT" \
-H "Content-Type: application/json" \
-d '{
"body": "I tried enabling JavaScript rendering (tier 3) and it works now. Thank you!"
}'Attachments
POST /api/v1/support/attachments), then include the returned attachment IDs in the reply body as markdown links.Closing & Reopening
/api/v1/support/tickets/{id}/closecurl -X POST "https://api.alterlab.io/api/v1/support/tickets/{id}/close" \
-H "Authorization: Bearer YOUR_SESSION_JWT"/api/v1/support/tickets/{id}/reopencurl -X POST "https://api.alterlab.io/api/v1/support/tickets/{id}/reopen" \
-H "Authorization: Bearer YOUR_SESSION_JWT"Reopening a ticket notifies the support team. Adding a reply to a closed ticket also automatically reopens it.
CSAT Rating
After a ticket is resolved, you can submit a satisfaction rating. Ratings help the support team identify areas for improvement.
/api/v1/support/tickets/{ticket_id}/satisfactioncurl -X POST "https://api.alterlab.io/api/v1/support/tickets/{ticket_id}/satisfaction" \
-H "Authorization: Bearer YOUR_SESSION_JWT" \
-H "Content-Type: application/json" \
-d '{
"rating": 5,
"comment": "Fast response and clear explanation. Very helpful!"
}'| Field | Required | Description |
|---|---|---|
| rating | Yes | Integer 1–5 (1 = terrible, 5 = great) |
| comment | No | Optional written feedback |
Knowledge Base Search
Search published knowledge base articles before creating a ticket. The KB covers common issues, how-tos, and troubleshooting guides.
/api/v1/support/kb/search# Search for articles about JavaScript rendering
curl "https://api.alterlab.io/api/v1/support/kb/search?q=javascript+rendering&limit=5"Response:
{
"articles": [
{
"id": "660f9511-...",
"slug": "javascript-rendering-guide",
"title": "How to scrape JavaScript-heavy sites",
"summary": "Use tier 3 (Playwright) or tier 4 for sites that require JavaScript execution...",
"helpful_count": 42,
"not_helpful_count": 3
}
],
"total": 1,
"query": "javascript rendering"
}Get a full article by slug:
curl "https://api.alterlab.io/api/v1/support/kb/javascript-rendering-guide"Mark an article as helpful or not helpful:
curl -X POST "https://api.alterlab.io/api/v1/support/kb/javascript-rendering-guide/helpful" \
-H "Content-Type: application/json" \
-d '{"helpful": true}'Notification Preferences
Control which support events trigger email notifications to you.
/api/v1/support/preferencescurl "https://api.alterlab.io/api/v1/support/preferences" \
-H "Authorization: Bearer YOUR_SESSION_JWT"Response:
{
"notify_on_reply": true,
"notify_on_close": true,
"notify_on_status_change": false,
"email_digest": false
}Update preferences:
/api/v1/support/preferencescurl -X PATCH "https://api.alterlab.io/api/v1/support/preferences" \
-H "Authorization: Bearer YOUR_SESSION_JWT" \
-H "Content-Type: application/json" \
-d '{
"notify_on_reply": true,
"notify_on_close": false
}'Mute notifications for a specific ticket:
/api/v1/support/tickets/{id}/mutecurl -X PATCH "https://api.alterlab.io/api/v1/support/tickets/{id}/mute" \
-H "Authorization: Bearer YOUR_SESSION_JWT" \
-H "Content-Type: application/json" \
-d '{"muted": true}'Ticket Categories
List available ticket categories to use as category_slug when creating tickets.
/api/v1/support/categoriescurl "https://api.alterlab.io/api/v1/support/categories"Response:
{
"categories": [
{ "slug": "technical-issue", "name": "Technical Issue", "description": "Bugs, errors, unexpected behavior" },
{ "slug": "billing", "name": "Billing", "description": "Charges, invoices, plan changes" },
{ "slug": "feature-request", "name": "Feature Request", "description": "Suggestions and new capabilities" },
{ "slug": "account", "name": "Account", "description": "Login, API keys, team management" },
{ "slug": "general", "name": "General", "description": "Other questions" }
]
}Auto-categorization
category_slug when creating a ticket, AlterLab automatically classifies it based on your subject and body. You can still change the category later via the dashboard.Rate Limits
| Endpoint | Limit | Window |
|---|---|---|
| POST /support/tickets (authenticated) | 5 | Per user, per hour |
| POST /support/tickets/public | 3 | Per IP, per hour |
| POST /support/tickets/{id}/replies | 30 | Per user, per hour |
Rate limit errors return HTTP 429 with a Retry-After header indicating when the limit resets.