Reference

Developer API

Vektra documentation

Vektra API Documentation

Welcome to the Vektra Developer API — the official API for receiving and managing demo submissions, support tickets, releases, and email automation through your own website, app, or AI assistant.

---

Base URL

https://dashboard.vektra.games/api/v1

---

Authentication

All API requests must include your API key in the request headers.

X-API-Key: vk_your_key_here

Or as a Bearer token:

Authorization: Bearer vk_your_key_here
Generate your API key from the Dashboard → Developer → API Keys tab.

Scoping

Vektra issues two kinds of keys:

Key typeWhat it can access
Workspace keyEverything in the label: submissions, analytics, tickets, releases, webhooks, and email settings.
Person keyBound to one artist's email — only that person's own submissions, analytics, and tickets. Cannot read or change webhooks, releases, or email settings.

Use person keys when handing an artist (or their AI assistant) access to their own data.

---

Endpoints

GET /v1/submissions

Fetch demo submissions from your label's database.

Query Parameters:

ParameterTypeDefaultDescription
limitnumber20Max results (max: 100)
offsetnumber0Pagination offset

Example Request:

curl https://dashboard.vektra.games/api/v1/submissions \
  -H "X-API-Key: vk_your_key_here"

Example Response:

{
  "data": [
    {
      "id": 1,
      "track_title": "Midnight Drive",
      "artist_name": "DJ Nova",
      "genre": "House",
      "status": "In Queue",
      "created_at": "2026-07-20T10:00:00Z"
    }
  ],
  "limit": 20,
  "offset": 0
}

---

POST /v1/submissions

Submit a new demo from your website into your label's queue.

Request Body (JSON):

FieldTypeRequiredDescription
track_titlestring✅Track title
artist_namestring✅Artist or band name
demo_urlstring✅Direct link to the demo (SoundCloud, Drive, etc.)
genrestringGenre (e.g. "House", "Trap")
notesstringExtra notes from the artist
emailstringArtist's email for status update notifications

Example Request:

curl -X POST https://dashboard.vektra.games/api/v1/submissions \
  -H "X-API-Key: vk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "track_title": "Midnight Drive",
    "artist_name": "DJ Nova",
    "demo_url": "https://soundcloud.com/djnova/midnight-drive",
    "genre": "House",
    "email": "djnova@example.com"
  }'

Example Response:

{
  "success": true,
  "submission_id": 42,
  "created_at": "2026-07-20T10:00:00Z"
}
Tip: If you include an email, the artist will automatically receive email updates when your team approves or rejects their demo. They'll also get a one-time secure reply link.

---

DELETE /v1/submissions

Permanently delete a demo submission by its ticket ID.

Query Parameter: id (the submission's ticket ID, e.g. SUB-0001).

The same value can be sent in the JSON body as submission_id or id instead.

Example Request:

curl -X DELETE https://dashboard.vektra.games/api/v1/submissions?id=SUB-0001 \
  -H "X-API-Key: vk_your_key_here"

Example Response:

{
  "success": true,
  "deleted_submission_id": "SUB-0001"
}

A person key can only delete its own submissions (matched by email). Deleting a submission that doesn't exist (or isn't yours) returns 404.

---

GET /v1/analytics

Fetch chart-ready analytics for your label's submissions.

Example Request:

curl https://dashboard.vektra.games/api/v1/analytics \
  -H "X-API-Key: vk_your_key_here"

Example Response:

{
  "status_breakdown": [
    { "status": "In Queue", "count": "120" },
    { "status": "Approved", "count": "34" },
    { "status": "Rejected", "count": "89" }
  ],
  "rating_breakdown": [
    { "rating": 8, "count": "12" },
    { "rating": 9, "count": "7" }
  ],
  "recent_activity": [
    { "day": "2026-07-19T00:00:00Z", "count": "14" }
  ],
  "top_genres": [
    { "genre": "house", "count": "45" },
    { "genre": "trap", "count": "30" }
  ]
}

---

GET /v1/tickets

List support tickets. Optionally filter by status (e.g. open, resolved).

Example Request:

curl "https://dashboard.vektra.games/api/v1/tickets?status=open" \
  -H "X-API-Key: vk_your_key_here"

Example Response:

{
  "tickets": [
    {
      "id": 7,
      "subject": "Demo link broken",
      "status": "open",
      "created_at": "2026-07-21T14:00:00Z"
    }
  ]
}

