Support Tickets API
The Tickets API allows you to create, track, and manage support tickets directly from your application. Use it to report payment issues, request refunds, ask integration questions, and communicate with the LuxCore support team — all without leaving your platform.API Key Scopes
Your API key must have the appropriate scopes to access ticket endpoints:| Scope | Permissions |
|---|---|
tickets.create | Create new support tickets |
tickets.read | List tickets, view details, list comments, download attachments |
tickets.update | Close/reopen tickets, add comments, upload attachments |
Contact your account manager or request scope changes via the Dashboard to enable ticket scopes on your API key.
Creating a Ticket
Create a new support ticket withPOST /tickets.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Ticket title (max 200 characters) |
description | string | No | Detailed description of the issue |
category | string | No | Ticket category (see Categories) |
sub_category | string | No | Sub-category for further classification |
payment_id | string | No | Related payment ID |
transaction_id | string | No | Related transaction ID |
reference | string | No | Your external reference |
requires_refund | boolean | No | Whether a refund is required (default: false) |
Response
Listing Tickets
Retrieve a paginated list of your tickets withGET /tickets.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
status | string[] | — | Filter by status (can pass multiple: ?status=open&status=in_progress) |
category | string[] | — | Filter by category (can pass multiple) |
search | string | — | Free-text search in title and description (max 100 chars) |
payment_id | string | — | Filter by related payment ID |
created_after | string | — | ISO 8601 date — tickets created after this date |
created_before | string | — | ISO 8601 date — tickets created before this date |
sort_by | string | created_at | Sort field: created_at, updated_at, last_activity_at, status |
sort_order | string | desc | Sort order: asc or desc |
limit | integer | 20 | Items per page (1–100) |
offset | integer | 0 | Number of items to skip |
Response
Getting Ticket Details
Retrieve full details of a specific ticket withGET /tickets/:ticketId.
MerchantTicketResponseDto structure as the create endpoint.
Closing a Ticket
Close an open ticket withPOST /tickets/:ticketId/close. You can optionally include a closing comment.
Only tickets in
open, in_progress, waiting_customer, or resolved status can be closed. Attempting to close a ticket in another status returns 400 Bad Request.Reopening a Ticket
Reopen a resolved or closed ticket withPOST /tickets/:ticketId/reopen.
Comments
Adding a Comment
Add a comment to an existing ticket withPOST /tickets/:ticketId/comments.
Comment Request Body
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Comment text |
attachments | array | No | Pre-uploaded attachment references (see Attachments) |
| Field | Type | Description |
|---|---|---|
attachment_id | string | Attachment ID from the upload-url response |
key | string | Storage key from the upload-url response |
filename | string | Original filename |
content_type | string | MIME content type |
Listing Comments
Retrieve comments on a ticket withGET /tickets/:ticketId/comments.
Comment Response
Only public comments are returned. Internal team comments are not visible via the API.
Attachments
File attachments use a two-step upload flow: first generate a pre-signed upload URL, then upload the file directly to storage.Supported File Types
| MIME Type | Extension |
|---|---|
image/jpeg | .jpg, .jpeg |
image/png | .png |
image/webp | .webp |
image/gif | .gif |
application/pdf | |
video/mp4 | .mp4 |
video/webm | .webm |
Upload Workflow
Generate Upload URL
Call
Response:
POST /tickets/:ticketId/upload-url with the filename, content type, and optionally file size:| Field | Type | Required | Description |
|---|---|---|---|
filename | string | Yes | Original filename (max 255 chars) |
content_type | string | Yes | MIME type (see Supported File Types) |
file_size | integer | No | File size in bytes. If provided, must not exceed 10MB (10,485,760 bytes) |
Downloading Attachments
To download an attachment, request a pre-signed download URL: Ticket-level attachment:thumb_url is available for image attachments only. It is null for PDFs and videos.Ticket Statuses
| Status | Description |
|---|---|
open | Ticket created, awaiting support team review |
in_progress | Support team is actively working on the issue |
waiting_customer | Support team has responded and is waiting for your input |
on_hold | Ticket is paused (e.g., waiting for a third party) |
resolved | Issue has been resolved by the support team |
closed | Ticket is closed (by merchant or after resolution) |
canceled | Ticket was canceled |
Status Lifecycle
open → in_progress
open → in_progress
A support agent picks up the ticket and begins investigation.
in_progress → waiting_customer
in_progress → waiting_customer
The support team has responded and needs additional information from you. Add a comment to move the ticket forward.
waiting_customer → in_progress
waiting_customer → in_progress
You replied with a comment — the ticket moves back to active investigation.
in_progress → on_hold
in_progress → on_hold
The issue requires external investigation (e.g., bank confirmation). The ticket is paused until the external party responds.
in_progress → resolved
in_progress → resolved
The support team has resolved the issue. You can close the ticket or reopen it if the problem persists.
resolved → closed
resolved → closed
You confirm the resolution by closing the ticket, or it is auto-closed after a period of inactivity.
resolved / closed → open (reopen)
resolved / closed → open (reopen)
You reopen the ticket via
POST /tickets/:ticketId/reopen if the issue was not fully resolved.Merchant-Allowed Transitions
As a merchant, you can perform these status transitions:| Action | Allowed From | Endpoint |
|---|---|---|
| Close | open, in_progress, waiting_customer, resolved | POST /tickets/:ticketId/close |
| Reopen | resolved, closed | POST /tickets/:ticketId/reopen |
Categories
| Category | Description |
|---|---|
payment_issue | Problems with a specific payment (stuck, failed, wrong amount) |
integration | API integration questions or issues |
limits | Balance or transaction limit inquiries |
account | Account settings, credentials, or access issues |
bug | Bug reports for the API or dashboard |
question | General questions |
dispute | Payment dispute (replaces legacy appeals system) |
refund_request | Request for a payment refund |
other | Anything that doesn’t fit other categories |
Using the correct category helps the support team route your ticket faster.
payment_issue and refund_request tickets are prioritized automatically.Webhook Events
When you have webhooks configured, the following ticket events are delivered:| Event | Trigger | Description |
|---|---|---|
ticket.created | Ticket created via API | A new support ticket was created |
ticket.updated | Ticket status changed | Ticket status was changed (e.g., reopened, moved to in_progress) |
ticket.comment_added | Admin replies to your ticket | A public comment was added by the support team |
ticket.resolved | Admin resolves ticket | Ticket was resolved by the support team |
ticket.closed | Ticket closed | Ticket was closed (by merchant or support team) |
ticket.comment_added fires only when the support team adds a public reply to your ticket. Internal notes are never delivered. For ticket.comment_added, the comment content is included in data.comment alongside data.ticket.data.ticket field:
To receive ticket events, add them to your webhook subscription. See the Webhooks Guide for setup instructions.
Error Handling
All API responses use a unified envelope. On errors,success is false and the error field contains a human-readable message:
| Status Code | Meaning |
|---|---|
400 | Invalid request parameters or status transition |
401 | Unauthorized — missing or invalid API key |
404 | Ticket, comment, or attachment not found |
409 | Duplicate ticket for this payment ID |
HTTP status is always
200. Check the success field and statusCode in the response body to determine the actual result.Best Practices
Link Payments to Tickets
Always include
payment_id or transaction_id when creating tickets about payment issues. This helps the support team investigate faster.Use Correct Categories
Categorize tickets accurately.
payment_issue and refund_request are auto-prioritized for faster resolution.Add Context in Comments
When replying, include relevant details like timestamps, amounts, and error messages. Attach screenshots when possible.
Monitor via Webhooks
Subscribe to
ticket.updated and ticket.comment_added events to get real-time notifications instead of polling the API.