2025-12-03 19:29:37 +00:00
{
"swagger" : "2.0" ,
"info" : {
2026-01-11 15:30:43 +00:00
"description" : "Backend API for Veza platform." ,
"title" : "Veza Backend API" ,
"termsOfService" : "http://swagger.io/terms/" ,
"contact" : {
"name" : "API Support" ,
"url" : "http://www.veza.app/support" ,
"email" : "support@veza.app"
} ,
"license" : {
"name" : "Apache 2.0" ,
"url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
} ,
"version" : "1.2.0"
2025-12-03 19:29:37 +00:00
} ,
2026-04-23 22:45:10 +00:00
"host" : "localhost:18080" ,
2026-01-11 15:30:43 +00:00
"basePath" : "/api/v1" ,
2025-12-03 19:29:37 +00:00
"paths" : {
2026-02-15 15:18:13 +00:00
"/api/v1/dashboard" : {
2026-01-11 15:29:31 +00:00
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-02-15 15:18:13 +00:00
"description" : "Get aggregated dashboard data including stats, recent activity, and library preview" ,
2026-01-11 15:29:31 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-15 15:18:13 +00:00
"Dashboard"
2026-01-11 15:29:31 +00:00
] ,
2026-02-15 15:18:13 +00:00
"summary" : "Get Dashboard Data" ,
2026-01-11 15:29:31 +00:00
"parameters" : [
{
"type" : "integer" ,
2026-02-15 15:18:13 +00:00
"description" : "Number of recent activity items (default: 10)" ,
"name" : "activity_limit" ,
2026-01-11 15:29:31 +00:00
"in" : "query"
} ,
{
2026-02-15 15:18:13 +00:00
"type" : "integer" ,
"description" : "Number of library items (default: 5)" ,
"name" : "library_limit" ,
2026-01-11 15:29:31 +00:00
"in" : "query"
} ,
{
"type" : "string" ,
2026-02-15 15:18:13 +00:00
"description" : "Time period for statistics: 7d, 30d, 90d, all (default: 30d)" ,
"name" : "stats_period" ,
2026-01-11 15:29:31 +00:00
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.DashboardResponse"
2026-01-07 18:39:21 +00:00
}
}
}
]
2025-12-03 19:29:37 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-03 19:29:37 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"500" : {
"description" : "Internal server error" ,
2025-12-03 19:29:37 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/logs/frontend" : {
2025-12-06 16:34:18 +00:00
"post" : {
2026-01-07 18:39:21 +00:00
"description" : "Receive and store a log entry from the frontend application" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Logging"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Receive frontend log" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"description" : "Frontend log entry" ,
"name" : "log" ,
2025-12-06 16:34:18 +00:00
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.FrontendLogRequest"
2025-12-06 16:34:18 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
2026-01-07 18:39:21 +00:00
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"received" : {
"type" : "boolean"
}
}
}
}
}
]
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid log entry" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"500" : {
2026-01-07 18:39:21 +00:00
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/marketplace/download/{product_id}" : {
"get" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get a secure download URL for a purchased product" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get download URL" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Product ID" ,
"name" : "product_id" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
2026-01-07 18:39:21 +00:00
"description" : "OK" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"additionalProperties" : {
"type" : "string"
}
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"403" : {
"description" : "No license" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
"description" : "Not Found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/marketplace/orders" : {
2025-12-06 16:34:18 +00:00
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get all orders for the authenticated user" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "List user orders" ,
2025-12-06 16:34:18 +00:00
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
2026-01-07 18:39:21 +00:00
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Order"
2026-01-07 18:39:21 +00:00
}
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
} ,
2025-12-06 16:34:18 +00:00
"post" : {
2026-01-07 18:39:21 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Purchase products" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Create a new order" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"description" : "Order items" ,
"name" : "order" ,
2025-12-06 16:34:18 +00:00
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.CreateOrderRequest"
2025-12-06 16:34:18 +00:00
}
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"201" : {
"description" : "Created" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Order"
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
2026-01-07 18:39:21 +00:00
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/marketplace/orders/{id}" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get details of a specific order (only order owner can access)" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get order details" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Order ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"200" : {
"description" : "OK" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Order"
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"403" : {
"description" : "Forbidden - Not order owner" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Order not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/marketplace/products" : {
"get" : {
"description" : "List marketplace products with filters" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Marketplace"
] ,
"summary" : "List products" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Product status" ,
"name" : "status" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Seller ID" ,
"name" : "seller_id" ,
"in" : "query"
2026-01-11 15:29:31 +00:00
} ,
{
"type" : "string" ,
"description" : "Search query" ,
"name" : "q" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Product type (track, pack, service)" ,
"name" : "type" ,
"in" : "query"
} ,
{
"type" : "number" ,
"description" : "Minimum price" ,
"name" : "min_price" ,
"in" : "query"
} ,
{
"type" : "number" ,
"description" : "Maximum price" ,
"name" : "max_price" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
2026-01-07 18:39:21 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Product"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
2025-12-06 16:34:18 +00:00
"post" : {
2026-01-07 18:39:21 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Create a product (Track, Pack, Service) for sale" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Create a new product" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"description" : "Product info" ,
"name" : "product" ,
2025-12-06 16:34:18 +00:00
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.CreateProductRequest"
2025-12-06 16:34:18 +00:00
}
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"201" : {
"description" : "Created" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Product"
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/api/v1/marketplace/products/{id}" : {
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Update product details (only seller can update)" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Marketplace"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Update a product" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Product ID" ,
"name" : "id" ,
"in" : "path" ,
2025-12-06 16:34:18 +00:00
"required" : true
2026-01-07 18:39:21 +00:00
} ,
{
"description" : "Product updates" ,
"name" : "product" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.UpdateProductRequest"
2026-01-07 18:39:21 +00:00
}
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
2026-01-07 18:39:21 +00:00
"description" : "OK" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.Product"
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Validation Error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden - Not product owner" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Product not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/audit/activity" : {
2025-12-06 16:34:18 +00:00
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get recent activity logs for the current user" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Audit"
] ,
"summary" : "Get user activity" ,
"parameters" : [
{
"type" : "integer" ,
"default" : 50 ,
"description" : "Number of activities to return" ,
"name" : "limit" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"activities" : {
"type" : "array"
}
}
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/audit/logs" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Search and filter audit logs with pagination support. Supports filtering by action, resource, date range, IP address, and user agent." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Audit"
] ,
"summary" : "Search audit logs" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Filter by action type" ,
"name" : "action" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by resource type" ,
"name" : "resource" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by resource ID (UUID)" ,
"name" : "resource_id" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by IP address" ,
"name" : "ip_address" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by user agent" ,
"name" : "user_agent" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Start date filter (YYYY-MM-DD)" ,
"name" : "start_date" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "End date filter (YYYY-MM-DD)" ,
"name" : "end_date" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"description" : "Offset for pagination" ,
"name" : "offset" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"logs" : {
"type" : "array"
} ,
"pagination" : {
"type" : "object"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/audit/stats" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get audit statistics for the current user, optionally filtered by date range" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Audit"
] ,
"summary" : "Get audit statistics" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Start date (YYYY-MM-DD)" ,
"name" : "start_date" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "End date (YYYY-MM-DD)" ,
"name" : "end_date" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"stats" : {
"type" : "object"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/2fa/disable" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Disable 2FA for user (requires password confirmation)" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Disable 2FA" ,
"parameters" : [
{
"description" : "Password Confirmation" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.DisableTwoFactorRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid password or 2FA not enabled" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/2fa/setup" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Generate 2FA secret and QR code for setup" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Setup 2FA" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.SetupTwoFactorResponse"
2026-01-07 18:39:21 +00:00
}
}
}
]
}
} ,
"400" : {
"description" : "2FA already enabled" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/2fa/status" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get 2FA enabled status for authenticated user" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Get 2FA Status" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"enabled" : {
"type" : "boolean"
}
}
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/2fa/verify" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Verify 2FA code and enable 2FA for user" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Verify and Enable 2FA" ,
"parameters" : [
{
"description" : "2FA Code" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.VerifyTwoFactorRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid code" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/check-username" : {
"get" : {
"description" : "Check if a username is already taken" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Check Username Availability" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Username to check" ,
"name" : "username" ,
"in" : "query" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"available" : {
"type" : "boolean"
} ,
"username" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Missing Username" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/login" : {
"post" : {
"description" : "Authenticate user and return access token. Refresh token is set in httpOnly cookie." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "User Login" ,
"parameters" : [
{
"description" : "Login Credentials" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.LoginRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "Access token returned in body, refresh token in httpOnly cookie" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.LoginResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Validation or Bad Request" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Invalid credentials" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/logout" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Revoke refresh token and current session" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Logout" ,
"parameters" : [
{
"description" : "Refresh Token to revoke" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"type" : "object" ,
"properties" : {
"refresh_token" : {
"type" : "string"
}
}
}
}
] ,
"responses" : {
"200" : {
"description" : "Success message" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/me" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get profile information of the currently logged-in user" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Get Current User" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object"
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "User not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/refresh" : {
"post" : {
"description" : "Get a new access token using a refresh token" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Refresh Token" ,
"parameters" : [
{
"description" : "Refresh Token" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.RefreshRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.TokenResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Invalid/Expired Refresh Token" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/register" : {
"post" : {
"description" : "Register a new user account" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "User Registration" ,
"parameters" : [
{
"description" : "Registration Data" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.RegisterRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"201" : {
"description" : "Created" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.RegisterResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"409" : {
"description" : "User already exists" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/resend-verification" : {
"post" : {
"description" : "Resend the email verification link" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Resend Verification Email" ,
"parameters" : [
{
"description" : "Email" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.ResendVerificationRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "Success message" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
}
}
}
}
} ,
"/auth/stream-token" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Returns a 5-minute JWT for HLS and WebSocket authentication (httpOnly cookies prevent direct token access)" ,
"tags" : [
"Auth"
] ,
"summary" : "Get ephemeral stream token" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"$ref" : "#/definitions/internal_handlers.StreamTokenResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/auth/verify-email" : {
"post" : {
"description" : "Verify user email address using a token" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Auth"
] ,
"summary" : "Verify Email" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Verification Token" ,
"name" : "token" ,
"in" : "query" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "Success message" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Invalid Token" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/chat/token" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Generate a short-lived token for chat authentication" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Chat"
] ,
"summary" : "Get Chat Token" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"token" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/comments/{id}" : {
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Update a comment (only by owner)" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Comment"
] ,
"summary" : "Update comment" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Comment ID (UUID)" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "Updated comment content" ,
"name" : "comment" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.UpdateCommentRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"comment" : {
"type" : "object"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden - can only edit own comments" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Comment not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/comments/{id}/replies" : {
"get" : {
"description" : "Get paginated list of replies to a comment" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Comment"
] ,
"summary" : "Get comment replies" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Parent Comment ID (UUID)" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"minimum" : 1 ,
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"maximum" : 100 ,
"minimum" : 1 ,
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"pagination" : {
"type" : "object"
} ,
"replies" : {
"type" : "array"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Parent comment not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/playlists" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get a paginated list of playlists" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Get Playlists" ,
"parameters" : [
{
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by User ID" ,
"name" : "user_id" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"pagination" : {
"type" : "object"
} ,
"playlists" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Playlist"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
}
]
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
} ,
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Create a new playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Create Playlist" ,
"parameters" : [
{
"description" : "Playlist Metadata" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.CreatePlaylistRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"201" : {
"description" : "Created" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"playlist" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Playlist"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/playlists/{id}" : {
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get detailed information about a playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Get Playlist by ID" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"playlist" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Playlist"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid ID" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Playlist not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
} ,
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Update playlist metadata" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Update Playlist" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "Playlist Metadata" ,
"name" : "playlist" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.UpdatePlaylistRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"playlist" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Playlist"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Playlist not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
} ,
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Permanently delete a playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Delete Playlist" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Playlist not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/playlists/{id}/tracks" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Add a track to the playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Add Track to Playlist" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "Track ID (in body)" ,
"name" : "trackId" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"type" : "object" ,
"properties" : {
"track_id" : {
"type" : "string"
}
}
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Track already present or invalid ID" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Playlist or Track not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/playlists/{id}/tracks/reorder" : {
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Reorder tracks in the playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Reorder Tracks" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "New Track Order" ,
"name" : "order" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.ReorderTracksRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/playlists/{id}/tracks/{trackId}" : {
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Remove a track from the playlist" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Playlist"
] ,
"summary" : "Remove Track from Playlist" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Playlist ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"type" : "string" ,
"description" : "Track ID" ,
"name" : "trackId" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"404" : {
"description" : "Playlist or Track not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/tracks" : {
2026-04-23 22:45:10 +00:00
"get" : {
"description" : "List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset." ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "List tracks" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Opaque pagination cursor (overrides page)" ,
"name" : "cursor" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number, 1-based (ignored if cursor set)" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page (max 100)" ,
"name" : "limit" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by creator UUID" ,
"name" : "user_id" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by genre" ,
"name" : "genre" ,
"in" : "query"
} ,
{
"type" : "string" ,
"description" : "Filter by audio format (mp3, flac, wav, ogg, m4a, aac)" ,
"name" : "format" ,
"in" : "query"
} ,
{
"type" : "string" ,
"default" : "created_at" ,
"description" : "Sort column (created_at, play_count, title)" ,
"name" : "sort_by" ,
"in" : "query"
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"pagination" : {
"type" : "object"
} ,
"tracks" : {
"type" : "array" ,
"items" : {
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
}
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid query params" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Upload a new track (audio file)" ,
"consumes" : [
"multipart/form-data"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Upload Track" ,
"parameters" : [
{
"type" : "file" ,
"description" : "Audio File (MP3, WAV, FLAC, OGG)" ,
"name" : "file" ,
"in" : "formData" ,
"required" : true
}
] ,
"responses" : {
"201" : {
"description" : "Created" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"track" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "No file or validation error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Quota exceeded" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
2026-04-23 22:45:10 +00:00
"/tracks/batch/delete" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others)." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Batch delete tracks" ,
"parameters" : [
{
"description" : "List of track UUIDs" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"$ref" : "#/definitions/internal_core_track.BatchDeleteRequest"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"deleted" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"failed" : {
"type" : "array" ,
"items" : {
"type" : "object"
}
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation / batch size exceeded" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
}
} ,
"/tracks/batch/update" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Batch update tracks" ,
"parameters" : [
{
"description" : "Track UUIDs + shared updates map" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"$ref" : "#/definitions/internal_core_track.BatchUpdateRequest"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"failed" : {
"type" : "array" ,
"items" : {
"type" : "object"
}
} ,
"updated" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation / batch size exceeded" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/tracks/chunk" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Upload a single chunk of a file" ,
"consumes" : [
"multipart/form-data"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Upload Chunk" ,
"parameters" : [
{
"type" : "file" ,
"description" : "Chunk Data" ,
"name" : "chunk" ,
"in" : "formData" ,
"required" : true
} ,
{
"type" : "string" ,
"description" : "Upload ID" ,
"name" : "upload_id" ,
"in" : "formData" ,
"required" : true
} ,
{
"type" : "integer" ,
"description" : "Chunk Number" ,
"name" : "chunk_number" ,
"in" : "formData" ,
"required" : true
} ,
{
"type" : "integer" ,
"description" : "Total Chunks" ,
"name" : "total_chunks" ,
"in" : "formData" ,
"required" : true
} ,
{
"type" : "integer" ,
"format" : "int64" ,
"description" : "Total Size" ,
"name" : "total_size" ,
"in" : "formData" ,
"required" : true
} ,
{
"type" : "string" ,
"description" : "Filename" ,
"name" : "filename" ,
"in" : "formData" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
} ,
"progress" : {
"type" : "number" ,
"format" : "float64"
} ,
"received_chunks" : {
"type" : "integer"
} ,
"upload_id" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/tracks/complete" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Finish upload session and assemble file" ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Complete Chunked Upload" ,
"parameters" : [
{
"description" : "Upload ID" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_core_track.CompleteChunkedUploadRequest"
2026-01-07 18:39:21 +00:00
}
}
] ,
"responses" : {
"201" : {
"description" : "Created" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"md5" : {
"type" : "string"
} ,
"message" : {
"type" : "string"
} ,
"track" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
2026-01-07 18:39:21 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation or Assemblage Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
}
}
}
} ,
"/tracks/initiate" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Start a new chunked upload session" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Track"
] ,
"summary" : "Initiate Chunked Upload" ,
"parameters" : [
{
"description" : "Upload Metadata" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_core_track.InitiateChunkedUploadRequest"
2026-01-07 18:39:21 +00:00
}
}
2025-12-06 16:34:18 +00:00
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"message" : {
"type" : "string"
} ,
"upload_id" : {
2025-12-06 16:34:18 +00:00
"type" : "string"
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"400" : {
"description" : "Validation Error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/tracks/quota/{id}" : {
2025-12-06 16:34:18 +00:00
"get" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get remaining upload quota for the user" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Track"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get Upload Quota" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-03-03 19:17:54 +00:00
"description" : "User ID or 'me' for current user" ,
2026-01-07 18:39:21 +00:00
"name" : "id" ,
2026-03-03 19:17:54 +00:00
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"quota" : {
2025-12-06 16:34:18 +00:00
"type" : "object"
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
}
} ,
"/tracks/resume/{uploadId}" : {
"get" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get state of an interrupted upload" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Track"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Resume Upload" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Upload ID" ,
"name" : "uploadId" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"200" : {
"description" : "OK" ,
2025-12-06 16:34:18 +00:00
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"chunks_received" : {
"type" : "integer"
} ,
"upload_id" : {
"type" : "string"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
2026-04-23 22:45:10 +00:00
"description" : "Upload session not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
}
} ,
"/tracks/{id}" : {
"get" : {
"description" : "Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202)." ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Get track by ID" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Track UUID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"track" : {
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid track id" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"404" : {
"description" : "Track not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
} ,
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Update the metadata of an existing track. Caller must own the track or be admin." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Update track metadata" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Track UUID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "Updated metadata" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"$ref" : "#/definitions/internal_core_track.UpdateTrackRequest"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"track" : {
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation / invalid id" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"403" : {
"description" : "Not owner / no admin" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"404" : {
"description" : "Track not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
} ,
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Soft-delete a track (sets deleted_at). Caller must own the track or be admin." ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Delete track" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Track UUID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid track id" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"403" : {
"description" : "Not owner / no admin" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"404" : {
"description" : "Track not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-02-27 19:23:10 +00:00
"/tracks/{id}/comments" : {
2025-12-06 16:34:18 +00:00
"get" : {
2026-02-27 19:23:10 +00:00
"description" : "Get paginated list of comments for a track" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-27 19:23:10 +00:00
"Comment"
2025-12-06 16:34:18 +00:00
] ,
2026-02-27 19:23:10 +00:00
"summary" : "Get track comments" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Track ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
2026-02-27 19:23:10 +00:00
} ,
{
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"comments" : {
"type" : "array"
} ,
"pagination" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-02-27 19:23:10 +00:00
"description" : "Validation error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"404" : {
2026-01-07 18:39:21 +00:00
"description" : "Track not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
}
} ,
"500" : {
"description" : "Internal server error" ,
"schema" : {
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
} ,
2026-02-27 19:23:10 +00:00
"post" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-02-27 19:23:10 +00:00
"description" : "Create a new comment on a track. Can be a top-level comment or a reply to another comment (using parent_id)." ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-27 19:23:10 +00:00
"Comment"
2025-12-06 16:34:18 +00:00
] ,
2026-02-27 19:23:10 +00:00
"summary" : "Create comment" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-02-27 19:23:10 +00:00
"description" : "Track ID (UUID)" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
2026-02-27 19:23:10 +00:00
"description" : "Comment data" ,
"name" : "comment" ,
2025-12-06 16:34:18 +00:00
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.CreateCommentRequest"
2025-12-06 16:34:18 +00:00
}
}
] ,
"responses" : {
2026-02-27 19:23:10 +00:00
"201" : {
"description" : "Created" ,
2025-12-06 16:34:18 +00:00
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"comment" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-02-27 19:23:10 +00:00
"description" : "Validation error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-02-27 19:23:10 +00:00
"404" : {
"description" : "Track not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-02-27 19:23:10 +00:00
"500" : {
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-02-27 19:23:10 +00:00
}
} ,
"/tracks/{id}/comments/{comment_id}" : {
2025-12-06 16:34:18 +00:00
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
2026-01-07 18:39:21 +00:00
] ,
2026-02-27 19:23:10 +00:00
"description" : "Delete a comment (only by owner or admin)" ,
2026-01-07 18:39:21 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-27 19:23:10 +00:00
"Comment"
2026-01-07 18:39:21 +00:00
] ,
2026-02-27 19:23:10 +00:00
"summary" : "Delete comment" ,
2026-01-07 18:39:21 +00:00
"parameters" : [
{
"type" : "string" ,
"description" : "Track ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
2026-02-27 19:23:10 +00:00
} ,
{
"type" : "string" ,
"description" : "Comment ID" ,
"name" : "comment_id" ,
"in" : "path" ,
"required" : true
2026-01-07 18:39:21 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
}
}
}
]
}
} ,
2026-02-27 19:23:10 +00:00
"400" : {
"description" : "Validation error" ,
"schema" : {
"$ref" : "#/definitions/internal_handlers.APIResponse"
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
2026-02-27 19:23:10 +00:00
"description" : "Forbidden - not comment owner" ,
2026-01-07 18:39:21 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
2026-02-27 19:23:10 +00:00
"description" : "Comment not found" ,
2026-01-07 18:39:21 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-04-23 22:45:10 +00:00
"/tracks/{id}/lyrics" : {
"get" : {
"description" : "Returns the current lyrics for a track, or null if no lyrics exist." ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Get track lyrics" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Track UUID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "lyrics may be null" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"lyrics" : {
"type" : "object"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Invalid track id" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"404" : {
"description" : "Track not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
} ,
"put" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Replace the lyrics of a track. Caller must own the track or be admin." ,
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
"summary" : "Create or update track lyrics" ,
"parameters" : [
{
"type" : "string" ,
"description" : "Track UUID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
} ,
{
"description" : "Lyrics payload" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"$ref" : "#/definitions/internal_core_track.UpdateLyricsRequest"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
"lyrics" : {
"type" : "object"
}
}
}
}
}
]
}
} ,
"400" : {
"description" : "Validation / invalid id" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"403" : {
"description" : "Not owner / no admin" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"404" : {
"description" : "Track not found" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
} ,
"500" : {
"description" : "Internal Error" ,
"schema" : {
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/tracks/{id}/status" : {
"get" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get the processing status of an uploaded track" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
"Track"
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get Upload Status" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Track ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"progress" : {
"type" : "integer"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid ID" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"404" : {
"description" : "Track not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_response.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/users" : {
"get" : {
"description" : "Get a paginated list of users with optional filtering" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
2026-01-07 18:39:21 +00:00
"application/json"
2025-12-06 16:34:18 +00:00
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "List Users" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "integer" ,
"default" : 1 ,
"description" : "Page number" ,
"name" : "page" ,
"in" : "query"
} ,
{
"type" : "integer" ,
"default" : 20 ,
"description" : "Items per page" ,
"name" : "limit" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Filter by role" ,
"name" : "role" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
} ,
{
2026-01-07 18:39:21 +00:00
"type" : "boolean" ,
"description" : "Filter by active status" ,
"name" : "is_active" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
} ,
{
2026-01-07 18:39:21 +00:00
"type" : "boolean" ,
"description" : "Filter by verified status" ,
"name" : "is_verified" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
} ,
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Search by username, email, first_name, last_name" ,
"name" : "search" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"default" : "created_at" ,
"description" : "Sort field (created_at, username, email, last_login_at)" ,
"name" : "sort_by" ,
"in" : "query"
} ,
{
"type" : "string" ,
"default" : "desc" ,
"description" : "Sort order (asc, desc)" ,
"name" : "sort_order" ,
"in" : "query"
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"pagination" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
} ,
2026-01-07 18:39:21 +00:00
"users" : {
"type" : "array"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"500" : {
"description" : "Internal Error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/users/by-username/{username}" : {
"get" : {
"description" : "Get public profile information for a user by username" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get Profile by Username" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "Username" ,
"name" : "username" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"200" : {
"description" : "OK" ,
2025-12-06 16:34:18 +00:00
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"profile" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Missing username" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
"description" : "User not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
}
}
}
}
} ,
"/users/me" : {
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Permanently delete user account with anonymization, session revocation, audit log" ,
"tags" : [
"Users"
] ,
"summary" : "Delete account" ,
"parameters" : [
{
"description" : "Password, reason, confirm_text (must be DELETE)" ,
"name" : "body" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"$ref" : "#/definitions/internal_handlers.DeleteAccountRequest"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
} ,
"400" : {
"description" : "Bad Request" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
} ,
"500" : {
"description" : "Internal Server Error" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
}
}
}
} ,
"/users/me/privacy/opt-out" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Saves the user's Do Not Sell preference (CCPA compliance)" ,
"tags" : [
"Users"
] ,
"summary" : "CCPA Do Not Sell opt-out" ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
}
} ,
"500" : {
"description" : "Internal Server Error" ,
"schema" : {
"type" : "object" ,
"additionalProperties" : true
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/users/{id}" : {
"get" : {
"description" : "Get public profile information for a user" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get Profile by ID" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"description" : "User ID" ,
"name" : "id" ,
"in" : "path" ,
"required" : true
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"profile" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid ID" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
"description" : "User not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
} ,
"put" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Update user profile details" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Update Profile" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "User ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
2026-01-07 18:39:21 +00:00
"in" : "path" ,
"required" : true
} ,
{
"description" : "Profile Data" ,
"name" : "profile" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.UpdateProfileRequest"
2026-01-07 18:39:21 +00:00
}
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"profile" : {
2025-12-06 16:34:18 +00:00
"type" : "object"
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"400" : {
"description" : "Validation Error" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
2025-12-06 16:34:18 +00:00
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"403" : {
"description" : "Forbidden" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
} ,
"delete" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Soft delete a user (only user owner or admin can delete)" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Delete user" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "User ID" ,
"name" : "id" ,
2025-12-06 16:34:18 +00:00
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
2026-01-07 18:39:21 +00:00
"description" : "User deleted successfully" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"400" : {
"description" : "Invalid ID" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
"description" : "Forbidden - Not user owner or admin" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"404" : {
2026-01-07 18:39:21 +00:00
"description" : "User not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-02-15 15:18:13 +00:00
"/users/{id}/completion" : {
2025-12-06 16:34:18 +00:00
"get" : {
2026-02-15 15:18:13 +00:00
"description" : "Get profile completion percentage and missing fields" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-15 15:18:13 +00:00
"User"
2025-12-06 16:34:18 +00:00
] ,
2026-02-15 15:18:13 +00:00
"summary" : "Get Profile Completion" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-02-15 15:18:13 +00:00
"description" : "User ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
2026-02-15 15:18:13 +00:00
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
]
}
} ,
"400" : {
2026-02-15 15:18:13 +00:00
"description" : "Invalid ID" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"403" : {
2026-02-15 15:18:13 +00:00
"description" : "Forbidden" ,
2026-01-07 18:39:21 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
}
} ,
2026-02-15 15:18:13 +00:00
"/validate" : {
"post" : {
"description" : "Validates request data against known DTO types without executing the actual operation" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-02-15 15:18:13 +00:00
"Validation"
2025-12-06 16:34:18 +00:00
] ,
2026-02-15 15:18:13 +00:00
"summary" : "Validate request body" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-02-15 15:18:13 +00:00
"description" : "Validation request with type and data" ,
"name" : "request" ,
"in" : "body" ,
"required" : true ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.ValidateRequest"
2026-02-15 15:18:13 +00:00
}
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
"200" : {
2026-02-15 15:18:13 +00:00
"description" : "Validation result" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.ValidateResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"400" : {
2026-02-15 15:18:13 +00:00
"description" : "Invalid request format" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
}
} ,
"/webhooks" : {
"get" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Get a list of all webhooks registered by the current user" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "List webhooks" ,
2025-12-06 16:34:18 +00:00
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"webhooks" : {
"type" : "array"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"500" : {
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
} ,
"post" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Register a new webhook for receiving events" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Register webhook" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
2026-01-07 18:39:21 +00:00
"description" : "Webhook registration data" ,
"name" : "webhook" ,
"in" : "body" ,
"required" : true ,
"schema" : {
"type" : "object"
}
2025-12-06 16:34:18 +00:00
}
] ,
"responses" : {
2026-01-07 18:39:21 +00:00
"201" : {
"description" : "Created" ,
2025-12-06 16:34:18 +00:00
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"webhook" : {
"type" : "object"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Validation error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"500" : {
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/webhooks/stats" : {
2025-12-06 16:34:18 +00:00
"get" : {
2026-01-07 18:39:21 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Get statistics for webhook delivery and performance" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Get webhook statistics" ,
2025-12-06 16:34:18 +00:00
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"stats" : {
2025-12-06 16:34:18 +00:00
"type" : "object"
}
}
}
}
}
]
}
} ,
2026-01-07 18:39:21 +00:00
"401" : {
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"500" : {
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/webhooks/{id}" : {
"delete" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Delete a webhook by ID" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Delete webhook" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Webhook ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"message" : {
"type" : "string"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid webhook ID" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"404" : {
2026-01-07 18:39:21 +00:00
"description" : "Webhook not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
2026-01-07 18:39:21 +00:00
}
} ,
"/webhooks/{id}/regenerate-key" : {
"post" : {
2025-12-06 16:34:18 +00:00
"security" : [
{
"BearerAuth" : [ ]
}
] ,
2026-01-07 18:39:21 +00:00
"description" : "Generate a new API key for a webhook (invalidates the old one)" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Regenerate webhook API key" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Webhook ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
"type" : "object" ,
"properties" : {
2026-01-07 18:39:21 +00:00
"api_key" : {
"type" : "string"
} ,
"message" : {
"type" : "string"
2025-12-06 16:34:18 +00:00
}
}
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid webhook ID" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
"description" : "Webhook not found" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2026-01-07 18:39:21 +00:00
}
} ,
"500" : {
"description" : "Internal server error" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
} ,
2026-01-07 18:39:21 +00:00
"/webhooks/{id}/test" : {
"post" : {
"security" : [
{
"BearerAuth" : [ ]
}
] ,
"description" : "Send a test event to a webhook to verify it's working" ,
2025-12-06 16:34:18 +00:00
"consumes" : [
"application/json"
] ,
"produces" : [
"application/json"
] ,
"tags" : [
2026-01-07 18:39:21 +00:00
"Webhook"
2025-12-06 16:34:18 +00:00
] ,
2026-01-07 18:39:21 +00:00
"summary" : "Test webhook" ,
2025-12-06 16:34:18 +00:00
"parameters" : [
{
"type" : "string" ,
2026-01-07 18:39:21 +00:00
"description" : "Webhook ID" ,
2025-12-06 16:34:18 +00:00
"name" : "id" ,
"in" : "path" ,
"required" : true
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"schema" : {
"allOf" : [
{
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
} ,
{
"type" : "object" ,
"properties" : {
"data" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
"message" : {
"type" : "string"
}
}
2025-12-06 16:34:18 +00:00
}
}
}
]
}
} ,
"400" : {
2026-01-07 18:39:21 +00:00
"description" : "Invalid webhook ID" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
"401" : {
"description" : "Unauthorized" ,
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
} ,
2026-01-07 18:39:21 +00:00
"404" : {
"description" : "Webhook not found" ,
2025-12-06 16:34:18 +00:00
"schema" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.APIResponse"
2025-12-06 16:34:18 +00:00
}
}
}
}
2025-12-03 19:29:37 +00:00
}
} ,
"definitions" : {
2026-04-23 22:45:10 +00:00
"internal_core_track.BatchDeleteRequest" : {
"type" : "object" ,
"required" : [
"track_ids"
] ,
"properties" : {
"track_ids" : {
"type" : "array" ,
"minItems" : 1 ,
"items" : {
"type" : "string"
}
}
}
} ,
"internal_core_track.BatchUpdateRequest" : {
"type" : "object" ,
"required" : [
"track_ids" ,
"updates"
] ,
"properties" : {
"track_ids" : {
"type" : "array" ,
"minItems" : 1 ,
"items" : {
"type" : "string"
}
} ,
"updates" : {
"type" : "object" ,
"additionalProperties" : true
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_core_track.CompleteChunkedUploadRequest" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"required" : [
2026-02-27 19:23:10 +00:00
"upload_id"
2025-12-06 16:34:18 +00:00
] ,
"properties" : {
2026-02-27 19:23:10 +00:00
"upload_id" : {
2026-02-15 15:18:13 +00:00
"type" : "string"
2025-12-06 16:34:18 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_core_track.InitiateChunkedUploadRequest" : {
2026-02-15 15:18:13 +00:00
"type" : "object" ,
"required" : [
2026-02-27 19:23:10 +00:00
"filename" ,
"total_chunks" ,
"total_size"
2026-02-15 15:18:13 +00:00
] ,
"properties" : {
2026-02-27 19:23:10 +00:00
"filename" : {
2026-02-15 15:18:13 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"total_chunks" : {
"type" : "integer" ,
"minimum" : 1
2026-02-15 15:18:13 +00:00
} ,
2026-02-27 19:23:10 +00:00
"total_size" : {
"type" : "integer" ,
"minimum" : 1
2025-12-06 16:34:18 +00:00
}
}
} ,
2026-04-23 22:45:10 +00:00
"internal_core_track.UpdateLyricsRequest" : {
"type" : "object" ,
"properties" : {
"content" : {
"type" : "string"
}
}
} ,
"internal_core_track.UpdateTrackRequest" : {
"type" : "object" ,
"properties" : {
"album" : {
"type" : "string" ,
"maxLength" : 255
} ,
"artist" : {
"type" : "string" ,
"maxLength" : 255
} ,
"bpm" : {
"type" : "integer" ,
"maximum" : 300 ,
"minimum" : 0
} ,
"genre" : {
"description" : "legacy, single" ,
"type" : "string" ,
"maxLength" : 100
} ,
"genres" : {
"description" : "v0.10.1: max 3, taxonomy slugs" ,
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"is_public" : {
"type" : "boolean"
} ,
"musical_key" : {
"type" : "string" ,
"maxLength" : 10
} ,
"tags" : {
"description" : "v0.10.1: max 10, 30 chars each" ,
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"title" : {
"type" : "string" ,
"maxLength" : 255 ,
"minLength" : 1
} ,
"year" : {
"type" : "integer" ,
"maximum" : 2100 ,
"minimum" : 1900
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.APIResponse" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"data" : { } ,
"error" : { } ,
"success" : {
"type" : "boolean"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.CreateCommentRequest" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"required" : [
"content"
] ,
"properties" : {
"content" : {
"type" : "string" ,
"maxLength" : 5000 ,
"minLength" : 1
} ,
"parent_id" : {
"type" : "string"
2026-04-23 22:45:10 +00:00
} ,
"timestamp" : {
"description" : "Position in seconds (0 = top-level, no specific time)" ,
"type" : "number"
2026-01-07 18:39:21 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.CreateOrderRequest" : {
2025-12-03 19:29:37 +00:00
"type" : "object" ,
"required" : [
"items"
] ,
"properties" : {
"items" : {
"type" : "array" ,
"minItems" : 1 ,
"items" : {
"type" : "object" ,
"required" : [
"product_id"
] ,
"properties" : {
"product_id" : {
"type" : "string"
}
}
}
2026-02-27 19:23:10 +00:00
} ,
"promo_code" : {
"type" : "string" ,
"maxLength" : 50
2025-12-03 19:29:37 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.CreatePlaylistRequest" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"required" : [
"title"
] ,
"properties" : {
"description" : {
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"maxLength" : 1000
2025-12-06 16:34:18 +00:00
} ,
"is_public" : {
"type" : "boolean"
} ,
"title" : {
"type" : "string" ,
"maxLength" : 200 ,
"minLength" : 1
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.CreateProductRequest" : {
2025-12-03 19:29:37 +00:00
"type" : "object" ,
"required" : [
"price" ,
"product_type" ,
"title"
] ,
"properties" : {
2026-02-27 19:23:10 +00:00
"bpm" : {
"description" : "v0.401 M1" ,
"type" : "integer" ,
"maximum" : 300 ,
"minimum" : 1
} ,
"category" : {
"type" : "string" ,
"enum" : [
"sample" ,
"beat" ,
"preset" ,
"pack"
]
} ,
2025-12-03 19:29:37 +00:00
"description" : {
2025-12-06 16:21:59 +00:00
"type" : "string" ,
"maxLength" : 2000
2025-12-03 19:29:37 +00:00
} ,
"license_type" : {
2025-12-06 16:21:59 +00:00
"type" : "string" ,
"enum" : [
"standard" ,
"exclusive" ,
"commercial"
]
2025-12-03 19:29:37 +00:00
} ,
2026-02-27 19:23:10 +00:00
"licenses" : {
"description" : "v0.401 M2: Product licenses (streaming, personal, commercial, exclusive)" ,
"type" : "array" ,
"items" : {
"type" : "object" ,
"required" : [
"license_type" ,
"price_cents"
] ,
"properties" : {
"license_type" : {
"type" : "string" ,
"enum" : [
"streaming" ,
"personal" ,
"commercial" ,
"exclusive"
]
} ,
"price_cents" : {
"type" : "integer" ,
"minimum" : 0
} ,
"terms_text" : {
"type" : "string"
}
}
}
} ,
"musical_key" : {
"type" : "string" ,
"maxLength" : 10
} ,
2025-12-03 19:29:37 +00:00
"price" : {
"type" : "number" ,
"minimum" : 0
} ,
"product_type" : {
"type" : "string" ,
"enum" : [
"track" ,
"pack" ,
"service"
]
} ,
"title" : {
2025-12-06 16:21:59 +00:00
"type" : "string" ,
"maxLength" : 200 ,
"minLength" : 3
2025-12-03 19:29:37 +00:00
} ,
"track_id" : {
"description" : "UUID string" ,
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.DashboardResponse" : {
2026-02-15 15:18:13 +00:00
"type" : "object" ,
"properties" : {
"library_preview" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.LibraryPreview"
2026-02-15 15:18:13 +00:00
} ,
"recent_activity" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.RecentActivity"
2026-02-15 15:18:13 +00:00
}
} ,
"stats" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.DashboardStats"
2026-02-15 15:18:13 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.DashboardStats" : {
2026-02-15 15:18:13 +00:00
"type" : "object" ,
"properties" : {
"active_friends" : {
"type" : "integer"
} ,
"active_friends_change" : {
"type" : "string"
} ,
"favorites" : {
"type" : "integer"
} ,
"favorites_change" : {
"type" : "string"
} ,
"messages_sent" : {
"type" : "integer"
} ,
"messages_sent_change" : {
"type" : "string"
} ,
"period" : {
"type" : "string"
} ,
"tracks_played" : {
"type" : "integer"
} ,
"tracks_played_change" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.DeleteAccountRequest" : {
"type" : "object" ,
"required" : [
"confirm_text" ,
"password"
] ,
"properties" : {
"confirm_text" : {
"type" : "string"
} ,
2026-04-23 22:45:10 +00:00
"keep_public_tracks" : {
"description" : "If true, public tracks remain (attributed to deleted account)" ,
"type" : "boolean"
} ,
2026-02-27 19:23:10 +00:00
"password" : {
"type" : "string"
} ,
"reason" : {
"type" : "string"
}
}
} ,
"internal_handlers.DisableTwoFactorRequest" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"required" : [
"password"
] ,
"properties" : {
"password" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.FrontendLogRequest" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
"context" : {
"type" : "object" ,
"additionalProperties" : true
} ,
"data" : { } ,
"level" : {
"type" : "string"
} ,
"message" : {
"type" : "string"
} ,
"timestamp" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.LibraryPreview" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
2026-02-15 15:18:13 +00:00
"has_more" : {
"type" : "boolean"
2026-01-07 18:39:21 +00:00
} ,
2026-02-15 15:18:13 +00:00
"items" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/internal_handlers.TrackPreview"
2026-02-15 15:18:13 +00:00
}
} ,
"total_count" : {
"type" : "integer"
2026-01-07 18:39:21 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.RecentActivity" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
2026-02-15 15:18:13 +00:00
"description" : {
"type" : "string"
2026-01-07 18:39:21 +00:00
} ,
2026-02-15 15:18:13 +00:00
"icon" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"metadata" : {
"type" : "object" ,
"additionalProperties" : true
} ,
"timestamp" : {
"type" : "string"
} ,
"title" : {
"type" : "string"
} ,
"type" : {
"type" : "string"
2026-01-07 18:39:21 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.ReorderTracksRequest" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"required" : [
"track_ids"
] ,
"properties" : {
"track_ids" : {
"description" : "Changed to []uuid.UUID" ,
"type" : "array" ,
"minItems" : 1 ,
"items" : {
"type" : "string"
}
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.SetupTwoFactorResponse" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
"qr_code_url" : {
"type" : "string"
} ,
"recovery_codes" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"secret" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.StreamTokenResponse" : {
"type" : "object" ,
"properties" : {
"expires_in" : {
"description" : "seconds" ,
"type" : "integer"
} ,
"token" : {
"type" : "string"
}
}
} ,
"internal_handlers.TrackPreview" : {
2026-02-15 15:18:13 +00:00
"type" : "object" ,
"properties" : {
"artist" : {
"type" : "string"
} ,
"cover_art_path" : {
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
"duration" : {
"type" : "integer"
} ,
"id" : {
"type" : "string"
} ,
"like_count" : {
"type" : "integer"
} ,
"play_count" : {
"type" : "integer"
} ,
"title" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.UpdateCommentRequest" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"required" : [
"content"
] ,
"properties" : {
"content" : {
"type" : "string" ,
"maxLength" : 5000 ,
"minLength" : 1
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.UpdatePlaylistRequest" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"description" : {
2026-01-07 18:39:21 +00:00
"type" : "string" ,
"maxLength" : 1000
2025-12-06 16:34:18 +00:00
} ,
"is_public" : {
"type" : "boolean"
} ,
"title" : {
"type" : "string" ,
"maxLength" : 200 ,
"minLength" : 1
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.UpdateProductRequest" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"bpm" : {
"type" : "integer" ,
"maximum" : 300 ,
"minimum" : 1
} ,
"category" : {
"type" : "string" ,
"enum" : [
"sample" ,
"beat" ,
"preset" ,
"pack"
]
} ,
2026-01-07 18:39:21 +00:00
"description" : {
"type" : "string" ,
"maxLength" : 2000
} ,
2026-02-27 19:23:10 +00:00
"licenses" : {
"description" : "v0.401 M2: Product licenses" ,
"type" : "array" ,
"items" : {
"type" : "object" ,
"required" : [
"license_type" ,
"price_cents"
] ,
"properties" : {
"license_type" : {
"type" : "string" ,
"enum" : [
"streaming" ,
"personal" ,
"commercial" ,
"exclusive"
]
} ,
"price_cents" : {
"type" : "integer" ,
"minimum" : 0
} ,
"terms_text" : {
"type" : "string"
}
}
}
} ,
"musical_key" : {
"type" : "string" ,
"maxLength" : 10
} ,
2026-01-07 18:39:21 +00:00
"price" : {
"type" : "number" ,
"minimum" : 0
} ,
"status" : {
"type" : "string" ,
"enum" : [
"draft" ,
"active" ,
"archived"
]
} ,
"title" : {
"type" : "string" ,
"maxLength" : 200 ,
"minLength" : 3
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.UpdateProfileRequest" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"banner_url" : {
"type" : "string" ,
"maxLength" : 2048
} ,
2025-12-06 16:34:18 +00:00
"bio" : {
"type" : "string" ,
"maxLength" : 500
} ,
"birthdate" : {
"type" : "string"
} ,
"first_name" : {
"type" : "string" ,
"maxLength" : 100
} ,
"gender" : {
"type" : "string" ,
"enum" : [
"Male" ,
"Female" ,
"Other" ,
"Prefer not to say"
]
} ,
2026-02-27 19:23:10 +00:00
"is_public" : {
"type" : "boolean"
} ,
2025-12-06 16:34:18 +00:00
"last_name" : {
"type" : "string" ,
"maxLength" : 100
} ,
"location" : {
"type" : "string" ,
"maxLength" : 100
} ,
2026-01-07 18:39:21 +00:00
"social_links" : {
"type" : "object" ,
"additionalProperties" : true
} ,
2025-12-06 16:34:18 +00:00
"username" : {
"type" : "string" ,
"maxLength" : 30 ,
"minLength" : 3
}
}
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.ValidateRequest" : {
"type" : "object" ,
"required" : [
"data" ,
"type"
] ,
"properties" : {
"data" : {
"description" : "The data to validate" ,
"type" : "array" ,
"items" : {
"type" : "integer"
}
} ,
"type" : {
"description" : "e.g., \"RegisterRequest\", \"LoginRequest\"" ,
"type" : "string"
}
}
2026-02-15 15:18:13 +00:00
} ,
2026-02-27 19:23:10 +00:00
"internal_handlers.ValidateResponse" : {
2026-02-15 15:18:13 +00:00
"type" : "object" ,
"properties" : {
"errors" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_dto.ValidationError"
2026-02-15 15:18:13 +00:00
}
} ,
"message" : {
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"valid" : {
"type" : "boolean"
}
}
} ,
"internal_handlers.VerifyTwoFactorRequest" : {
"type" : "object" ,
"required" : [
"code" ,
"secret"
] ,
"properties" : {
"code" : {
"description" : "TOTP code to verify" ,
"type" : "string"
} ,
"secret" : {
"description" : "Secret from setup step" ,
"type" : "string"
}
}
} ,
"veza-backend-api_internal_core_marketplace.LicenseType" : {
"type" : "string" ,
"enum" : [
"basic" ,
"premium" ,
"exclusive"
] ,
"x-enum-varnames" : [
"LicenseBasic" ,
"LicensePremium" ,
"LicenseExclusive"
]
} ,
"veza-backend-api_internal_core_marketplace.Order" : {
"type" : "object" ,
"properties" : {
"buyer_id" : {
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
"currency" : {
"type" : "string"
} ,
"discount_amount_cents" : {
"type" : "integer"
} ,
"hyperswitch_payment_id" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"items" : {
"type" : "array" ,
"items" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.OrderItem"
}
} ,
"payment_intent" : {
"description" : "Legacy / Stripe PaymentIntent ID" ,
"type" : "string"
} ,
"payment_status" : {
"description" : "Hyperswitch payment status" ,
"type" : "string"
} ,
"promo_code_id" : {
"type" : "string"
} ,
2026-04-23 22:45:10 +00:00
"refund_deadline" : {
"description" : "v0.12.0: 14-day refund deadline" ,
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"status" : {
"description" : "pending, completed, failed, refunded" ,
"type" : "string"
} ,
"total_amount" : {
"type" : "number"
} ,
"updated_at" : {
"type" : "string"
}
}
} ,
"veza-backend-api_internal_core_marketplace.OrderItem" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"order_id" : {
"type" : "string"
} ,
"price" : {
"type" : "number"
} ,
"product_id" : {
"type" : "string"
}
}
} ,
"veza-backend-api_internal_core_marketplace.Product" : {
"type" : "object" ,
"properties" : {
"avg_rating" : {
"description" : "v0.403 R1: Computed from product_reviews (not stored in DB)" ,
"type" : "number"
} ,
"bpm" : {
"description" : "v0.401 M1: Métadonnées musicales et catégorie" ,
"type" : "integer"
} ,
"category" : {
"description" : "sample, beat, preset, pack" ,
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
"currency" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"images" : {
"type" : "array" ,
"items" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.ProductImage"
}
} ,
"license_type" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.LicenseType"
} ,
"licenses" : {
"type" : "array" ,
"items" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.ProductLicense"
}
} ,
"musical_key" : {
"type" : "string"
} ,
"previews" : {
"description" : "Relations" ,
"type" : "array" ,
"items" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.ProductPreview"
}
} ,
"price" : {
"type" : "number"
} ,
"product_type" : {
"description" : "\"track\", \"pack\", \"service\"" ,
"type" : "string"
} ,
"review_count" : {
"type" : "integer"
} ,
"seller_id" : {
"type" : "string"
} ,
"status" : {
"$ref" : "#/definitions/veza-backend-api_internal_core_marketplace.ProductStatus"
} ,
"title" : {
"type" : "string"
} ,
"track_id" : {
"description" : "Liaison optionnelle avec un Track (si ProductType == \"track\")" ,
"type" : "string"
} ,
"updated_at" : {
"type" : "string"
}
}
} ,
"veza-backend-api_internal_core_marketplace.ProductImage" : {
"type" : "object" ,
"properties" : {
"created_at" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"product_id" : {
"type" : "string"
} ,
"sort_order" : {
"type" : "integer"
} ,
"url" : {
"type" : "string"
}
}
} ,
"veza-backend-api_internal_core_marketplace.ProductLicense" : {
"type" : "object" ,
"properties" : {
"created_at" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"license_type" : {
"description" : "streaming, personal, commercial, exclusive" ,
"type" : "string"
} ,
"price_cents" : {
"type" : "integer"
} ,
"product_id" : {
"type" : "string"
} ,
"terms_text" : {
"type" : "string"
2026-02-15 15:18:13 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_core_marketplace.ProductPreview" : {
2026-01-07 18:39:21 +00:00
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"created_at" : {
2026-01-07 18:39:21 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"duration_sec" : {
"type" : "integer"
} ,
"file_path" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"product_id" : {
2026-01-07 18:39:21 +00:00
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_core_marketplace.ProductStatus" : {
2025-12-03 19:29:37 +00:00
"type" : "string" ,
"enum" : [
2026-02-27 19:23:10 +00:00
"draft" ,
"active" ,
"archived"
2025-12-03 19:29:37 +00:00
] ,
"x-enum-varnames" : [
2026-02-27 19:23:10 +00:00
"ProductStatusDraft" ,
"ProductStatusActive" ,
"ProductStatusArchived"
2025-12-03 19:29:37 +00:00
]
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_dto.LoginRequest" : {
2025-12-03 19:29:37 +00:00
"type" : "object" ,
2026-02-27 19:23:10 +00:00
"required" : [
"email" ,
"password"
] ,
2025-12-03 19:29:37 +00:00
"properties" : {
2026-02-27 19:23:10 +00:00
"email" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"password" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"remember_me" : {
"type" : "boolean"
}
}
} ,
"veza-backend-api_internal_dto.LoginResponse" : {
"type" : "object" ,
"properties" : {
"requires_2fa" : {
"description" : "BE-API-001: Flag indicating 2FA is required" ,
"type" : "boolean"
2025-12-03 19:29:37 +00:00
} ,
2026-02-27 19:23:10 +00:00
"token" : {
"$ref" : "#/definitions/veza-backend-api_internal_dto.TokenResponse"
2026-02-15 15:18:13 +00:00
} ,
2026-02-27 19:23:10 +00:00
"user" : {
"$ref" : "#/definitions/veza-backend-api_internal_dto.UserResponse"
}
}
} ,
"veza-backend-api_internal_dto.RefreshRequest" : {
"type" : "object" ,
"required" : [
"refresh_token"
] ,
"properties" : {
"refresh_token" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
2026-02-27 19:23:10 +00:00
}
}
} ,
"veza-backend-api_internal_dto.RegisterRequest" : {
"type" : "object" ,
"required" : [
"email" ,
"password" ,
"password_confirmation"
] ,
"properties" : {
"email" : {
2026-02-15 15:18:13 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"password" : {
"type" : "string" ,
"minLength" : 12
2025-12-03 19:29:37 +00:00
} ,
2026-02-27 19:23:10 +00:00
"password_confirmation" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"username" : {
"type" : "string" ,
"maxLength" : 50 ,
"minLength" : 3
}
}
} ,
"veza-backend-api_internal_dto.RegisterResponse" : {
"type" : "object" ,
"properties" : {
"token" : {
"$ref" : "#/definitions/veza-backend-api_internal_dto.TokenResponse"
2025-12-03 19:29:37 +00:00
} ,
2026-02-27 19:23:10 +00:00
"user" : {
"$ref" : "#/definitions/veza-backend-api_internal_dto.UserResponse"
2025-12-03 19:29:37 +00:00
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_dto.ResendVerificationRequest" : {
2025-12-03 19:29:37 +00:00
"type" : "object" ,
2026-02-27 19:23:10 +00:00
"required" : [
"email"
] ,
2025-12-03 19:29:37 +00:00
"properties" : {
2026-02-27 19:23:10 +00:00
"email" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
2026-02-27 19:23:10 +00:00
}
}
} ,
"veza-backend-api_internal_dto.TokenResponse" : {
"type" : "object" ,
"properties" : {
"access_token" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"expires_in" : {
"type" : "integer"
2025-12-03 19:29:37 +00:00
} ,
2026-02-27 19:23:10 +00:00
"refresh_token" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_dto.UserResponse" : {
2025-12-03 19:29:37 +00:00
"type" : "object" ,
"properties" : {
2026-02-27 19:23:10 +00:00
"email" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"username" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
2026-02-27 19:23:10 +00:00
}
}
} ,
"veza-backend-api_internal_dto.ValidationError" : {
"type" : "object" ,
"properties" : {
"field" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"message" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"value" : {
2025-12-03 19:29:37 +00:00
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.Playlist" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"collaborators" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.PlaylistCollaborator"
2025-12-06 16:34:18 +00:00
}
} ,
"cover_url" : {
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"follower_count" : {
"type" : "integer"
} ,
"id" : {
"type" : "string"
} ,
2026-04-23 22:45:10 +00:00
"is_default_favorites" : {
"description" : "v0.10.4 F136" ,
"type" : "boolean"
} ,
"is_editorial" : {
"description" : "v0.10.4 F141" ,
"type" : "boolean"
} ,
2025-12-06 16:34:18 +00:00
"is_public" : {
"type" : "boolean"
} ,
"title" : {
"type" : "string"
} ,
"track_count" : {
"type" : "integer"
} ,
"tracks" : {
"type" : "array" ,
"items" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.PlaylistTrack"
2025-12-06 16:34:18 +00:00
}
} ,
"updated_at" : {
"type" : "string"
} ,
"user_id" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.PlaylistCollaborator" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"created_at" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"permission" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.PlaylistPermission"
2025-12-06 16:34:18 +00:00
} ,
"playlist_id" : {
"type" : "string"
} ,
"updated_at" : {
"type" : "string"
} ,
"user" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.User"
2025-12-06 16:34:18 +00:00
} ,
"user_id" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.PlaylistPermission" : {
2025-12-06 16:34:18 +00:00
"type" : "string" ,
"enum" : [
"read" ,
"write" ,
"admin"
] ,
"x-enum-varnames" : [
"PlaylistPermissionRead" ,
"PlaylistPermissionWrite" ,
"PlaylistPermissionAdmin"
]
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.PlaylistTrack" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"added_at" : {
"type" : "string"
} ,
2026-01-07 18:39:21 +00:00
"added_by" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"id" : {
"type" : "string"
} ,
"playlist_id" : {
"type" : "string"
} ,
"position" : {
"type" : "integer"
} ,
"track" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.Track"
2025-12-06 16:34:18 +00:00
} ,
"track_id" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.Track" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"album" : {
"type" : "string"
} ,
"artist" : {
"type" : "string"
} ,
"bitrate" : {
"description" : "kbps" ,
"type" : "integer"
} ,
2026-02-27 19:23:10 +00:00
"bpm" : {
"type" : "integer"
} ,
2025-12-06 16:34:18 +00:00
"cover_art_path" : {
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
2026-01-07 18:39:21 +00:00
"creator_id" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"duration" : {
"description" : "seconds" ,
"type" : "integer"
} ,
2026-01-07 18:39:21 +00:00
"file_id" : {
"description" : "NULL temporairement avant création fichier" ,
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"file_path" : {
"type" : "string"
} ,
"file_size" : {
"description" : "bytes" ,
"type" : "integer"
} ,
"format" : {
"description" : "mp3, flac, wav, etc." ,
"type" : "string"
} ,
"genre" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"is_public" : {
"type" : "boolean"
} ,
2026-02-27 19:23:10 +00:00
"musical_key" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"sample_rate" : {
"description" : "Hz" ,
"type" : "integer"
} ,
"status" : {
2026-02-27 19:23:10 +00:00
"$ref" : "#/definitions/veza-backend-api_internal_models.TrackStatus"
2025-12-06 16:34:18 +00:00
} ,
"status_message" : {
"type" : "string"
} ,
"stream_manifest_url" : {
"type" : "string"
} ,
"stream_status" : {
"description" : "pending, processing, ready, error" ,
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"tags" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
2025-12-06 16:34:18 +00:00
"title" : {
"type" : "string"
} ,
"updated_at" : {
"type" : "string"
} ,
"waveform_path" : {
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"waveform_url" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"year" : {
"type" : "integer"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.TrackStatus" : {
2025-12-06 16:34:18 +00:00
"type" : "string" ,
"enum" : [
"uploading" ,
"processing" ,
"completed" ,
"failed"
] ,
"x-enum-varnames" : [
"TrackStatusUploading" ,
"TrackStatusProcessing" ,
"TrackStatusCompleted" ,
"TrackStatusFailed"
]
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_models.User" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"avatar" : {
"type" : "string"
} ,
2026-02-27 19:23:10 +00:00
"banner_url" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"bio" : {
"type" : "string"
} ,
"birthdate" : {
"type" : "string"
} ,
"created_at" : {
"type" : "string"
} ,
"email" : {
"type" : "string"
} ,
"first_name" : {
"type" : "string"
} ,
"gender" : {
"type" : "string"
} ,
"id" : {
"type" : "string"
} ,
"is_active" : {
"type" : "boolean"
} ,
"is_admin" : {
"type" : "boolean"
} ,
2026-01-07 18:39:21 +00:00
"is_banned" : {
"type" : "boolean"
} ,
2025-12-06 16:34:18 +00:00
"is_public" : {
"type" : "boolean"
} ,
"is_verified" : {
"type" : "boolean"
} ,
"last_login_at" : {
"type" : "string"
} ,
"last_name" : {
"type" : "string"
} ,
"location" : {
"type" : "string"
} ,
2026-01-07 18:39:21 +00:00
"login_count" : {
"type" : "integer"
} ,
2025-12-06 16:34:18 +00:00
"password" : {
"description" : "Virtual field for input" ,
"type" : "string"
} ,
2026-04-23 22:45:10 +00:00
"password_changed_at" : {
"description" : "F016: Password expiration tracking" ,
"type" : "string"
} ,
"promoted_to_creator_at" : {
"description" : "v1.0.6: set the first time a user self-promotes to `role='creator'`\nvia POST /api/v1/users/me/upgrade-creator. NULL for users who never\ntook that path (still 'user', or promoted by an admin out-of-band)." ,
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"role" : {
"type" : "string"
} ,
"slug" : {
"type" : "string"
} ,
2026-01-07 18:39:21 +00:00
"social_links" : {
"type" : "string"
} ,
2025-12-06 16:34:18 +00:00
"token_version" : {
"type" : "integer"
} ,
"updated_at" : {
"type" : "string"
} ,
"username" : {
"type" : "string"
} ,
"username_changed_at" : {
"type" : "string"
}
}
} ,
2026-02-27 19:23:10 +00:00
"veza-backend-api_internal_response.APIResponse" : {
2025-12-06 16:34:18 +00:00
"type" : "object" ,
"properties" : {
"data" : { } ,
"error" : { } ,
"success" : {
"type" : "boolean"
}
}
2025-12-03 19:29:37 +00:00
}
2026-01-11 15:30:43 +00:00
} ,
"securityDefinitions" : {
2026-04-23 22:45:10 +00:00
"ApiKeyAuth" : {
"description" : "Developer API key (obtain from Developer Portal). Format: vza_xxxxx" ,
"type" : "apiKey" ,
"name" : "X-API-Key" ,
"in" : "header"
} ,
2026-01-11 15:30:43 +00:00
"BearerAuth" : {
"type" : "apiKey" ,
"name" : "Authorization" ,
"in" : "header"
}
2025-12-03 19:29:37 +00:00
}
}