Endpoint reference
Every GVenta Help Desk REST endpoint — 186 in 22 groups — with method, path, authentication and what each call does.
Documented from GVenta Help Desk version 1.8.55.
Conventions
All endpoints are relative to your own instance, for example
https://your-instance.example/api. Staff endpoints take a JWT from POST /api/auth/login (or fall back to the browser session), long-lived API keys are sent as X-API-Key or Authorization: Bearer, "flexible" endpoints accept either, and client-portal endpoints use client-scoped tokens. Requests authenticated with an API key are exempt from CSRF.
New to the API? Read API getting started first, then
try the worked examples.
Staff authentication
| Method | Path | Auth | What it does |
|---|---|---|---|
| POST | /api/auth/login | None | Authenticate with email and password. Returns an access token, refresh token, user record and a password_must_change flag. |
| POST | /api/auth/logout | JWT | Blacklist the presented token and end the session. |
| POST | /api/auth/refresh | None | Exchange a refresh token for a new access token. |
| POST | /api/auth/forgot-password | None | Send a password reset email. |
| POST | /api/auth/reset-password | None | Complete a password reset using an emailed token. |
| GET | /api/auth/me | JWT | Return the authenticated user. |
Client authentication
| Method | Path | Auth | What it does |
|---|---|---|---|
| POST | /api/client/auth/login | None | Authenticate a customer contact and return a client-scoped token pair. |
| POST | /api/client/auth/logout | Client | End the client session and blacklist the token. |
| POST | /api/client/auth/refresh | None | Refresh a client access token. |
| POST | /api/client/auth/forgot-password | None | Send a client password reset email. |
| POST | /api/client/auth/reset-password | None | Complete a client password reset. Also the account-activation path. |
| POST | /api/client/auth/register | None | Self-register a client account. With a ticket number, activates instantly after verifying the requester email matches; without one, emails an activation link and returns a uniform response that cannot be used to enumerate accounts. |
Public
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/public/ticket/{ticket_number}/requester-email | None | Return the masked requester address for a ticket number. Used to hint the correct sign-in address on the registration form. |
| GET | /oauth/success | None | Microsoft 365 OAuth completion landing endpoint. |
| GET | /api/health | None | Health probe returning status, timestamp and version. Rate-limit exempt. |
| GET | /api/metrics | Token | Metrics in Prometheus exposition format. Protected by METRICS_TOKEN when set. Rate-limit exempt. |
Client portal
Client-portal endpoints are scoped to the signed-in contact's company: ownership is verified on every ticket and attachment, mismatches are audit-logged and answered with 404, and internal notes are stripped server-side.
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/client/tickets | Client | List the contact's company's tickets. Supports page, per_page (max 100) and status. |
| GET | /api/client/tickets/{id} | Client | Return a single ticket with its conversation and attachments. Internal notes are removed server-side. Company ownership is verified; mismatches are audit-logged and return 404. |
| POST | /api/client/tickets | Client | Create a ticket. Body: subject, description, optional priority, optional attachments[]. |
| POST | /api/client/tickets/{id}/responses | Client | Add a reply to a ticket. Optionally with CC addresses and attachments[]. Reopens pending tickets, refuses closed tickets and notifies the assigned agent. |
| GET | /api/client/tickets/{id}/attachments/{attachmentId} | Client | Stream an attachment inline after ownership verification. |
| GET | /api/client/tickets/{id}/attachments/{attachmentId}/download | Client | Download an attachment after ownership verification. |
| GET | /api/client/kb/categories | Client | List visible categories containing at least one accessible article. |
| GET | /api/client/kb/articles | Client | Search and list accessible knowledge base articles. Supports search, category_id, limit, offset. |
| GET | /api/client/kb/articles/{id} | Client | Return a single accessible article. |
Tickets
Core ticket read and create endpoints are "flexible" so an integration can authenticate with either a JWT or an API key; an unknown source value on create auto-registers in the ticket-source vocabulary.
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/tickets | Flexible | List and filter tickets. Filters: status (comma-separated), priority, assigned_to (accepts unassigned), requester_email, customer_id (comma-separated), source, search, tags, date_from, date_to, date_field (created_at / updated_at / resolved_at / closed_at / sla_due_at), limit (max 100), offset, order_by, order_dir. |
| GET | /api/tickets/{id} | Flexible | Return a single ticket with its relations. |
| GET | /api/tickets/by-number/{ticketNumber} | Flexible | Look up a ticket by its human-readable ticket number. |
| POST | /api/tickets | Flexible | Create a ticket. Requires subject and a valid requester_email. Optional status, priority, description, source, assigned_to, customer_id. An unknown source auto-registers. A description becomes the opening message. Assignment triggers a notification email. |
| PUT | /api/tickets/{id} | JWT | Update ticket fields. |
| DELETE | /api/tickets/{id} | JWT | Delete a ticket. |
| PUT | /api/tickets/{id}/assign | JWT | Assign or unassign a ticket. Body: user_id (nullable). Notifies the new assignee. |
| PUT | /api/tickets/{id}/customer | JWT | Link or unlink the ticket's company. Body: customer_id (nullable). |
| PUT | /api/tickets/{id}/status | JWT | Change a ticket's status. Fires customer and agent notifications plus the admin side-channel. |
| PUT | /api/tickets/{id}/priority | JWT | Change a ticket's priority. |
| GET | /api/tickets/{id}/tags | JWT | List a ticket's tags. |
| POST | /api/tickets/{id}/tags | JWT | Add a tag to a ticket. |
| DELETE | /api/tickets/{id}/tags/{tagId} | JWT | Remove a tag from a ticket. |
| POST | /api/tickets/{id}/reply | JWT | Send a reply on a ticket. Accepts JSON or multipart/form-data with body, is_html, internal_note, cc (JSON array) and attachments[]. Persists the message, resolves and records CCs, uploads attachments, emails the customer with attachments included, stamps first_response_at, and returns granular delivery status (email_sent, email_error, email_error_code). Enforces AI-agent reply permissions. |
| POST | /api/tickets/{id}/spam | JWT | Archive a ticket to the spam table and hard-delete the original. The spam record keeps the full ticket detail. |
Messages and attachments
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/tickets/{ticketId}/messages | Flexible | Return the full conversation thread for a ticket. |
| POST | /api/tickets/{ticketId}/messages | Flexible | Create a message on a ticket. message_type is one of customer_reply, agent_reply, internal_note, system. Sender identity is derived from the authenticated user when not supplied, preventing sender spoofing, while explicit values remain available to the sync workers posting on a customer's behalf. Bumps the ticket's updated_at and dispatches ticket.new_message for agent and customer replies. |
| GET | /api/messages/{id} | JWT | Return a single message. |
| PUT | /api/messages/{id} | JWT | Update a message. |
| DELETE | /api/messages/{id} | JWT | Delete a message. |
| GET | /api/messages/{messageId}/attachments | JWT | List a message's attachments. |
| POST | /api/messages/{messageId}/attachments | JWT | Attach files to a message. |
| GET | /api/messages/search | JWT | Full-text search across message bodies. |
| GET | /api/attachments/{id}/download | None | Download an attachment through the proxy. Never exposes a public storage URL. |
| DELETE | /api/attachments/{id} | JWT | Delete an attachment from storage and the database. |
Customers and contacts
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/customers | JWT | List and search companies. Supports per_page, is_active, search and industry filters. Returns contact and ticket counts. |
| GET | /api/customers/{id} | JWT | Return a single company with its contacts. |
| POST | /api/customers | JWT | Create a company. |
| PUT | /api/customers/{id} | JWT | Update a company. |
| DELETE | /api/customers/{id} | JWT | Soft-delete a company. |
| GET | /api/customers/{id}/contacts | JWT | List the contacts for a company. |
| POST | /api/customers/{id}/contacts | JWT | Create a contact under a company. |
| GET | /api/contacts | JWT | List and filter all contacts across companies. |
| GET | /api/contacts/{id} | JWT | Return a single contact. |
| PUT | /api/contacts/{id} | JWT | Update a contact. |
| DELETE | /api/contacts/{id} | JWT | Soft-delete a contact. |
Users and roles
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/users | JWT | List staff users. |
| POST | /api/users | JWT | Create a staff user. Body: email, names, password, role, active flag, AI-agent flags. |
| PUT | /api/users/{id} | JWT | Update a user. |
| DELETE | /api/users/{id} | JWT | Delete a user. |
| POST | /api/users/{id}/reset-password | JWT | Set a temporary password for a user. Flags password_must_change and optionally emails the user. |
| PUT | /api/users/profile | JWT | Update your own profile. |
| PUT | /api/users/password | JWT | Change your own password. |
| POST | /api/users/avatar | JWT | Upload your avatar to object storage. |
| GET | /api/roles | JWT | List all roles with display names, descriptions and permission lists. |
| GET | /api/roles/{role} | JWT | Return one role's metadata. |
| GET | /api/roles/me/permissions | JWT | Return the caller's effective permissions. |
| POST | /api/roles/me/check-permission | JWT | Test whether the caller holds a single permission. |
| POST | /api/roles/me/check-permissions | JWT | Test several permissions at once. |
Knowledge base
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/kb/articles | None | List and filter articles. Filters: status, category_id, author_id, is_featured, search, tag_id, visibility, can_edit_role, limit, offset, order_by, order_dir. |
| GET | /api/kb/articles/{id} | None | Return a single article, with permission checking. |
| GET | /api/kb/articles/slug/{slug} | None | Return a single article by slug. |
| POST | /api/kb/articles | JWT | Create an article. Requires category_id, title, body_html. Auto-generates a unique slug, plain-text body and excerpt. Accepts tags and company_ids. |
| PUT | /api/kb/articles/{id} | JWT | Update an article. |
| DELETE | /api/kb/articles/{id} | JWT | Delete an article. |
| POST | /api/kb/articles/{id}/publish | JWT | Publish an article and stamp published_at. |
| POST | /api/kb/articles/{id}/unpublish | JWT | Return an article to draft. |
| POST | /api/kb/articles/{id}/vote/helpful | None | Record a helpful vote. |
| POST | /api/kb/articles/{id}/vote/not-helpful | None | Record a not-helpful vote. |
| GET | /api/kb/categories | None | List categories. |
| GET | /api/kb/categories/tree | None | Return the full nested category tree. |
| GET | /api/kb/categories/{id} | None | Return a single category. |
| GET | /api/kb/categories/slug/{slug} | None | Return a category by slug. |
| GET | /api/kb/categories/{id}/breadcrumbs | None | Return the ancestor chain for a category. |
| POST | /api/kb/categories | JWT | Create a category. Body: name, slug, description, parent, visibility, company assignments. |
| PUT | /api/kb/categories/{id} | JWT | Update a category. |
| DELETE | /api/kb/categories/{id} | JWT | Delete a category. |
| POST | /api/kb/categories/reorder | JWT | Bulk reorder categories. |
| POST | /api/kb/categories/{id}/move | JWT | Re-parent a category. |
| GET | /api/kb/images | JWT | List media library images. |
| POST | /api/kb/images | JWT | Upload an image to the media library. Multipart upload; CSRF-exempt for the upload form. |
| GET | /api/kb/images/{id} | None | Serve an image through the authenticated proxy. |
| DELETE | /api/kb/images/{id} | JWT | Delete an image. |
Reports
Access to the reporting endpoints is restricted to the Super Admin, Agent and Viewer roles.
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/reports/overview | JWT | Return summary statistics, status and priority distributions, volume trend, dual SLA compliance, response-time distribution and source distribution. Accepts date_from, date_to and the shared filter set (status, priority, source, agent_id, customer_id). |
| GET | /api/reports/agents | JWT | Return agent performance, leaderboard, workload and optional per-agent detail. |
| GET | /api/reports/customers | JWT | Return customer statistics, top customers and optional per-customer detail. |
| GET | /api/reports/contacts | JWT | Return contact-level ticket statistics. |
| GET | /api/reports/sources | JWT | Return per-source volumes and trend over time. |
| GET | /api/reports/filters | JWT | Return the available filter options (active agents, customers, statuses) for building filter UIs. |
| GET | /api/reports/export | JWT | Export a report as CSV. type selects the report; the same filters as the on-screen report are applied. |
SLA
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/sla-settings | JWT | Return policies, business hours, holidays and digest configuration in one call. |
| PUT | /api/sla-policies | JWT · Super Admin | Update per-priority first-response and resolution targets in minutes. Validates priority values and enforces a one-minute minimum. |
| PUT | /api/sla/business-hours | JWT · Super Admin | Set the timezone and per-weekday enabled/open/close windows. The timezone is validated against the system timezone list. |
| POST | /api/sla/holidays | JWT · Super Admin | Add a named non-working date. |
| DELETE | /api/sla/holidays/{id} | JWT · Super Admin | Remove a holiday. |
| PUT | /api/sla/digest | JWT · Super Admin | Configure weekly and monthly digests and their recipients. |
Notifications
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/notifications/events | JWT | List the five event types with enabled state and descriptions. |
| PUT | /api/notifications/events/{key} | JWT | Enable or disable an event. |
| GET | /api/notifications/recipients/{eventKey} | JWT | List the recipients for one event. |
| POST | /api/notifications/recipients | JWT | Add a recipient to an event. |
| PUT | /api/notifications/recipients/{id} | JWT | Update a recipient. |
| DELETE | /api/notifications/recipients/{id} | JWT | Remove a recipient. |
| GET | /api/notifications/settings | JWT | Return notification settings such as the daily report time. |
| PUT | /api/notifications/settings | JWT | Update notification settings. |
| POST | /api/notifications/test/{eventKey} | JWT | Send a test notification for an event. |
Email — inbound sources
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/email-sources | JWT | List configured inbound mailboxes. |
| GET | /api/email-sources/{id} | JWT | Return a single inbound source. |
| POST | /api/email-sources | JWT | Create a Microsoft 365 or IMAP inbound source. Body: name, type, mailbox/credentials, sync folder, sync interval, mark-as-read, color, active flag. Credentials are encrypted at rest. |
| PUT | /api/email-sources/{id} | JWT | Update an inbound source. |
| DELETE | /api/email-sources/{id} | JWT | Soft-delete an inbound source. |
| POST | /api/email-sources/{id}/make-default | JWT | Mark a source as the default. Clears the previous default. |
| POST | /api/email-sources/test-connection | JWT | Run a live connection test. Checks DNS resolution, port connectivity and authentication. |
| POST | /api/email-sources/{id}/start-worker | JWT | Start this source's sync worker. |
| POST | /api/email-sources/{id}/stop-worker | JWT | Stop this source's sync worker. |
Email — outbound configuration
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/outgoing-email | JWT | Return the current active sending configuration. |
| POST | /api/outgoing-email | JWT | Save the sending configuration. Microsoft 365 or SendGrid; From address and name, reply-to, domain. |
| POST | /api/outgoing-email/test-connection | JWT | Verify the provider credentials. |
| POST | /api/outgoing-email/verify-dns | JWT | Check the sending domain's DNS records. |
| POST | /api/outgoing-email/send-test | JWT | Send a real test email. |
| DELETE | /api/outgoing-email/{id} | JWT | Remove a sending configuration. |
Microsoft 365 OAuth and workers
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/oauth/microsoft365/authorize | JWT | Begin the OAuth flow via the broker. |
| GET | /api/oauth/microsoft365/status | JWT | Return the connection status. |
| GET | /api/oauth/microsoft365/mailboxes | JWT | List the mailboxes the connected account can access. |
| POST | /api/oauth/microsoft365/refresh | JWT | Force a token refresh. |
| DELETE | /api/oauth/microsoft365/disconnect | JWT | Disconnect the account. |
| GET | /api/oauth/microsoft365/test | JWT | Test the Graph connection. |
| POST | /api/oauth/microsoft365/mailbox-config | JWT | Update the mailbox configuration. |
| GET | /api/oauth/microsoft365/worker-status | JWT | Return per-source and aggregated worker health. Alive state, heartbeat age, last sync, start time, error count, emails today/session/lifetime, last error, last check. |
| POST | /api/oauth/microsoft365/worker/start | JWT | Start the sync worker. |
| POST | /api/oauth/microsoft365/worker/stop | JWT | Stop the sync worker. |
| POST | /api/oauth/microsoft365/worker/restart | JWT | Restart the sync worker. |
| GET | /api/oauth/microsoft365/worker/errors | JWT | Return the recent worker error history. |
Worker management
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/workers | JWT | List all registered workers with their intended and actual running state. |
| GET | /api/workers/{name} | JWT | Return one worker's state. |
| POST | /api/workers/{name}/start | JWT | Start a worker. Optionally overrides the worker's configuration. |
| POST | /api/workers/{name}/stop | JWT | Stop a worker. |
Ticket sources
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/ticket-sources | Flexible | List the channel vocabulary with colors. |
| POST | /api/ticket-sources | JWT | Add a source label. |
| PUT | /api/ticket-sources/{id} | JWT | Rename or recolor a source label. |
| DELETE | /api/ticket-sources/{id} | JWT | Remove a source label. |
Appearance and branding
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/appearance | None | Return the current color scheme and branding settings. Public so login pages can theme themselves. |
| PUT | /api/appearance | JWT | Save colors and branding. |
| POST | /api/appearance/reset | JWT | Restore the default appearance. |
| POST | /api/appearance/logo-upload | JWT | Upload a client-portal logo. |
| GET | /api/appearance/logo/{type} | None | Serve a stored logo through the proxy. |
Email customization
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/email-customization/settings | JWT | Return the business information used across all templates. |
| PUT | /api/email-customization/settings | JWT | Update the business information. |
| GET | /api/email-customization/templates | JWT | List all email templates. |
| GET | /api/email-customization/templates/{id} | JWT | Return one template by ID. |
| GET | /api/email-customization/templates/by-key/{key} | JWT | Return one template by key. For example ticket_reply. |
| POST | /api/email-customization/templates | JWT | Create a custom template. |
| PUT | /api/email-customization/templates/{id} | JWT | Update a template's subject and body. |
| DELETE | /api/email-customization/templates/{id} | JWT | Delete a custom template. |
| POST | /api/email-customization/templates/{id}/preview | JWT | Render a preview with live merge data. |
| POST | /api/email-customization/templates/{id}/reset | JWT | Restore the shipped default template. |
Audit logs
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/audit-logs | JWT | Return a filterable audit log listing. |
| GET | /api/audit-logs/entity/{entity_type}/{entity_id} | JWT | Return the complete change history for one record. |
| GET | /api/audit-logs/user/{user_id} | JWT | Return one user's activity. |
| GET | /api/audit-logs/recent | JWT | Return the recent activity feed. |
| GET | /api/audit-logs/stats | JWT | Return aggregated statistics, groupable by action. |
| POST | /api/audit-logs/export | JWT | Export audit logs to CSV. |
| POST | /api/audit-logs/purge | JWT | Apply a retention policy to the audit log. |
API tokens
| Method | Path | Auth | What it does |
|---|---|---|---|
| POST | /api/tokens | JWT | Create an API token. Body: name, optional expires_in_days (1–365). Returns the plaintext once. Restricted to Super Admin and Agent. |
| GET | /api/tokens | JWT | List your tokens. Never returns the plaintext. |
| GET | /api/tokens/{id} | JWT | Return token metadata. |
| POST | /api/tokens/{id}/revoke | JWT | Revoke a token without deleting its record. |
| DELETE | /api/tokens/{id} | JWT | Delete a token. |
| GET | /api/tokens/test | API key | Verify that an API key works. |
CSRF
| Method | Path | Auth | What it does |
|---|---|---|---|
| GET | /api/csrf/token | JWT | Return a user-scoped CSRF token. |
| GET | /api/csrf/session-token | None | Return a session-scoped CSRF token for pre-login forms. |
| GET | /api/csrf/config | None | Return the CSRF configuration. Whether enforcement is enabled and the header name. |