---

POST /v1/tickets

Open a new support ticket.

Request Body (JSON):

FieldTypeRequiredDescription
subjectstring✅Ticket subject
messagestring✅The message (also accepts body)
namestringPerson opening the ticket

Example Request:

curl -X POST https://dashboard.vektra.games/api/v1/tickets \
  -H "X-API-Key: vk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Demo link broken",
    "message": "The SoundCloud link 404s, here is a new one: ...",
    "name": "DJ Nova"
  }'

---

DELETE /v1/tickets

Permanently delete a support ticket by its ID.

Query Parameter: id (or send ticket_id / id in the JSON body).

curl -X DELETE https://dashboard.vektra.games/api/v1/tickets?id=7 \
  -H "X-API-Key: vk_your_key_here"

Example Response:

{
  "success": true,
  "deleted_ticket_id": "7"
}

---

GET /v1/releases

List release packages submitted for Vektra QC. Workspace keys only.

curl https://dashboard.vektra.games/api/v1/releases \
  -H "X-API-Key: vk_your_key_here"

---

Webhooks

Webhook subscriptions let you receive workspace events in real time. Workspace keys only.

MethodEndpointDescription
GET/v1/webhooksList subscriptions and delivery status
POST/v1/webhooksSubscribe a URL to events
DELETE/v1/webhooksRemove a subscription

Supported events: submission.created, submission.status_changed

Example — subscribe:

curl -X POST https://dashboard.vektra.games/api/v1/webhooks \
  -H "X-API-Key: vk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/webhooks/vektra",
    "events": ["submission.created", "submission.status_changed"]
  }'

The response includes the webhook id and an HMAC signing secret — store the secret on your side to verify payloads. If you don't provide a secret, Vektra generates one.

Example — unsubscribe:

curl -X DELETE https://dashboard.vektra.games/api/v1/webhooks \
  -H "X-API-Key: vk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_id": "wh_abc123"
  }'

---

Email Settings

Read or update the workspace's artist email configuration. Workspace keys only.

MethodEndpointDescription
GET/v1/settings/emailRead email template, reply address, and Resend status
PUT/v1/settings/emailUpdate the custom HTML template and/or reply address

Example GET response:

{
  "custom_domain": "demos.yourlabel.com",
  "reply_email": "no-reply@yourlabel.com",
  "resend_key_set": true,
  "email_html": "<!DOCTYPE html>..."
}

Example PUT request:

curl -X PUT https://dashboard.vektra.games/api/v1/settings/email \
  -H "X-API-Key: vk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reply_email": "no-reply@yourlabel.com",
    "email_html": "<!DOCTYPE html>..."
  }'

resend_key_set: false means no Resend API key is configured, so emails cannot be sent. The key itself is set in the Dashboard → Developer tab and can never be read back through the API.

See also: the Email & artist notifications guide covers Resend setup, custom sender domains, template placeholders, and reply links. The MCP & AI assistants page covers using these endpoints through Claude and other AI tools.

---

Email Notifications

When you approve or reject a submission from the Dashboard and the submission has an email field:

  1. Vektra first tries to DM the artist on Discord (if they are in your server).
  2. If they aren't in the server, Vektra sends a branded email from your label's sender domain (configured in Dashboard → Developer).
  3. The email includes a one-time secure reply link — the artist can click it, type a response, and Vektra forwards that reply directly to your staff Discord channel.

---

Custom Domains

You can serve Vektra's submission portal from your own domain (e.g. demos.yourlabel.com).

  1. Add a CNAME record at your DNS provider:
  • Name: demos (or whatever subdomain you want)
  • Value: cname.vercel-dns.com
  1. Go to Dashboard → Developer → Custom Domain and enter your domain.
  1. Vektra will verify the DNS and provision an SSL certificate automatically.

Your free subdomain is also always available at yourlabelname.vektra.games.

---

Rate Limits

EndpointLimit
POST /v1/submissions20 per minute
All other endpoints60 per minute

---

Error Codes

StatusMeaning
401Missing API Key
403Invalid or expired API Key, or endpoint not allowed for this key scope
400Missing required fields
404Resource not found
409Conflict (e.g. domain already taken)
503Storage unavailable for this workspace
500Internal Server Error
Vektra Docs Built for labels, artists, and staff teams.
Ctrl I