{"openapi":"3.1.0","paths":{"/v1/users/themes":{"get":{"description":"Retrieves all themes for the current user","operationId":"UserThemeController_findAll[1]","parameters":[],"responses":{"200":{"description":"Themes retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgUserTheme"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgUserTheme"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all user themes","tags":["user-themes"]},"post":{"description":"Creates a new theme for the current user","operationId":"UserThemeController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserThemeDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Founder voice","description":"Direct, practical, and story-led.","config":{"tone":"direct","pacing":"concise","pointOfView":"first_person"}}}}}}},"responses":{"201":{"description":"Theme created successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new theme","tags":["user-themes"]}},"/v1/users/themes/default":{"get":{"description":"Retrieves the default theme for the current user, creating one if none exists","operationId":"UserThemeController_getDefault[1]","parameters":[],"responses":{"200":{"description":"Default theme retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get default theme","tags":["user-themes"]}},"/v1/users/themes/{id}":{"get":{"description":"Get a specific theme through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"UserThemeController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Theme retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a specific theme","tags":["user-themes"]},"delete":{"description":"Delete a theme through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"UserThemeController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme to delete","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Theme deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgUserTheme"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a theme","tags":["user-themes"]},"patch":{"description":"Update a theme through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"UserThemeController_update[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserThemeDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Founder voice","description":"Direct, practical, and story-led.","config":{"tone":"direct","pacing":"concise","pointOfView":"first_person"}}}}}}},"responses":{"200":{"description":"Theme updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update a theme","tags":["user-themes"]}},"/v1/users/themes/{id}/set-default":{"post":{"description":"Sets a theme as the default for the current user","operationId":"UserThemeController_setDefault[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme to set as default","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Default theme set successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgUserTheme"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Set theme as default.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgUserTheme"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Set theme as default","tags":["user-themes"]}},"/v1/users/themes/{id}/duplicate":{"post":{"description":"Duplicate a theme through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"UserThemeController_duplicate[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme to duplicate","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateUserThemeDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Founder voice","description":"Direct, practical, and story-led.","config":{"tone":"direct","pacing":"concise","pointOfView":"first_person"}}}}}}},"responses":{"201":{"description":"Theme duplicated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgUserTheme"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Duplicate a theme","tags":["user-themes"]}},"/v1/users/themes/{id}/export":{"get":{"description":"Exports a theme configuration as JSON for sharing or backup","operationId":"UserThemeController_exportTheme[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the theme to export","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Theme exported successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Theme not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Export theme as JSON","tags":["user-themes"]}},"/v1/users/themes/import":{"post":{"description":"Import theme from JSON through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"UserThemeController_importTheme[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportUserThemeDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Founder voice","description":"Direct, practical, and story-led.","config":{"tone":"direct","pacing":"concise","pointOfView":"first_person"}}}}}}},"responses":{"201":{"description":"Theme imported successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgUserTheme"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Founder voice","description":"Direct, practical, and story-led.","isDefault":false,"config":{"tone":"direct","pacing":"concise"},"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Import theme from JSON","tags":["user-themes"]}},"/v1/posts":{"get":{"description":"Retrieves all active posts with pagination, filtering, and sorting support","operationId":"PostController_findAll[1]","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of posts per page (default: 10)","schema":{"example":10,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filter posts by status","schema":{"enum":["drafted","scheduled","published","failed"],"type":"string","example":"draft"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by (default: createdAt)","schema":{"enum":["createdAt","updatedAt","scheduledAt","publishedAt"],"type":"string","example":"example"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order (default: DESC)","schema":{"enum":["ASC","DESC"],"type":"string","example":"example"}}],"responses":{"200":{"description":"Posts retrieved successfully","content":{"application/json":{"schema":{"example":{"posts":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdote":null,"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":25,"page":1,"totalPages":3}},"examples":{"success":{"summary":"Example response","value":{"posts":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdote":null,"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":25,"page":1,"totalPages":3}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get all posts","tags":["posts"]},"post":{"description":"Creates a new post with optional content and anecdote associations. The post is created in draft status by default.","operationId":"PostController_createPost[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostDto"},"examples":{"default":{"summary":"Example request","value":{"content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab"}}}}}},"responses":{"201":{"description":"Post created successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content here...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdotes":[],"status":"drafted","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content here...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdotes":[],"status":"drafted","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create a new post","tags":["posts"]}},"/v1/posts/schedule":{"post":{"description":"Creates a scheduled post based on an anecdote for a specific date and time. The post content will be generated later by AI.","operationId":"PostController_schedulePost[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePostDto"},"examples":{"default":{"summary":"Example request","value":{"postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","scheduledAt":"2026-06-21T09:00:00.000Z"}}}}}},"responses":{"201":{"description":"Post scheduled successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Placeholder content - will be generated by AI","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteIds":["anecdote-uuid"],"status":"scheduled","scheduledAt":"2024-01-16T09:00:00Z","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Placeholder content - will be generated by AI","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteIds":["anecdote-uuid"],"status":"scheduled","scheduledAt":"2024-01-16T09:00:00Z","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid input data or anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Schedule a new post","tags":["posts"]}},"/v1/posts/search":{"get":{"description":"Search for posts containing specific text in their content","operationId":"PostController_searchByContent[1]","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"example":"technology conference","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of posts per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Search results retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgPost"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgPost"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Search posts by content","tags":["posts"]}},"/v1/posts/scheduled/upcoming":{"get":{"description":"Retrieves posts that are scheduled to be published in the future","operationId":"PostController_getUpcomingScheduledPosts[1]","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of posts to return (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Upcoming scheduled posts retrieved successfully","content":{"application/json":{"schema":{"example":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Excited to share my thoughts on the future of AI in software development...","status":"scheduled","scheduledAt":"2024-01-16T09:00:00Z","scheduledAtFormatted":"Tomorrow, 9:00 AM","engagement":{"likes":0,"comments":0,"shares":0},"anecdotes":[{"id":"anecdote-id","title":"AI Development Experience"}],"linkedInUrl":null}]},"examples":{"success":{"summary":"Example response","value":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Excited to share my thoughts on the future of AI in software development...","status":"scheduled","scheduledAt":"2024-01-16T09:00:00Z","scheduledAtFormatted":"Tomorrow, 9:00 AM","engagement":{"likes":0,"comments":0,"shares":0},"anecdotes":[{"id":"anecdote-id","title":"AI Development Experience"}],"linkedInUrl":null}]}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get upcoming scheduled posts","tags":["posts"]}},"/v1/posts/anecdote/{anecdoteId}":{"get":{"description":"Retrieves all posts associated with a specific anecdote with pagination support","operationId":"PostController_findByAnecdote[1]","parameters":[{"name":"anecdoteId","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"a3e165ff-23a3-45bc-aed5-be6c3a2b4a54","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of posts per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Posts retrieved successfully","content":{"application/json":{"schema":{"example":{"posts":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content based on anecdote...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdotes":[{"id":"a3e165ff-23a3-45bc-aed5-be6c3a2b4a54","title":"My Success Story","category":"professional"}],"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":1,"page":1,"totalPages":1}},"examples":{"success":{"summary":"Example response","value":{"posts":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content based on anecdote...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdotes":[{"id":"a3e165ff-23a3-45bc-aed5-be6c3a2b4a54","title":"My Success Story","category":"professional"}],"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":1,"page":1,"totalPages":1}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get posts by anecdote","tags":["posts"]}},"/v1/posts/{id}":{"get":{"description":"Retrieves a single post by its ID, including author and anecdote information","operationId":"PostController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Post retrieved successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdote":{"id":"anecdote-uuid","title":"My Success Story","category":"professional"},"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"anecdote":{"id":"anecdote-uuid","title":"My Success Story","category":"professional"},"tags":["technology"],"likesCount":5,"commentsCount":2,"sharesCount":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get a specific post","tags":["posts"]},"delete":{"description":"Soft deletes a post by setting isActive to false","operationId":"PostController_remove[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post to delete","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Post deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPost"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete a post","tags":["posts"]},"patch":{"description":"Updates an existing post with new content, media, or engagement metrics","operationId":"PostController_update[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post to update","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostDto"},"examples":{"default":{"summary":"Example request","value":{"content":"Updated post draft with a sharper hook and clearer takeaway.","status":"draft"}}}}}},"responses":{"200":{"description":"Post updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPost"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update a post","tags":["posts"]}},"/v1/posts/{id}/like":{"patch":{"description":"Increment post likes through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"PostController_incrementLikes[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Like count incremented successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPost"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Increment post likes","tags":["posts"]}},"/v1/posts/{id}/comment":{"patch":{"description":"Increases the comment count of a post by 1","operationId":"PostController_incrementComments[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Comment count incremented successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPost"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Increment post comments","tags":["posts"]}},"/v1/posts/{id}/share":{"patch":{"description":"Increases the share count of a post by 1","operationId":"PostController_incrementShares[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Share count incremented successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPost"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Increment post shares","tags":["posts"]}},"/v1/posts/{id}/regenerate-tags":{"patch":{"description":"Uses AI to regenerate tags for the post based on its content","operationId":"PostController_regenerateTags[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Tags regenerated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPost"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Regenerate post tags","tags":["posts"]}},"/v1/posts/{id}/publish":{"post":{"description":"Publishes the post directly to LinkedIn using the integrated LinkedIn service and sends an email notification","operationId":"PostController_publishPost[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post to publish","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Post published successfully","content":{"application/json":{"schema":{"example":{"success":true,"message":"Post published successfully to LinkedIn","publishedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"success":true,"message":"Post published successfully to LinkedIn","publishedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"201":{"description":"Created successfully. Publish post to LinkedIn.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPost"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","content":"I used to think consistency came from discipline. It actually came from removing friction.","platform":"linkedin","status":"draft","likes":12,"comments":3,"shares":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Post already published or LinkedIn account not connected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Publish post to LinkedIn","tags":["posts"]}},"/v1/posts/{id}/mark-published":{"patch":{"description":"Changes post status to PUBLISHED without actually publishing to LinkedIn. Useful if the post was published manually on LinkedIn.","operationId":"PostController_markAsPublished[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkPublishedDto"},"examples":{"default":{"summary":"Example request","value":{"content":"Updated post draft with a sharper hook and clearer takeaway.","status":"draft"}}}}}},"responses":{"200":{"description":"Post marked as published successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","status":"published","publishedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","status":"published","publishedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Post already published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Mark post as published manually","tags":["posts"]}},"/v1/posts/{id}/upload-image":{"patch":{"description":"Upload an image to a post through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"PostController_uploadImage[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Image file (jpg, png, gif, etc.)"}},"required":["image"]},"examples":{"default":{"summary":"Example request","value":{"image":"<image file>"}}}}}},"responses":{"200":{"description":"Image uploaded successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid image file or upload failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Upload an image to a post","tags":["posts"]}},"/v1/posts/{id}/upload-video":{"patch":{"description":"Upload a video to a post through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"PostController_uploadVideo[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"video":{"type":"string","format":"binary","description":"Video file (mp4, avi, mov, etc.)"}},"required":["video"]},"examples":{"default":{"summary":"Example request","value":{"video":"<video file>"}}}}}},"responses":{"200":{"description":"Video uploaded successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":"/uploads/videos/1640123456789-example.mp4","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":"/uploads/videos/1640123456789-example.mp4","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid video file or upload failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Upload a video to a post","tags":["posts"]}},"/v1/posts/{id}/image":{"get":{"description":"Retrieve the image file associated with a post","operationId":"PostController_getImage[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Image file returned successfully","content":{"application/json":{"schema":{"type":"string","format":"binary"},"examples":{"success":{"summary":"Example response","value":"string"}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found or no image associated with post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get post image","tags":["posts"]},"delete":{"description":"Remove the image from an existing post and delete the file from disk","operationId":"PostController_deleteImage[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Image deleted successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":"/uploads/videos/1640123456789-example.mp4","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":"/uploads/videos/1640123456789-example.mp4","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"No image to delete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete image from a post","tags":["posts"]}},"/v1/posts/{id}/video":{"get":{"description":"Retrieve the video file associated with a post","operationId":"PostController_getVideo[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Video file returned successfully","content":{"application/json":{"schema":{"type":"string","format":"binary"},"examples":{"success":{"summary":"Example response","value":"string"}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found or no video associated with post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get post video","tags":["posts"]},"delete":{"description":"Remove the video from an existing post and delete the file from disk","operationId":"PostController_deleteVideo[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Video deleted successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"No video to delete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete video from a post","tags":["posts"]}},"/v1/posts/{id}/upload-carousel":{"patch":{"description":"Upload a PDF document to an existing post for LinkedIn carousel display","operationId":"PostController_uploadCarousel[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"carousel":{"type":"string","format":"binary","description":"PDF file for carousel"},"title":{"type":"string","description":"Title for the carousel document (required by LinkedIn)"}},"required":["carousel","title"]},"examples":{"default":{"summary":"Example request","value":{"carousel":"<PDF file>","title":"Founder lessons carousel"}}}}}},"responses":{"200":{"description":"Carousel uploaded successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":null,"carouselUrl":"/uploads/carousels/1640123456789-example.pdf","carouselTitle":"My Carousel Title","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":null,"videoUrl":null,"carouselUrl":"/uploads/carousels/1640123456789-example.pdf","carouselTitle":"My Carousel Title","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid PDF file or upload failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Upload a carousel (PDF) to a post","tags":["posts"]}},"/v1/posts/{id}/carousel":{"get":{"description":"Retrieve the carousel PDF file associated with a post","operationId":"PostController_getCarousel[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Carousel file returned successfully","content":{"application/json":{"schema":{"type":"string","format":"binary"},"examples":{"success":{"summary":"Example response","value":"string"}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found or no carousel associated with post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get post carousel","tags":["posts"]},"delete":{"description":"Remove the carousel PDF from an existing post and delete the file from disk","operationId":"PostController_deleteCarousel[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Carousel deleted successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"carouselUrl":null,"carouselTitle":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Post content...","imageUrl":"/uploads/images/1640123456789-example.jpg","videoUrl":null,"carouselUrl":null,"carouselTitle":null,"authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:35:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"No carousel to delete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete carousel from a post","tags":["posts"]}},"/v1/posts/{id}/carousel-preview":{"get":{"description":"Retrieve the first slide (intro) of the carousel as a PNG preview image","operationId":"PostController_getCarouselPreview[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the post","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Carousel preview image returned successfully (PNG)","content":{"application/json":{"schema":{"type":"string","format":"binary"},"examples":{"success":{"summary":"Example response","value":"string"}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found or no carousel slides found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get carousel preview image","tags":["posts"]}},"/v1/anecdotes":{"get":{"description":"Retrieves all active anecdotes with pagination support","operationId":"AnecdoteController_findAll[1]","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of anecdotes per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Anecdotes retrieved successfully","content":{"application/json":{"schema":{"example":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"category":"professional","tags":["leadership"],"mood":"reflective","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":15,"page":1,"limit":10,"totalPages":2,"stats":{"professional":8,"personal":5,"lessons":2,"favorites":3}}},"examples":{"success":{"summary":"Example response","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"category":"professional","tags":["leadership"],"mood":"reflective","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}],"total":15,"page":1,"limit":10,"totalPages":2,"stats":{"professional":8,"personal":5,"lessons":2,"favorites":3}}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get all anecdotes","tags":["anecdotes"]},"post":{"description":"Creates a new personal anecdote with content, categorization, and metadata. When autoFill is enabled, AI will generate missing details.","operationId":"AnecdoteController_create[1]","parameters":[{"name":"autoFill","required":true,"in":"query","schema":{"type":"boolean","example":"example"},"description":"autoFill parameter."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnecdoteDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"]}}}}}},"responses":{"201":{"description":"Anecdote created successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked with leading...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","storyType":"professional_stories","tags":["leadership","teamwork"],"mood":"reflective","context":"startup","lessonLearned":"Effective leadership requires trust...","linkedinAngle":"Share this as a leadership lesson...","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked with leading...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","storyType":"professional_stories","tags":["leadership","teamwork"],"mood":"reflective","context":"startup","lessonLearned":"Effective leadership requires trust...","linkedinAngle":"Share this as a leadership lesson...","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create a new anecdote","tags":["anecdotes"]}},"/v1/anecdotes/batch":{"post":{"description":"Import multiple anecdotes from an Excel file (.xlsx, .xls). Expected columns: TITRE (title), ANGLE (LinkedIn angle), ANECDOTE (content - required). When autoFill is enabled, AI will generate missing details like mood, lesson learned, tags, etc.","operationId":"AnecdoteController_batchImport[1]","parameters":[{"name":"autoFill","required":false,"in":"query","description":"Enable AI auto-fill for missing details (default: true)","schema":{"example":true,"type":"boolean"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Excel file (.xlsx, .xls) with columns: TITRE, ANGLE, ANECDOTE"}},"required":["file"]},"examples":{"default":{"summary":"Example request","value":{"file":"<spreadsheet or CSV file>","autoFill":true}}}}}},"responses":{"200":{"description":"Batch import job queued successfully","content":{"application/json":{"schema":{"example":{"success":true,"message":"Your anecdotes are being created. This may take a few minutes.","jobId":"batch-import-1234567890"}},"examples":{"success":{"summary":"Example response","value":{"success":true,"message":"Your anecdotes are being created. This may take a few minutes.","jobId":"batch-import-1234567890"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid file format or empty file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Batch create anecdotes from Excel file","tags":["anecdotes"]}},"/v1/anecdotes/audio":{"post":{"description":"Processes an audio file to extract and create an anecdote using AI transcription and content analysis. When autoFill is enabled, AI will generate additional details.","operationId":"AnecdoteController_createFromAudio[1]","parameters":[{"name":"autoFill","required":false,"in":"query","description":"Enable AI auto-fill for missing details","schema":{"example":false,"type":"boolean"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"audio":{"type":"string","format":"binary","description":"Audio file (mp3, wav, m4a, etc.)"},"priority":{"type":"number","minimum":1,"maximum":5,"default":1,"description":"Priority level (1 = highest, 5 = lowest)"},"title":{"type":"string","description":"Optional title to keep when autoFill is disabled"},"storyType":{"type":"string","description":"Optional story type"},"tags":{"type":"string","description":"JSON array of tags, for example [\"leadership\"]"},"contentScopes":{"type":"string","description":"JSON array of content scopes, for example [\"linkedin\"]"},"mood":{"type":"string","description":"Optional mood/tone"},"context":{"type":"string","description":"Optional context around the anecdote"},"lessonLearned":{"type":"string","description":"Optional lesson learned"},"linkedinAngle":{"type":"string","description":"Optional LinkedIn angle"},"isFavorite":{"type":"string","enum":["true","false"],"description":"Whether the anecdote starts as favorite"},"timeSensitive":{"type":"string","enum":["true","false"],"description":"Whether the anecdote is time-sensitive"}},"required":["audio"]},"examples":{"default":{"summary":"Example request","value":{"audio":"<audio file>","title":"Voice memo from customer call","autoFill":true}}}}}},"responses":{"201":{"description":"Audio anecdote processed and created successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"My Experience at the Tech Conference","content":"Transcribed and processed content from audio...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","tags":["conference","networking"],"priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"My Experience at the Tech Conference","content":"Transcribed and processed content from audio...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","tags":["conference","networking"],"priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid audio file or processing failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create anecdote from audio","tags":["anecdotes"]}},"/v1/anecdotes/{id}/post":{"post":{"description":"Generates a LinkedIn post from an anecdote using AI, with status set to DRAFTED","operationId":"AnecdoteController_generatePostFromAnecdote[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"201":{"description":"Post generated and created successfully","content":{"application/json":{"schema":{"example":{"id":"456e7890-f12b-34c5-d678-901234567890","content":"Here's a story from my experience...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteIds":["123e4567-e89b-12d3-a456-426614174000"],"tags":["leadership","experience","professional"],"status":"drafted","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"456e7890-f12b-34c5-d678-901234567890","content":"Here's a story from my experience...","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteIds":["123e4567-e89b-12d3-a456-426614174000"],"tags":["leadership","experience","professional"],"status":"drafted","isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Failed to generate post content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Generate post from anecdote","tags":["anecdotes"]}},"/v1/anecdotes/{id}/post-job":{"post":{"description":"Creates a post generation job that runs through 8 AI agents for optimal quality. Returns a job that can be tracked and validated.","operationId":"AnecdoteController_generatePostJobFromAnecdote[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"201":{"description":"Post generation job created successfully","content":{"application/json":{"schema":{"example":{"id":"456e7890-f12b-34c5-d678-901234567890","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteId":"123e4567-e89b-12d3-a456-426614174000","status":"CREATED","currentStep":null,"version":1,"createdAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"456e7890-f12b-34c5-d678-901234567890","authorId":"987fcdeb-51a2-43d7-8f9e-123456789abc","anecdoteId":"123e4567-e89b-12d3-a456-426614174000","status":"CREATED","currentStep":null,"version":1,"createdAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Generate post from anecdote using agentic pipeline","tags":["anecdotes"]}},"/v1/anecdotes/{id}/post-job/run":{"post":{"description":"Creates and runs a post generation job through 8 AI agents. Returns the completed job with all artifacts.","operationId":"AnecdoteController_generateAndRunPostJobFromAnecdote[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"201":{"description":"Post generation job completed","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgAnecdote"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Generate post from anecdote using agentic pipeline and run immediately","tags":["anecdotes"]}},"/v1/anecdotes/search":{"get":{"description":"Search for anecdotes by content, title, or lesson learned","operationId":"AnecdoteController_searchByContent[1]","parameters":[{"name":"q","required":true,"in":"query","description":"Search term","schema":{"example":"leadership team","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of anecdotes per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Search results retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgAnecdote"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgAnecdote"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Search anecdotes","tags":["anecdotes"]}},"/v1/anecdotes/unused":{"get":{"description":"Retrieves anecdotes that have not been used in any posts yet, ordered by priority","operationId":"AnecdoteController_findUnusedAnecdotes[1]","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of anecdotes per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Unused anecdotes retrieved successfully","content":{"application/json":{"schema":{"example":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","priority":1,"category":"professional","mood":"reflective","linkedinAngle":"Share this as a leadership lesson...","isUsedInPost":false,"createdAt":"2024-01-15T10:30:00Z"}],"total":5,"page":1,"limit":10,"totalPages":1}},"examples":{"success":{"summary":"Example response","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","priority":1,"category":"professional","mood":"reflective","linkedinAngle":"Share this as a leadership lesson...","isUsedInPost":false,"createdAt":"2024-01-15T10:30:00Z"}],"total":5,"page":1,"limit":10,"totalPages":1}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get unused anecdotes","tags":["anecdotes"]}},"/v1/anecdotes/mood/{mood}":{"get":{"description":"Retrieves anecdotes filtered by mood/tone","operationId":"AnecdoteController_findByMood[1]","parameters":[{"name":"mood","required":true,"in":"path","description":"Mood to filter by","schema":{"example":"inspiring","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of anecdotes per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Mood anecdotes retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgAnecdote"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get anecdotes by mood","tags":["anecdotes"]}},"/v1/anecdotes/story-type/{storyType}":{"get":{"description":"Retrieves anecdotes filtered by story type (professional stories, personal stories, lesson learned)","operationId":"AnecdoteController_findByStoryType[1]","parameters":[{"name":"storyType","required":true,"in":"path","description":"Story type to filter by","schema":{"enum":["professional_stories","personal_stories","lesson_learned"],"type":"string","example":"lesson"}},{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of anecdotes per page (default: 10)","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Story type anecdotes retrieved successfully","content":{"application/json":{"schema":{"example":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"Leading My First Team","storyType":"professional_stories","content":"When I was promoted to team lead...","createdAt":"2024-01-15T10:30:00Z"}],"total":8,"page":1,"limit":10,"totalPages":1}},"examples":{"success":{"summary":"Example response","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"Leading My First Team","storyType":"professional_stories","content":"When I was promoted to team lead...","createdAt":"2024-01-15T10:30:00Z"}],"total":8,"page":1,"limit":10,"totalPages":1}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get anecdotes by story type","tags":["anecdotes"]}},"/v1/anecdotes/stats":{"get":{"description":"Retrieves comprehensive statistics about anecdotes including usage, story types, and moods","operationId":"AnecdoteController_getStats[1]","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully","content":{"application/json":{"schema":{"example":{"total":25,"used":10,"unused":15,"byStoryType":{"professional_stories":12,"personal_stories":8,"lesson_learned":5},"byMood":{"inspiring":10,"reflective":8,"humorous":4,"educational":3},"highPriority":8}},"examples":{"success":{"summary":"Example response","value":{"total":25,"used":10,"unused":15,"byStoryType":{"professional_stories":12,"personal_stories":8,"lesson_learned":5},"byMood":{"inspiring":10,"reflective":8,"humorous":4,"educational":3},"highPriority":8}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get anecdote statistics","tags":["anecdotes"]}},"/v1/anecdotes/random":{"get":{"description":"Retrieves a random anecdote, optionally filtered by story type","operationId":"AnecdoteController_getRandomAnecdote[1]","parameters":[{"name":"storyType","required":false,"in":"query","description":"Story type to filter by","schema":{"enum":["professional_stories","personal_stories","lesson_learned"],"type":"string","example":"lesson"}}],"responses":{"200":{"description":"Random anecdote retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgAnecdote"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgAnecdote"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get random anecdote","tags":["anecdotes"]}},"/v1/anecdotes/{id}/audio":{"get":{"description":"Streams the audio file for a voice anecdote as binary data. Only works for anecdotes with type \"voice\" and existing audio files.","operationId":"AnecdoteController_getAudioFile[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Audio file streamed successfully","headers":{"Content-Type":{"description":"MIME type of the audio file","schema":{"type":"string","example":"audio/mpeg"}},"Content-Length":{"description":"Size of the audio file in bytes","schema":{"type":"integer","example":1048576}},"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found or not a voice anecdote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"410":{"description":"Audio file not found on disk","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"gone":{"summary":"Gone","value":{"statusCode":410,"message":"Resource is no longer available","error":"Gone","code":"gone"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get audio file for a voice anecdote","tags":["anecdotes"]}},"/v1/anecdotes/{id}":{"get":{"description":"Retrieves a single anecdote by its ID, including author information and related posts","operationId":"AnecdoteController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Anecdote retrieved successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked with leading...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"posts":[{"id":"post-uuid","content":"Post based on this anecdote...","createdAt":"2024-01-16T10:30:00Z"}],"storyType":"professional_stories","tags":["leadership","teamwork"],"mood":"reflective","context":"startup","lessonLearned":"Effective leadership requires trust...","linkedinAngle":"Share this as a leadership lesson...","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-16T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","content":"Last year, I was tasked with leading...","author":{"id":"987fcdeb-51a2-43d7-8f9e-123456789abc","name":"John Doe","email":"john@example.com"},"posts":[{"id":"post-uuid","content":"Post based on this anecdote...","createdAt":"2024-01-16T10:30:00Z"}],"storyType":"professional_stories","tags":["leadership","teamwork"],"mood":"reflective","context":"startup","lessonLearned":"Effective leadership requires trust...","linkedinAngle":"Share this as a leadership lesson...","priority":1,"isActive":true,"createdAt":"2024-01-15T10:30:00Z","updatedAt":"2024-01-16T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get a specific anecdote","tags":["anecdotes"]},"delete":{"description":"Soft deletes an anecdote by setting isActive to false","operationId":"AnecdoteController_remove[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote to delete","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Anecdote deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgAnecdote"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete an anecdote","tags":["anecdotes"]},"patch":{"description":"Updates an existing anecdote with new content, metadata, or usage statistics","operationId":"AnecdoteController_update[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote to update","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAnecdoteDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"]}}}}}},"responses":{"200":{"description":"Anecdote updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgAnecdote"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update an anecdote","tags":["anecdotes"]}},"/v1/anecdotes/{id}/favorite":{"post":{"description":"Toggles the favorite status of an anecdote","operationId":"AnecdoteController_setFavorite[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the anecdote","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Favorite status toggled successfully","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","isFavorite":true,"updatedAt":"2024-01-15T10:30:00Z"}},"examples":{"success":{"summary":"Example response","value":{"id":"123e4567-e89b-12d3-a456-426614174000","title":"How I Learned to Lead a Team","isFavorite":true,"updatedAt":"2024-01-15T10:30:00Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"201":{"description":"Created successfully. Toggle favorite status.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","title":"The onboarding lesson","content":"A customer got stuck on step one, which showed us the product was explaining itself too late.","mood":"reflective","storyType":"lesson","tags":["onboarding","product"],"isFavorite":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Toggle favorite status","tags":["anecdotes"]}},"/v1/anecdotes/export/csv":{"get":{"description":"Exports all user anecdotes as a CSV file with comprehensive data including content, metadata, and usage statistics","operationId":"AnecdoteController_exportAnecdotesCSV[1]","parameters":[],"responses":{"200":{"description":"CSV file generated successfully","headers":{"Content-Type":{"description":"text/csv","schema":{"type":"string"}},"Content-Disposition":{"description":"attachment; filename=\"anecdotes-export.csv\"","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"text/csv":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Export anecdotes as CSV","tags":["anecdotes"]}},"/v1/anecdotes/export/voice":{"get":{"description":"Exports all user anecdotes as audio files in a ZIP archive using text-to-speech conversion","operationId":"AnecdoteController_exportAnecdotesVoice[1]","parameters":[],"responses":{"200":{"description":"ZIP file with audio anecdotes generated successfully","headers":{"Content-Type":{"description":"application/zip","schema":{"type":"string"}},"Content-Disposition":{"description":"attachment; filename=\"anecdotes-voice-export.zip\"","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Export anecdotes as voice ZIP","tags":["anecdotes"]}},"/v1/anecdotes/all":{"delete":{"description":"Soft deletes all anecdotes owned by the authenticated user","operationId":"AnecdoteController_removeAll[1]","parameters":[],"responses":{"200":{"description":"All anecdotes deleted successfully","content":{"application/json":{"schema":{"example":{"deleted":15}},"examples":{"success":{"summary":"Example response","value":{"deleted":15}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete all anecdotes for the current user","tags":["anecdotes"]}},"/v1/post-generation/from-anecdote":{"post":{"operationId":"PostGenerationController_createFromAnecdote[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostJobDto"},"examples":{"default":{"summary":"Example request","value":{"anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","targetPlatform":"linkedin","instructions":"Keep it practical and under 1,200 characters."}}}}}},"responses":{"201":{"description":"Job created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPostGenerationJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Anecdote not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new post generation job from an anecdote","tags":["Post Generation"],"description":"Create a new post generation job from an anecdote. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation/{id}/run":{"post":{"operationId":"PostGenerationController_runPipeline[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Pipeline completed","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPostGenerationJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot run pipeline in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Run the pipeline for a job (synchronously)","tags":["Post Generation"],"description":"Run the pipeline for a job (synchronously). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation":{"get":{"operationId":"PostGenerationController_findAll[1]","parameters":[],"responses":{"200":{"description":"List of post generation jobs","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgPostGenerationJob"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgPostGenerationJob"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all post generation jobs for current user","tags":["Post Generation"],"description":"Get all post generation jobs for current user. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation/{id}":{"get":{"operationId":"PostGenerationController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Post generation job details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgPostGenerationJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a post generation job by ID","tags":["Post Generation"],"description":"Get a post generation job by ID through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation/{id}/validate":{"post":{"operationId":"PostGenerationController_validate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job validated and post created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPostGenerationJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot validate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate a post generation job and create the post","tags":["Post Generation"],"description":"Validate a post generation job and create the post. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation/{id}/regenerate":{"post":{"operationId":"PostGenerationController_regenerate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegeneratePostGenerationJobDto"},"examples":{"default":{"summary":"Example request","value":{"anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","targetPlatform":"linkedin","instructions":"Keep it practical and under 1,200 characters."}}}}}},"responses":{"200":{"description":"Job reset for regeneration","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPostGenerationJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a post generation job","tags":["Post Generation"],"description":"Regenerate a post generation job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/post-generation/{id}/reject":{"post":{"operationId":"PostGenerationController_reject[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectPostGenerationJobDto"},"examples":{"default":{"summary":"Example request","value":{"anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","targetPlatform":"linkedin","instructions":"Keep it practical and under 1,200 characters."}}}}}},"responses":{"200":{"description":"Job rejected","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgPostGenerationJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f49-1a5b-762a-a8d8-d6bb02a9f7f9","anecdoteId":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab","status":"completed","currentStep":"post_draft","qualityScore":0.91,"riskLevel":"low","warnings":[],"totalTokensUsed":1284,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot reject job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Reject a post generation job","tags":["Post Generation"],"description":"Reject a post generation job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/statistics/dashboard":{"get":{"description":"Retrieves key performance metrics for the dashboard including posts, engagement, comments, and impressions with month-over-month comparisons","operationId":"StatisticsController_getDashboardMetrics[1]","parameters":[],"responses":{"200":{"description":"Dashboard metrics retrieved successfully","content":{"application/json":{"schema":{"example":{"totalPosts":{"value":24,"change":{"value":12,"type":"increase"},"description":"from last month"},"engagementRate":{"value":"3.2%","change":{"value":8,"type":"increase"},"description":"vs last month"},"avgComments":{"value":8.5,"change":{"value":15,"type":"increase"},"description":"per post"},"impressions":{"value":"12.4K","change":{"value":22,"type":"increase"},"description":"this month"}}},"examples":{"success":{"summary":"Example response","value":{"totalPosts":{"value":24,"change":{"value":12,"type":"increase"},"description":"from last month"},"engagementRate":{"value":"3.2%","change":{"value":8,"type":"increase"},"description":"vs last month"},"avgComments":{"value":8.5,"change":{"value":15,"type":"increase"},"description":"per post"},"impressions":{"value":"12.4K","change":{"value":22,"type":"increase"},"description":"this month"}}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get dashboard metrics","tags":["statistics"]}},"/v1/statistics/overview":{"get":{"description":"Retrieves comprehensive overview statistics including anecdotes, posts, and content breakdowns","operationId":"StatisticsController_getOverviewStats[1]","parameters":[],"responses":{"200":{"description":"Overview statistics retrieved successfully","content":{"application/json":{"schema":{"example":{"totalAnecdotes":45,"totalPosts":24,"scheduledPosts":3,"publishedPosts":21,"favoriteAnecdotes":12,"professionalStories":18,"personalStories":15,"lessonsLearned":12}},"examples":{"success":{"summary":"Example response","value":{"totalAnecdotes":45,"totalPosts":24,"scheduledPosts":3,"publishedPosts":21,"favoriteAnecdotes":12,"professionalStories":18,"personalStories":15,"lessonsLearned":12}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get overview statistics","tags":["statistics"]}},"/v1/statistics/recent-posts":{"get":{"description":"Retrieves posts ranked by engagement performance for the dashboard activity feed. Posts are sorted by engagement score (likes + comments×3 + shares×5 + impressions×0.1) with highest engagement first.","operationId":"StatisticsController_getRecentPosts[1]","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of posts to return (default: 5)","schema":{"example":5,"type":"number"}}],"responses":{"200":{"description":"Top performing posts retrieved successfully","content":{"application/json":{"schema":{"example":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Just shipped a new feature that reduces API response time by 40%...","status":"published","publishedAt":"2h ago","engagement":{"likes":24,"comments":8,"shares":3,"impressions":1250},"anecdotes":[],"linkedInUrl":"https://linkedin.com/post/123"}]},"examples":{"success":{"summary":"Example response","value":[{"id":"123e4567-e89b-12d3-a456-426614174000","content":"Just shipped a new feature that reduces API response time by 40%...","status":"published","publishedAt":"2h ago","engagement":{"likes":24,"comments":8,"shares":3,"impressions":1250},"anecdotes":[],"linkedInUrl":"https://linkedin.com/post/123"}]}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get top performing posts","tags":["statistics"]}},"/v1/statistics/pending-validation":{"get":{"description":"Retrieves all content items (scripts, carousels, shorts) that are awaiting user validation","operationId":"StatisticsController_getPendingValidation[1]","parameters":[],"responses":{"200":{"description":"Pending validation items retrieved successfully","content":{"application/json":{"schema":{"example":{"items":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"SCRIPT","title":"How to build a great team","createdAt":"2026-01-22T10:30:00.000Z","createdAtFormatted":"2 hours ago"},{"id":"456e7890-e89b-12d3-a456-426614174001","type":"CAROUSEL","title":"Leadership lessons from...","createdAt":"2026-01-22T09:15:00.000Z","createdAtFormatted":"3 hours ago"},{"id":"789e1234-e89b-12d3-a456-426614174002","type":"SHORT","title":"Quick tip on productivity","createdAt":"2026-01-22T08:00:00.000Z","createdAtFormatted":"4 hours ago"}],"count":3}},"examples":{"success":{"summary":"Example response","value":{"items":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"SCRIPT","title":"How to build a great team","createdAt":"2026-01-22T10:30:00.000Z","createdAtFormatted":"2 hours ago"},{"id":"456e7890-e89b-12d3-a456-426614174001","type":"CAROUSEL","title":"Leadership lessons from...","createdAt":"2026-01-22T09:15:00.000Z","createdAtFormatted":"3 hours ago"},{"id":"789e1234-e89b-12d3-a456-426614174002","type":"SHORT","title":"Quick tip on productivity","createdAt":"2026-01-22T08:00:00.000Z","createdAtFormatted":"4 hours ago"}],"count":3}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get content awaiting validation","tags":["statistics"]}},"/v1/carousel/templates":{"get":{"operationId":"CarouselController_getTemplates[1]","parameters":[],"responses":{"200":{"description":"Templates retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselTemplate"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselTemplate"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all carousel templates for the current user","tags":["Carousel"],"description":"Get all carousel templates for the current user. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"post":{"operationId":"CarouselController_createTemplate[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Minimal red carousel","config":{"primaryColor":"#e00036","backgroundColor":"#ffffff","slideCount":6}}}}}}},"responses":{"201":{"description":"Template created successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselTemplate"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new carousel template","tags":["Carousel"],"description":"Create a new carousel template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}":{"get":{"operationId":"CarouselController_getTemplate[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"responses":{"200":{"description":"Template retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselTemplate"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a specific carousel template","tags":["Carousel"],"description":"Get a specific carousel template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"CarouselController_deleteTemplate[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"responses":{"204":{"description":"Template deleted successfully"},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a carousel template","tags":["Carousel"],"description":"Delete a carousel template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"CarouselController_updateTemplate[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Minimal red carousel","config":{"primaryColor":"#e00036","backgroundColor":"#ffffff","slideCount":6}}}}}}},"responses":{"200":{"description":"Template updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselTemplate"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update a carousel template","tags":["Carousel"],"description":"Update a carousel template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/upload-profile-image":{"patch":{"operationId":"CarouselController_uploadProfileImage[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"profileImage":{"type":"string","format":"binary","description":"Profile image file (jpg, png, webp)"}},"required":["profileImage"]},"examples":{"default":{"summary":"Example request","value":{"carousel":"<PDF file>","title":"Founder lessons carousel"}}}}}},"responses":{"200":{"description":"Profile image uploaded successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload profile image for template","tags":["Carousel"],"description":"Upload profile image for template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/upload-background-image":{"patch":{"operationId":"CarouselController_uploadBackgroundImage[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"backgroundImage":{"type":"string","format":"binary","description":"Background image/texture file (jpg, png, webp)"}},"required":["backgroundImage"]},"examples":{"default":{"summary":"Example request","value":{"carousel":"<PDF file>","title":"Founder lessons carousel"}}}}}},"responses":{"200":{"description":"Background image uploaded successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload background image for template","tags":["Carousel"],"description":"Upload background image for template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/profile-image":{"delete":{"operationId":"CarouselController_deleteProfileImage[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"responses":{"200":{"description":"Profile image deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete profile image from template","tags":["Carousel"],"description":"Delete profile image from template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/background-image":{"delete":{"operationId":"CarouselController_deleteBackgroundImage[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"responses":{"200":{"description":"Background image deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete background image from template","tags":["Carousel"],"description":"Delete background image from template through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/upload-custom-layout":{"patch":{"description":"Upload a ZIP file containing custom Handlebars templates for this carousel template.\n    \n**Required files in ZIP:**\n- `intro.hbs` - Intro slide template\n- `content.hbs` - Content slide template  \n- `outro.hbs` - Outro slide template\n\n**Optional:**\n- `partials/base-styles.hbs` - Shared CSS styles\n\nThe templates will be stored and used instead of the default templates for this specific carousel template.","operationId":"CarouselController_uploadCustomLayout[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"layoutZip":{"type":"string","format":"binary","description":"ZIP file containing .hbs templates (intro.hbs, content.hbs, outro.hbs)"}},"required":["layoutZip"]},"examples":{"default":{"summary":"Example request","value":{"carousel":"<PDF file>","title":"Founder lessons carousel"}}}}}},"responses":{"200":{"description":"Custom layout uploaded successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Invalid ZIP file or missing required templates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload a custom layout (ZIP file with .hbs templates)","tags":["Carousel"]}},"/v1/carousel/templates/{templateId}/custom-layout":{"post":{"operationId":"CarouselController_uploadCustomLayoutFromFrontend[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"layout":{"type":"string","format":"binary","description":"ZIP file containing .hbs templates (intro.hbs, content.hbs, outro.hbs)"}},"required":["layout"]},"examples":{"default":{"summary":"Example request","value":{"carousel":"<PDF file>","title":"Founder lessons carousel"}}}}}},"responses":{"200":{"description":"Custom layout uploaded successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselTemplate"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Upload a custom layout through the frontend contract.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarouselTemplate"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid ZIP file or missing required templates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload a custom layout through the frontend contract","tags":["Carousel"],"description":"Upload a custom layout through the frontend contract. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"CarouselController_deleteCustomLayout[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."}],"responses":{"200":{"description":"Custom layout deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselTemplate"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Template does not have a custom layout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete custom layout and revert to default templates","tags":["Carousel"],"description":"Delete custom layout and revert to default templates. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/{templateId}/preview":{"get":{"operationId":"CarouselController_getTemplatePreview[1]","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string","example":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"},"description":"Carousel template identifier."},{"name":"slideType","required":false,"in":"query","schema":{"enum":["intro","content","outro"],"type":"string","example":"example"},"description":"slideType parameter."}],"responses":{"200":{"description":"Preview image returned as PNG","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a preview image of a saved template","tags":["Carousel"],"description":"Get a preview image of a saved template. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/templates/preview-live":{"post":{"operationId":"CarouselController_getLivePreview[1]","parameters":[{"name":"slideType","required":false,"in":"query","schema":{"enum":["intro","content","outro"],"type":"string","example":"example"},"description":"slideType parameter."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarouselLivePreviewDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Minimal red carousel","config":{"primaryColor":"#e00036","backgroundColor":"#ffffff","slideCount":6}}}}}}},"responses":{"200":{"description":"Preview image returned as PNG","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"201":{"description":"Created successfully. Generate a live preview from template config (without saving).","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselTemplate"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2","name":"Minimal red carousel","config":{"primaryColor":"#e00036","slideCount":6},"isDefault":false,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Generate a live preview from template config (without saving)","tags":["Carousel"],"description":"Generate a live preview from template config (without saving). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generate-from-post/{postId}":{"post":{"operationId":"CarouselController_generateFromPost[1]","parameters":[{"name":"postId","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Post identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCarouselDto"},"examples":{"default":{"summary":"Example request","value":{"content":"Five lessons from turning founder stories into repeatable content.","templateId":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"}}}}}},"responses":{"201":{"description":"Carousel generation started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Generate a carousel from a LinkedIn post","tags":["Carousel"],"description":"Generate a carousel from a LinkedIn post. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generate-from-content":{"post":{"operationId":"CarouselController_generateFromContent[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCarouselFromContentDto"},"examples":{"default":{"summary":"Example request","value":{"content":"Five lessons from turning founder stories into repeatable content.","templateId":"018f9f46-9a0e-7afd-b13f-2f63f07aa4f2"}}}}}},"responses":{"201":{"description":"Carousel generation started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Generate a carousel from raw content","tags":["Carousel"],"description":"Generate a carousel from raw content through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generations":{"get":{"operationId":"CarouselController_getGenerations[1]","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number","example":1},"description":"Page number for paginated responses."},{"name":"limit","required":false,"in":"query","schema":{"type":"number","example":20},"description":"Maximum number of items to return."}],"responses":{"200":{"description":"Generations retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselGeneration"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselGeneration"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all carousel generations for the current user","tags":["Carousel"],"description":"Get all carousel generations for the current user. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generations/{generationId}":{"get":{"operationId":"CarouselController_getGeneration[1]","parameters":[{"name":"generationId","required":true,"in":"path","schema":{"type":"string","example":"018f9f45-23d1-7cb2-8f1f-87921d472a80"},"description":"Carousel generation identifier."}],"responses":{"200":{"description":"Generation retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselGeneration"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a specific carousel generation","tags":["Carousel"],"description":"Get a specific carousel generation through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"CarouselController_deleteGeneration[1]","parameters":[{"name":"generationId","required":true,"in":"path","schema":{"type":"string","example":"018f9f45-23d1-7cb2-8f1f-87921d472a80"},"description":"Carousel generation identifier."}],"responses":{"204":{"description":"Generation deleted successfully"},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a carousel generation","tags":["Carousel"],"description":"Delete a carousel generation through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generations/{generationId}/download":{"get":{"operationId":"CarouselController_getDownloadUrl[1]","parameters":[{"name":"generationId","required":true,"in":"path","schema":{"type":"string","example":"018f9f45-23d1-7cb2-8f1f-87921d472a80"},"description":"Carousel generation identifier."}],"responses":{"200":{"description":"Download URL retrieved","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Images not yet generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get download URL for carousel images (ZIP)","tags":["Carousel"],"description":"Get download URL for carousel images (ZIP). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel/generations/{generationId}/download-pdf":{"get":{"operationId":"CarouselController_getPdfUrl[1]","parameters":[{"name":"generationId","required":true,"in":"path","schema":{"type":"string","example":"018f9f45-23d1-7cb2-8f1f-87921d472a80"},"description":"Carousel generation identifier."}],"responses":{"200":{"description":"PDF URL retrieved","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"PDF not yet generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get download URL for carousel PDF","tags":["Carousel"],"description":"Get download URL for carousel PDF through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/from-post":{"post":{"operationId":"CarouselGenerationController_createFromPost[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCarouselJobDto"},"examples":{"default":{"summary":"Example request","value":{"postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","instructions":"Create a tactical carousel with one idea per slide."}}}}}},"responses":{"201":{"description":"Job created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselGeneration"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new carousel generation job from a post","tags":["Carousel Generation"],"description":"Create a new carousel generation job from a post. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/from-post/run":{"post":{"operationId":"CarouselGenerationController_createAndRunFromPost[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCarouselJobDto"},"examples":{"default":{"summary":"Example request","value":{"postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","instructions":"Create a tactical carousel with one idea per slide."}}}}}},"responses":{"201":{"description":"Job created and pipeline completed","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Post not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create and immediately run a carousel generation job from a post","tags":["Carousel Generation"],"description":"Create and immediately run a carousel generation job from a post. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}/run":{"post":{"operationId":"CarouselGenerationController_runPipeline[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Pipeline completed","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot run pipeline in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Run the pipeline for a job (synchronously)","tags":["Carousel Generation"],"description":"Run the pipeline for a job (synchronously). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation":{"get":{"operationId":"CarouselGenerationController_findAll[1]","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"},"description":"Page number for paginated responses."},{"name":"limit","required":false,"in":"query","schema":{"example":5,"type":"number"},"description":"Maximum number of items to return."},{"name":"statuses","required":false,"in":"query","description":"Comma-separated list of statuses to filter by","schema":{"example":"CREATED,RUNNING,READY_FOR_VALIDATION,RENDERING,FAILED","type":"string"}}],"responses":{"200":{"description":"Paginated list of carousel generation jobs","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselGeneration"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgCarouselGeneration"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all carousel generation jobs for current user","tags":["Carousel Generation"],"description":"Get all carousel generation jobs for current user. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/by-carousel/{carouselId}":{"get":{"operationId":"CarouselGenerationController_findByCarouselId[1]","parameters":[{"name":"carouselId","required":true,"in":"path","schema":{"type":"string","example":"018f9f44-8029-73c9-9f6c-909fc49c1e76"},"description":"Carousel identifier."}],"responses":{"200":{"description":"Carousel generation job details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselGeneration"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found for this carousel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a carousel generation job by its resulting carousel ID","tags":["Carousel Generation"],"description":"Get a carousel generation job by its resulting carousel ID. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}":{"get":{"operationId":"CarouselGenerationController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Carousel generation job details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgCarouselGeneration"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a carousel generation job by ID","tags":["Carousel Generation"],"description":"Get a carousel generation job by ID through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}/validate":{"post":{"operationId":"CarouselGenerationController_validate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCarouselJobDto"},"examples":{"default":{"summary":"Example request","value":{"postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","instructions":"Create a tactical carousel with one idea per slide."}}}}}},"responses":{"200":{"description":"Job validated and carousel created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Cannot validate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate a carousel generation job and generate images","tags":["Carousel Generation"],"description":"Validate a carousel generation job and generate images. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}/validate-default":{"post":{"operationId":"CarouselGenerationController_validateWithDefault[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job validated and carousel created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot validate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate with default template (no body required)","tags":["Carousel Generation"],"description":"Validate with default template (no body required). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}/regenerate":{"post":{"operationId":"CarouselGenerationController_regenerate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateCarouselJobDto"},"examples":{"default":{"summary":"Example request","value":{"postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","instructions":"Create a tactical carousel with one idea per slide."}}}}}},"responses":{"200":{"description":"Job reset for regeneration","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a carousel generation job","tags":["Carousel Generation"],"description":"Regenerate a carousel generation job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/carousel-generation/{id}/retry":{"post":{"operationId":"CarouselGenerationController_retry[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job retried and pipeline started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgCarouselGeneration"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f45-23d1-7cb2-8f1f-87921d472a80","postId":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","status":"completed","currentStep":"render","progress":1,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot retry job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Retry a failed carousel generation job","tags":["Carousel Generation"],"description":"Retry a failed carousel generation job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs":{"get":{"operationId":"ScriptJobController_findAll[1]","parameters":[],"responses":{"200":{"description":"List of script jobs","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgScriptJob"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgScriptJob"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all script jobs","tags":["Script Jobs"],"description":"Get all script jobs through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"post":{"operationId":"ScriptJobController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScriptJobDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The story-first content system","brief":"Explain how creators can turn raw stories into repeatable scripts.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"201":{"description":"Script job created successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgScriptJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new script job","tags":["Script Jobs"],"description":"Create a new script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}":{"get":{"operationId":"ScriptJobController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Script job details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgScriptJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a script job by ID","tags":["Script Jobs"],"description":"Get a script job by ID through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"ScriptJobController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a script job","tags":["Script Jobs"],"description":"Delete a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"ScriptJobController_update[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScriptJobDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The story-first content system","brief":"Explain how creators can turn raw stories into repeatable scripts.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Job updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgScriptJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot update job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update a script job","tags":["Script Jobs"],"description":"Update a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/validate":{"post":{"operationId":"ScriptJobController_validate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job validated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot validate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate a script job","tags":["Script Jobs"],"description":"Validate a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/regenerate":{"post":{"operationId":"ScriptJobController_regenerate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateScriptJobDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The story-first content system","brief":"Explain how creators can turn raw stories into repeatable scripts.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Job queued for regeneration","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a script job","tags":["Script Jobs"],"description":"Regenerate a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/reject":{"post":{"operationId":"ScriptJobController_reject[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectScriptJobDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The story-first content system","brief":"Explain how creators can turn raw stories into repeatable scripts.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Job rejected","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot reject job in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Reject a script job","tags":["Script Jobs"],"description":"Reject a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/status":{"patch":{"operationId":"ScriptJobController_updateJobStatus[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The story-first content system","brief":"Explain how creators can turn raw stories into repeatable scripts.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Status updated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatusResponse"},"examples":{"success":{"summary":"Example response","value":{"status":"running","currentStep":"rendering","progress":0.65,"message":"Generation is in progress","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid status transition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update script job status (for Kanban drag-and-drop)","tags":["Script Jobs"],"description":"Update script job status (for Kanban drag-and-drop). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/thumbnail-preview":{"get":{"operationId":"ScriptJobController_getThumbnailPreview[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Master Prompt variables for thumbnail","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgScriptJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Job not ready for thumbnail generation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get thumbnail Master Prompt preview with auto-detected style","tags":["Script Jobs"],"description":"Get thumbnail Master Prompt preview with auto-detected style. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/upload-photo":{"post":{"operationId":"ScriptJobController_uploadPhoto[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"photo":{"type":"string","format":"binary"}}},"examples":{"default":{"summary":"Example request","value":{"image":"<image file>"}}}}}},"responses":{"200":{"description":"Photo uploaded and thumbnail generation started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid file or job not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload user photo for thumbnail generation","tags":["Script Jobs"],"description":"Upload user photo for thumbnail generation. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/thumbnail-status":{"get":{"operationId":"ScriptJobController_getThumbnailStatus[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Thumbnail status","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgScriptJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get thumbnail generation status","tags":["Script Jobs"],"description":"Get thumbnail generation status through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/regenerate-thumbnail":{"post":{"operationId":"ScriptJobController_regenerateThumbnail[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Thumbnail regeneration started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Regenerate thumbnail for a script job.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate (no photo or already generating)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate thumbnail for a script job","tags":["Script Jobs"],"description":"Regenerate thumbnail for a script job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/regenerate-thumbnail/{index}":{"post":{"operationId":"ScriptJobController_regenerateSingleThumbnail[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."},{"name":"index","required":true,"in":"path","schema":{"type":"number","example":"example"},"description":"index parameter."}],"responses":{"200":{"description":"Single thumbnail regeneration started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgScriptJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","title":"The story-first content system","status":"draft","currentStep":"outline","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"],"thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid index, no completed thumbnails, or already generating","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a single thumbnail by index","tags":["Script Jobs"],"description":"Regenerate a single thumbnail by index through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/export-pdf":{"get":{"operationId":"ScriptJobController_exportPdf[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"PDF download URL returned","content":{"application/json":{"schema":{"type":"object","properties":{"downloadUrl":{"type":"string"},"filename":{"type":"string"}}},"examples":{"success":{"summary":"Example response","value":{"downloadUrl":"string","filename":"string"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Job is not ready for export or script artifact missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Export script job as PDF","tags":["Script Jobs"],"description":"Export script job as PDF through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/{id}/export-text":{"get":{"operationId":"ScriptJobController_exportText[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Plain text script file","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Script artifact missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Export script as plain text for teleprompter","tags":["Script Jobs"],"description":"Export script as plain text for teleprompter. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/script-jobs/generate-all":{"post":{"operationId":"ScriptJobController_generateAll[1]","parameters":[],"responses":{"200":{"description":"Script jobs generation started","content":{"application/json":{"schema":{"type":"object","properties":{"totalStarted":{"type":"number"},"totalFailed":{"type":"number"},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"error":{"type":"string"}}}}}},"examples":{"success":{"summary":"Example response","value":{"totalStarted":1,"totalFailed":1,"failed":[{"id":"string","title":"string","error":"string"}]}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Start generation for all script jobs in backlog (CREATED status)","tags":["Script Jobs"],"description":"Start generation for all script jobs in backlog (CREATED status). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts":{"get":{"operationId":"ShortController_findAll[1]","parameters":[],"responses":{"200":{"description":"List of shorts","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgShort"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgShort"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all shorts","tags":["Shorts"],"description":"Get all shorts through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"post":{"operationId":"ShortController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShortDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"201":{"description":"Short created with status CREATED (not queued - manual trigger required via drag-drop or Generate All)","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgShort"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a new standalone short","tags":["Shorts"],"description":"Create a new standalone short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/from-script/{scriptJobId}":{"post":{"operationId":"ShortController_createFromScriptJob[1]","parameters":[{"name":"scriptJobId","required":true,"in":"path","schema":{"type":"string","example":"018f9f42-9c1d-7b12-97c4-8142b8a27c90"},"description":"Script job identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShortFromScriptJobDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"201":{"description":"Short created from script job with status CREATED (not queued - manual trigger required)","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgShort"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Script job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a short from an existing script job","tags":["Shorts"],"description":"Create a short from an existing script job. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/stats":{"get":{"operationId":"ShortController_getStats[1]","parameters":[],"responses":{"200":{"description":"Shorts statistics","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatisticsSummary"},"examples":{"success":{"summary":"Example response","value":{"total":42,"byStatus":{"draft":12,"scheduled":8,"published":22},"recentItems":[],"generatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get shorts statistics","tags":["Shorts"],"description":"Get shorts statistics through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/generate-all":{"post":{"description":"Batch operation to start AI generation for all shorts with status CREATED","operationId":"ShortController_generateAll[1]","parameters":[],"responses":{"200":{"description":"Batch generation started","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAllShortsResponseDto"},"examples":{"success":{"summary":"Example response","value":{"totalStarted":3,"totalFailed":0,"errors":[]}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Start generation for all shorts in backlog","tags":["Shorts"]}},"/v1/shorts/{id}":{"get":{"operationId":"ShortController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Short details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgShort"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a short by ID","tags":["Shorts"],"description":"Get a short by ID through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"ShortController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Short deleted","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a short","tags":["Shorts"],"description":"Delete a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"ShortController_update[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateShortDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Short updated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgShort"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot update short in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update a short","tags":["Shorts"],"description":"Update a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/status":{"patch":{"operationId":"ShortController_updateStatus[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateShortStatusDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Short status updated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatusResponse"},"examples":{"success":{"summary":"Example response","value":{"status":"running","currentStep":"rendering","progress":0.65,"message":"Generation is in progress","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid status transition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update short status (for Kanban drag-and-drop)","tags":["Shorts"],"description":"Update short status (for Kanban drag-and-drop). Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/validate":{"post":{"operationId":"ShortController_validate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Short validated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot validate short in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate a short","tags":["Shorts"],"description":"Validate a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/regenerate":{"post":{"operationId":"ShortController_regenerate[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateShortDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Short queued for regeneration","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate short in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a short","tags":["Shorts"],"description":"Regenerate a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/reject":{"post":{"operationId":"ShortController_reject[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectShortDto"},"examples":{"default":{"summary":"Example request","value":{"title":"The 30-second lesson","brief":"Turn this idea into a fast short with a direct hook.","selectedAnecdoteIds":["018f9f41-22a1-74bb-9450-7dd0d21ab8ab"]}}}}}},"responses":{"200":{"description":"Short rejected","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot reject short in current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Reject a short","tags":["Shorts"],"description":"Reject a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/upload-photo":{"post":{"operationId":"ShortController_uploadPhoto[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"photo":{"type":"string","format":"binary"}}},"examples":{"default":{"summary":"Example request","value":{"image":"<image file>"}}}}}},"responses":{"200":{"description":"Photo uploaded and thumbnail generation started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid file or short not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Upload user photo for thumbnail generation","tags":["Shorts"],"description":"Upload user photo for thumbnail generation. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/thumbnail-status":{"get":{"operationId":"ShortController_getThumbnailStatus[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Thumbnail status","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgShort"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get thumbnail generation status","tags":["Shorts"],"description":"Get thumbnail generation status through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/regenerate-thumbnail":{"post":{"operationId":"ShortController_regenerateThumbnail[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Thumbnail regeneration started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Regenerate thumbnail for a short.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot regenerate (no photo or already generating)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate thumbnail for a short","tags":["Shorts"],"description":"Regenerate thumbnail for a short through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/shorts/{id}/regenerate-thumbnail/{index}":{"post":{"operationId":"ShortController_regenerateSingleThumbnail[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."},{"name":"index","required":true,"in":"path","schema":{"type":"number","example":"example"},"description":"index parameter."}],"responses":{"200":{"description":"Single thumbnail regeneration started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgShort"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f43-1a76-7b1e-a3ce-f01cce71c641","title":"The 30-second lesson","status":"draft","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","thumbnailStatus":"pending","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid index, no completed thumbnails, or already generating","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a single thumbnail by index","tags":["Shorts"],"description":"Regenerate a single thumbnail by index through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/from-script/{scriptJobId}":{"post":{"operationId":"BrollGenerationController_createFromScript[1]","parameters":[{"name":"scriptJobId","required":true,"in":"path","schema":{"type":"string","example":"018f9f42-9c1d-7b12-97c4-8142b8a27c90"},"description":"Script job identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBrollJobFromScriptDto"},"examples":{"default":{"summary":"Example request","value":{"instructions":"Use clean SaaS-style motion graphics and subtle camera movement."}}}}}},"responses":{"201":{"description":"B-roll job created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Script not validated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Script not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a B-roll job from a validated script","tags":["B-roll Generation"],"description":"Create a B-roll job from a validated script. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/from-short/{shortId}":{"post":{"operationId":"BrollGenerationController_createFromShort[1]","parameters":[{"name":"shortId","required":true,"in":"path","schema":{"type":"string","example":"018f9f43-1a76-7b1e-a3ce-f01cce71c641"},"description":"Short identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBrollJobFromShortDto"},"examples":{"default":{"summary":"Example request","value":{"instructions":"Use clean SaaS-style motion graphics and subtle camera movement."}}}}}},"responses":{"201":{"description":"B-roll job created","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Short not validated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Short not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Create a B-roll job from a validated short","tags":["B-roll Generation"],"description":"Create a B-roll job from a validated short. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/generate":{"post":{"operationId":"BrollGenerationController_startGeneration[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Generation started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot start generation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Start B-roll generation (AI analysis)","tags":["B-roll Generation"],"description":"Start B-roll generation (AI analysis) through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/render":{"post":{"operationId":"BrollGenerationController_startRendering[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Rendering started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Storyboard not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Start rendering all B-roll scenes","tags":["B-roll Generation"],"description":"Start rendering all B-roll scenes through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/retry":{"post":{"operationId":"BrollGenerationController_retryRendering[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Rendering restarted","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Job not in FAILED state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Retry rendering for a failed job","tags":["B-roll Generation"],"description":"Retry rendering for a failed job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/re-render":{"post":{"operationId":"BrollGenerationController_reRender[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Re-rendering started","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Job not in COMPLETED or FAILED state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Re-render a completed or failed job with fresh component selection","tags":["B-roll Generation"],"description":"Re-render a completed or failed job with fresh component selection. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/scenes/{sceneId}/regenerate":{"post":{"operationId":"BrollGenerationController_regenerateScene[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."},{"name":"sceneId","required":true,"in":"path","schema":{"type":"string","example":"018f9f47-1f28-7fd5-aac4-71e3642b2f9a"},"description":"B-roll scene identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateBrollSceneDto"},"examples":{"default":{"summary":"Example request","value":{"instructions":"Use clean SaaS-style motion graphics and subtle camera movement."}}}}}},"responses":{"200":{"description":"Scene queued for regeneration","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job or scene not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a specific B-roll scene","tags":["B-roll Generation"],"description":"Regenerate a specific B-roll scene through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll":{"get":{"operationId":"BrollGenerationController_findAll[1]","parameters":[],"responses":{"200":{"description":"List of B-roll jobs","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBrollJob"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBrollJob"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all B-roll jobs","tags":["B-roll Generation"],"description":"Get all B-roll jobs through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}":{"get":{"operationId":"BrollGenerationController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"B-roll job details","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBrollJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get a B-roll job by ID","tags":["B-roll Generation"],"description":"Get a B-roll job by ID through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"delete":{"operationId":"BrollGenerationController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Job deleted","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a B-roll job","tags":["B-roll Generation"],"description":"Delete a B-roll job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/storyboard":{"get":{"operationId":"BrollGenerationController_getStoryboard[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Storyboard data","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBrollJob"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get the storyboard for a B-roll job","tags":["B-roll Generation"],"description":"Get the storyboard for a B-roll job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"BrollGenerationController_updateStoryboard[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStoryboardDto"},"examples":{"default":{"summary":"Example request","value":{"instructions":"Use clean SaaS-style motion graphics and subtle camera movement."}}}}}},"responses":{"200":{"description":"Storyboard updated","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBrollJob"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Cannot update storyboard","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update the storyboard before rendering","tags":["B-roll Generation"],"description":"Update the storyboard before rendering through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/scenes":{"get":{"operationId":"BrollGenerationController_getScenes[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"List of scenes","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBrollJob"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBrollJob"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f50-5c13-75f7-98e9-7592b35a7b10","status":"running","currentStep":"scene_rendering","sourceScriptJobId":"018f9f42-9c1d-7b12-97c4-8142b8a27c90","scenes":[],"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get all scenes for a B-roll job","tags":["B-roll Generation"],"description":"Get all scenes for a B-roll job through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/broll/{id}/progress":{"get":{"operationId":"BrollGenerationController_getProgress[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Progress data","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatusResponse"},"examples":{"success":{"summary":"Example response","value":{"status":"running","currentStep":"rendering","progress":0.65,"message":"Generation is in progress","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get rendering progress for a B-roll job","tags":["B-roll Generation"],"description":"Get rendering progress for a B-roll job. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/components":{"get":{"description":"Retrieves all components for the current user with optional filters","operationId":"ComponentLibraryController_findAll[1]","parameters":[{"name":"category","required":false,"in":"query","schema":{"enum":["text","stat","transition","cta","custom"],"type":"string","example":"example"},"description":"category parameter."},{"name":"search","required":false,"in":"query","schema":{"type":"string","example":"founder story"},"description":"Search query used to filter results."},{"name":"isPublic","required":false,"in":"query","schema":{"type":"boolean","example":"example"},"description":"isPublic parameter."},{"name":"isValidated","required":false,"in":"query","schema":{"type":"boolean","example":"example"},"description":"isValidated parameter."},{"name":"includeSystemTemplates","required":false,"in":"query","schema":{"type":"boolean","example":"example"},"description":"includeSystemTemplates parameter."},{"name":"page","required":false,"in":"query","schema":{"type":"number","example":1},"description":"Page number for paginated responses."},{"name":"pageSize","required":false,"in":"query","schema":{"type":"number","example":20},"description":"Maximum number of items to return."}],"responses":{"200":{"description":"Components retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgGeneratedComponent"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgGeneratedComponent"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"List all components","tags":["components"]}},"/v1/components/templates":{"get":{"description":"Retrieves all system template components","operationId":"ComponentLibraryController_getSystemTemplates[1]","parameters":[],"responses":{"200":{"description":"Templates retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgGeneratedComponent"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgGeneratedComponent"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get system templates","tags":["components"]}},"/v1/components/generate":{"post":{"description":"Generate a new component using AI based on user prompt","operationId":"ComponentLibraryController_generate[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateComponentDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Metric comparison card","prompt":"Create a clean animated metric card for a 9:16 video.","category":"metric"}}}}}},"responses":{"201":{"description":"Component generated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Generate a new component","tags":["components"]}},"/v1/components/{id}":{"get":{"description":"Retrieves full details of a specific component","operationId":"ComponentLibraryController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"responses":{"200":{"description":"Component retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgGeneratedComponent"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get component details","tags":["components"]},"delete":{"description":"Delete a component through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"ComponentLibraryController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"responses":{"200":{"description":"Component deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Delete a component","tags":["components"]},"patch":{"description":"Update component metadata (name, description, tags, etc.)","operationId":"ComponentLibraryController_update[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateComponentDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Metric comparison card","prompt":"Create a clean animated metric card for a 9:16 video.","category":"metric"}}}}}},"responses":{"200":{"description":"Component updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgGeneratedComponent"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update a component","tags":["components"]}},"/v1/components/{id}/code":{"patch":{"description":"Update the source code of a component (triggers re-validation)","operationId":"ComponentLibraryController_updateCode[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateComponentCodeDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Metric comparison card","prompt":"Create a clean animated metric card for a 9:16 video.","category":"metric"}}}}}},"responses":{"200":{"description":"Code updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgGeneratedComponent"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update component code","tags":["components"]}},"/v1/components/{id}/validate":{"post":{"description":"Validate the current source code without updating","operationId":"ComponentLibraryController_validate[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"responses":{"200":{"description":"Validation complete","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Validate component code.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Validate component code","tags":["components"]}},"/v1/components/{id}/duplicate":{"post":{"description":"Duplicate a component through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"ComponentLibraryController_duplicate[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID to duplicate","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateComponentDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Metric comparison card","prompt":"Create a clean animated metric card for a 9:16 video.","category":"metric"}}}}}},"responses":{"201":{"description":"Component duplicated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Duplicate a component","tags":["components"]}},"/v1/components/{id}/regenerate":{"post":{"description":"Regenerate the component code using AI with an optional new prompt","operationId":"ComponentLibraryController_regenerate[1]","parameters":[{"name":"id","required":true,"in":"path","description":"Component UUID","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateComponentDto"},"examples":{"default":{"summary":"Example request","value":{"name":"Metric comparison card","prompt":"Create a clean animated metric card for a 9:16 video.","category":"metric"}}}}}},"responses":{"200":{"description":"Component regenerated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"201":{"description":"Created successfully. Regenerate a component.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgGeneratedComponent"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f51-4b89-778f-9c0b-fd4626f47326","name":"Metric comparison card","category":"metric","isPublic":false,"isValidated":true,"createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Regenerate a component","tags":["components"]}},"/v1/youtube-suggestions":{"get":{"description":"Retrieves all suggestions with pagination and optional status filter","operationId":"YouTubeSuggestionsController_findAll[1]","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (default: 1)","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of suggestions per page (default: 10)","schema":{"example":10,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"enum":["pending","approved","rejected","used"],"type":"string","example":"draft"}}],"responses":{"200":{"description":"Suggestions retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgYoutubeSuggestion"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgYoutubeSuggestion"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f52-3661-7657-81c0-bf1d02a1a50e","title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get all YouTube suggestions","tags":["youtube-suggestions"]},"post":{"description":"Manually create a YouTube video idea suggestion","operationId":"YouTubeSuggestionsController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateYouTubeSuggestionDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new"}}}}}},"responses":{"201":{"description":"Suggestion created successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create a new YouTube video suggestion","tags":["youtube-suggestions"]}},"/v1/youtube-suggestions/generate":{"post":{"description":"Uses AI to generate multiple video ideas based on a topic and preferences","operationId":"YouTubeSuggestionsController_generate[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSuggestionsDto"},"examples":{"default":{"summary":"Example request","value":{"topic":"Founder-led content systems","count":5}}}}}},"responses":{"201":{"description":"Suggestions generated successfully","content":{"application/json":{"schema":{"example":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"10 Tips to Master TypeScript in 2024","description":"In this video, we explore...","hook":"Are you still writing JavaScript like it's 2015?","tags":["typescript","programming"],"score":85,"status":"pending"}]},"examples":{"success":{"summary":"Example response","value":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"10 Tips to Master TypeScript in 2024","description":"In this video, we explore...","hook":"Are you still writing JavaScript like it's 2015?","tags":["typescript","programming"],"score":85,"status":"pending"}]}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Generate YouTube video suggestions using AI","tags":["youtube-suggestions"]}},"/v1/youtube-suggestions/stats":{"get":{"description":"Retrieves statistics about YouTube suggestions","operationId":"YouTubeSuggestionsController_getStats[1]","parameters":[],"responses":{"200":{"description":"Statistics retrieved successfully","content":{"application/json":{"schema":{"example":{"total":25,"pending":10,"approved":8,"rejected":5,"used":2,"byCategory":{"tutorial":12,"review":8,"vlog":5}}},"examples":{"success":{"summary":"Example response","value":{"total":25,"pending":10,"approved":8,"rejected":5,"used":2,"byCategory":{"tutorial":12,"review":8,"vlog":5}}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get suggestion statistics","tags":["youtube-suggestions"]}},"/v1/youtube-suggestions/{id}":{"get":{"description":"Retrieves a single YouTube suggestion by ID","operationId":"YouTubeSuggestionsController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the suggestion","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Suggestion retrieved successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgYoutubeSuggestion"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f52-3661-7657-81c0-bf1d02a1a50e","title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Suggestion not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get a specific suggestion","tags":["youtube-suggestions"]},"delete":{"description":"Delete a suggestion through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"YouTubeSuggestionsController_remove[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the suggestion to delete","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}}],"responses":{"200":{"description":"Suggestion deleted successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgYoutubeSuggestion"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f52-3661-7657-81c0-bf1d02a1a50e","title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Suggestion not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete a suggestion","tags":["youtube-suggestions"]},"patch":{"description":"Update a suggestion through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404.","operationId":"YouTubeSuggestionsController_update[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the suggestion to update","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateYouTubeSuggestionDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new"}}}}}},"responses":{"200":{"description":"Suggestion updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgYoutubeSuggestion"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f52-3661-7657-81c0-bf1d02a1a50e","title":"How to turn stories into content","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"new","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Suggestion not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update a suggestion","tags":["youtube-suggestions"]}},"/v1/youtube-suggestions/{id}/status":{"patch":{"description":"Updates the status of a YouTube suggestion (approve, reject, mark as used)","operationId":"YouTubeSuggestionsController_updateStatus[1]","parameters":[{"name":"id","required":true,"in":"path","description":"UUID of the suggestion","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}},{"name":"status","required":true,"in":"query","description":"New status","schema":{"enum":["pending","approved","rejected","used"],"type":"string","example":"draft"}}],"responses":{"200":{"description":"Status updated successfully","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatusResponse"},"examples":{"success":{"summary":"Example response","value":{"status":"running","currentStep":"rendering","progress":0.65,"message":"Generation is in progress","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Suggestion not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update suggestion status","tags":["youtube-suggestions"]}},"/v1/blog/settings":{"get":{"operationId":"BlogController_getSettings[1]","parameters":[],"responses":{"200":{"description":"Successful response. Get blog autopilot settings.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogSettings"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogSettings"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"enabled":true,"siteUrl":"https://yalg.ai","cadence":"weekly","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get blog autopilot settings","tags":["Blog"],"description":"Get blog autopilot settings through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"BlogController_updateSettings[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogSettingsDto"},"examples":{"default":{"summary":"Example request","value":{"enabled":true,"siteUrl":"https://yalg.ai","cadence":"weekly"}}}}}},"responses":{"200":{"description":"Successful response. Update blog autopilot settings.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogSettings"},"examples":{"success":{"summary":"Example response","value":{"enabled":true,"siteUrl":"https://yalg.ai","cadence":"weekly","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Update blog autopilot settings","tags":["Blog"],"description":"Update blog autopilot settings through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/site":{"get":{"operationId":"BlogController_getSite[1]","parameters":[],"responses":{"200":{"description":"Successful response. Get analyzed blog site profile.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"examples":{"success":{"summary":"Example response","value":{"siteUrl":"https://yalg.ai","audience":"B2B creators and founders","positioning":"Turn personal anecdotes into publishable content.","analyzedAt":"2026-06-20T17:24:39.000Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get analyzed blog site profile","tags":["Blog"],"description":"Get analyzed blog site profile through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/site/analyze":{"post":{"operationId":"BlogController_analyzeSite[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeBlogSiteDto"},"examples":{"default":{"summary":"Example request","value":{"siteUrl":"https://yalg.ai"}}}}}},"responses":{"201":{"description":"Created successfully. Analyze and store the user website context.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogSiteProfile"},"examples":{"success":{"summary":"Example response","value":{"siteUrl":"https://yalg.ai","audience":"B2B creators and founders","positioning":"Turn personal anecdotes into publishable content.","analyzedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Analyze and store the user website context","tags":["Blog"],"description":"Analyze and store the user website context. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/keywords":{"get":{"operationId":"BlogController_listKeywords[1]","parameters":[],"responses":{"200":{"description":"Successful response. List imported SEO keywords.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogKeyword"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogKeyword"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f48-08ab-71c2-887d-bbca79017364","keyword":"linkedin storytelling","score":0.82,"createdAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"List imported SEO keywords","tags":["Blog"],"description":"List imported SEO keywords through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/keywords/import":{"post":{"operationId":"BlogController_importKeywords[1]","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}},"examples":{"default":{"summary":"Example request","value":{"file":"<spreadsheet or CSV file>","autoFill":true}}}}}},"responses":{"200":{"description":"Successful response. Import SEO keywords from xlsx, xls, or csv.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"text/csv":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Import SEO keywords from xlsx, xls, or csv","tags":["Blog"],"description":"Import SEO keywords from xlsx, xls, or csv. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/keywords/{id}":{"delete":{"operationId":"BlogController_deleteKeyword[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Delete imported SEO keyword.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogKeyword"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f48-08ab-71c2-887d-bbca79017364","keyword":"linkedin storytelling","score":0.82,"createdAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Delete imported SEO keyword","description":"Delete imported SEO keyword through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/anecdotes":{"get":{"operationId":"BlogController_listAnecdotes[1]","parameters":[],"responses":{"200":{"description":"Successful response. List blog fuel anecdotes.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogAnecdote"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogAnecdote"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f53-7a79-703c-993f-588d176bf5a6","title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds.","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"List blog fuel anecdotes","description":"List blog fuel anecdotes through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"post":{"operationId":"BlogController_createAnecdote[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogFuelAnecdoteDto"},"examples":{"default":{"summary":"Example request","value":{"title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds."}}}}}},"responses":{"201":{"description":"Created successfully. Create blog fuel anecdote.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogAnecdote"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f53-7a79-703c-993f-588d176bf5a6","title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds.","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Create blog fuel anecdote","description":"Create blog fuel anecdote through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/anecdotes/{id}":{"delete":{"operationId":"BlogController_deleteAnecdote[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Delete blog fuel anecdote.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogAnecdote"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f53-7a79-703c-993f-588d176bf5a6","title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds.","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Delete blog fuel anecdote","description":"Delete blog fuel anecdote through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"BlogController_updateAnecdote[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogFuelAnecdoteDto"},"examples":{"default":{"summary":"Example request","value":{"title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds."}}}}}},"responses":{"200":{"description":"Successful response. Update blog fuel anecdote.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogAnecdote"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f53-7a79-703c-993f-588d176bf5a6","title":"A story about trust","content":"The best product insight came from watching a user hesitate for five seconds.","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Update blog fuel anecdote","description":"Update blog fuel anecdote through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles":{"get":{"operationId":"BlogController_listArticles[1]","parameters":[],"responses":{"200":{"description":"Successful response. List blog articles.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogArticle"}},{"allOf":[{"$ref":"#/components/schemas/YalgCollectionPage"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/YalgBlogArticle"}}}}]}]},"examples":{"success":{"summary":"Example response","value":[{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}]}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"List blog articles","description":"List blog articles through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"post":{"operationId":"BlogController_createArticle[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogArticleDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How founder stories become useful content","keywordId":"018f9f48-08ab-71c2-887d-bbca79017364"}}}}}},"responses":{"201":{"description":"Created successfully. Create blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogArticle"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Create blog article","description":"Create blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/export-markdown":{"get":{"operationId":"BlogController_exportMarkdown[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Export blog article markdown.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Export blog article markdown","description":"Export blog article markdown through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}":{"get":{"operationId":"BlogController_getArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Get blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogArticle"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Get blog article","description":"Get blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."},"patch":{"operationId":"BlogController_updateArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogArticleDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How founder stories become useful content","keywordId":"018f9f48-08ab-71c2-887d-bbca79017364"}}}}}},"responses":{"200":{"description":"Successful response. Update blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgBlogArticle"},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Update blog article","description":"Update blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/status":{"patch":{"operationId":"BlogController_updateArticleStatus[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogArticleStatusDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How founder stories become useful content","keywordId":"018f9f48-08ab-71c2-887d-bbca79017364"}}}}}},"responses":{"200":{"description":"Successful response. Update blog article status.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgStatusResponse"},"examples":{"success":{"summary":"Example response","value":{"status":"running","currentStep":"rendering","progress":0.65,"message":"Generation is in progress","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Update blog article status","description":"Update blog article status through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/run":{"post":{"operationId":"BlogController_runArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Start blog article generation.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogArticle"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Start blog article generation","description":"Start blog article generation through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/validate":{"post":{"operationId":"BlogController_validateArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"responses":{"200":{"description":"Successful response. Validate blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogArticle"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Validate blog article","description":"Validate blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/reject":{"post":{"operationId":"BlogController_rejectArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectBlogArticleDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How founder stories become useful content","keywordId":"018f9f48-08ab-71c2-887d-bbca79017364"}}}}}},"responses":{"200":{"description":"Successful response. Reject blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogArticle"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Reject blog article","description":"Reject blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/articles/{id}/regenerate":{"post":{"operationId":"BlogController_regenerateArticle[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"description":"Resource identifier."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateBlogArticleDto"},"examples":{"default":{"summary":"Example request","value":{"title":"How founder stories become useful content","keywordId":"018f9f48-08ab-71c2-887d-bbca79017364"}}}}}},"responses":{"200":{"description":"Successful response. Regenerate blog article.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogArticle"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f54-22d4-783a-a3d9-8bcdf1717032","title":"How founder stories become useful content","status":"draft","markdown":"# How founder stories become useful content","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"404":{"description":"Not found. The resource does not exist or does not belong to the authenticated owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"not_found":{"summary":"Not Found","value":{"statusCode":404,"message":"Resource not found","error":"Not Found","code":"not_found"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"tags":["Blog"],"summary":"Regenerate blog article","description":"Regenerate blog article through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/blog/autopilot/run":{"post":{"operationId":"BlogController_runAutopilot[1]","parameters":[],"responses":{"200":{"description":"Autopilot run result","headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/YalgBlogAutopilotRun"},{"$ref":"#/components/schemas/YalgMutationResult"}]},"examples":{"success":{"summary":"Example response","value":{"status":"queued","createdArticleIds":["018f9f54-22d4-783a-a3d9-8bcdf1717032"],"message":"Blog autopilot run queued"}}}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"409":{"description":"Conflict. The request cannot be completed because the resource is already in another state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"conflict":{"summary":"Conflict","value":{"statusCode":409,"message":"Resource conflict","error":"Conflict","code":"conflict"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Run blog autopilot manually","tags":["Blog"],"description":"Run blog autopilot manually through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/me":{"get":{"operationId":"PublicV1Controller_getMe","parameters":[],"responses":{"200":{"description":"Successful response. Get the authenticated API owner profile.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"examples":{"success":{"summary":"Example response","value":{"id":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f","email":"creator@yalg.ai","firstName":"Nico","lastName":"Creator","plan":"pro","createdAt":"2026-06-20T17:24:39.000Z","updatedAt":"2026-06-20T17:24:39.000Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get the authenticated API owner profile","tags":["public-v1"],"description":"Get the authenticated API owner profile. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}},"/v1/usage":{"get":{"operationId":"PublicV1Controller_getUsage","parameters":[],"responses":{"200":{"description":"Successful response. Get developer API quota and usage.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"examples":{"success":{"summary":"Example response","value":{"monthlyQuota":10000,"monthlyUsed":382,"monthlyRemaining":9618,"perMinuteLimit":120,"currentWindowUsed":3,"currentWindowRemaining":117,"periodStart":"2026-06-01T00:00:00.000Z","periodEnd":"2026-06-30T23:59:59.000Z"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"400":{"description":"Bad request. The request body, query string, path parameter, or uploaded file is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"validation_failed":{"summary":"Bad Request","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request","code":"validation_failed"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"401":{"description":"Authentication failed. Provide a valid `x-api-key` header for public API requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"unauthorized":{"summary":"Unauthorized","value":{"statusCode":401,"message":"Invalid or missing API key","error":"Unauthorized","code":"unauthorized"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"403":{"description":"Forbidden. The authenticated owner does not have access to this feature or resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"forbidden":{"summary":"Forbidden","value":{"statusCode":403,"message":"Access denied","error":"Forbidden","code":"forbidden"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}},"429":{"description":"Rate limit exceeded. Wait for the window to reset before retrying the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"rate_limit_exceeded":{"summary":"Too Many Requests","value":{"statusCode":429,"message":"Rate limit exceeded","error":"Too Many Requests","code":"rate_limit_exceeded","retryAfter":60}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}},"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","example":60}}}},"500":{"description":"Internal server error. An unexpected YALG backend error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YalgErrorResponse"},"examples":{"internal_server_error":{"summary":"Internal Server Error","value":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error","code":"internal_server_error"}}}}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of API requests allowed in the current window.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Number of API requests remaining in the current window.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Unix timestamp, in seconds, when the current rate limit window resets.","schema":{"type":"integer","example":1766246400}}}}},"security":[{"ApiKeyAuth":[]},{"ApiKeyAuth":[]},{"bearer":[]}],"summary":"Get developer API quota and usage","tags":["public-v1"],"description":"Get developer API quota and usage through the YALG API. Requests are scoped to the authenticated API key owner; cross-owner resource IDs return 404."}}},"info":{"title":"YALG Developer API","description":"Public v1 API for integrating with YALG content workflows. Authenticate server-side requests with the `x-api-key` header. Every request is scoped to the API key owner.","version":"1.0","contact":{"name":"YALG Support","url":"https://yalg.ai","email":"support@yalg.ai"},"termsOfService":"https://yalg.ai/terms","license":{"name":"Proprietary","url":"https://yalg.ai"}},"tags":[{"name":"public-v1","description":"Stable public developer API"},{"name":"anecdotes","description":"Public anecdote endpoints"},{"name":"posts","description":"Public post endpoints"},{"name":"post-generation","description":"Public post generation endpoints"},{"name":"script-jobs","description":"Public script job endpoints"},{"name":"shorts","description":"Public short-form video endpoints"},{"name":"carousel","description":"Public carousel endpoints"},{"name":"carousel-generation","description":"Public carousel generation endpoints"},{"name":"broll","description":"Public B-roll generation endpoints"},{"name":"components","description":"Public component library endpoints"},{"name":"Blog","description":"Public blog endpoints"},{"name":"youtube-suggestions","description":"Public YouTube suggestion endpoints"},{"name":"statistics","description":"Public statistics endpoints"}],"servers":[{"url":"https://api.yalg.ai","description":"Production"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"YALG Developer API key. Send it in the `x-api-key` header from a server-side environment only.","x-default":"yalg_live_your_api_key"}},"schemas":{"UpdateProfileDto":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":50,"description":"User first name","example":"John"},"lastName":{"type":"string","minLength":1,"maxLength":50,"description":"User last name","example":"Doe"},"email":{"type":"string","format":"email","description":"User email address","example":"john.doe@example.com"},"profilePicture":{"type":"string","description":"Profile picture URL","example":"https://example.com/profile.jpg"}}},"UpdateNotificationsDto":{"type":"object","properties":{"emailAlerts":{"type":"boolean","description":"Receive email alerts for important updates","example":true},"weeklyDigest":{"type":"boolean","description":"Receive weekly digest emails","example":true},"newComments":{"type":"boolean","description":"Get notified when someone comments on your posts","example":false},"aiReady":{"type":"boolean","description":"Notify when new AI-generated content is ready","example":true},"marketingEmails":{"type":"boolean","description":"Receive marketing emails and tips","example":false}}},"UpdateBillingDto":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","professional","enterprise"],"description":"Subscription plan","example":"professional"},"billingCycle":{"type":"string","enum":["monthly","yearly"],"description":"Billing cycle","example":"monthly"},"nextBillingDate":{"type":"string","description":"Next billing date","example":"2024-03-15T00:00:00Z"},"paymentMethod":{"type":"object","description":"Payment method information","example":{"type":"card","last4":"4242","expiryDate":"12/26"}}}},"UpdateFeatureAccessDto":{"type":"object","properties":{"posts_linkedin":{"type":"boolean","description":"Enable LinkedIn posts"},"posts_facebook":{"type":"boolean","description":"Enable Facebook Page posts"},"anecdotes":{"type":"boolean","description":"Enable anecdote library"},"autopilot":{"type":"boolean","description":"Enable autopilot"},"carousels":{"type":"boolean","description":"Enable carousel generation"},"script_jobs":{"type":"boolean","description":"Enable YouTube script jobs"},"shorts":{"type":"boolean","description":"Enable shorts generation"},"broll":{"type":"boolean","description":"Enable B-roll generation"},"blog":{"type":"boolean","description":"Enable blog generation"}}},"AnecdoteMixDto":{"type":"object","properties":{"personal":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of personal stories","example":30},"professional":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of professional stories","example":50},"lessons":{"type":"number","minimum":0,"maximum":100,"description":"Percentage of lesson learned stories","example":20}},"required":["personal","professional","lessons"]},"ContentStyleDto":{"type":"object","properties":{"useEmojis":{"type":"boolean","description":"Whether to include emojis in posts","example":false},"useArrowLists":{"type":"boolean","description":"Use arrow symbols (->) for list items","example":false},"useBulletPoints":{"type":"boolean","description":"Use bullet points (•) for lists","example":true},"useNumberedLists":{"type":"boolean","description":"Use numbered lists (1. 2. 3.) for sequential points","example":false},"useLineBreaks":{"type":"boolean","description":"Use single line breaks between paragraphs","example":true},"useDoubleLineBreaks":{"type":"boolean","description":"Use double line breaks for visual emphasis","example":false},"useBoldText":{"type":"boolean","description":"Use **bold** to emphasize key points","example":true}},"required":["useEmojis","useArrowLists","useBulletPoints","useNumberedLists","useLineBreaks","useDoubleLineBreaks","useBoldText"]},"SocialPostAutopilotDto":{"type":"object","properties":{"isEnabled":{"type":"boolean","description":"Whether this platform autopilot is enabled","example":true},"goal":{"type":"string","description":"User's goal for this platform","example":"Build a community around practical founder lessons"},"postsPerWeek":{"type":"number","minimum":1,"maximum":7,"description":"Number of posts to publish per week","example":3},"anecdoteMix":{"description":"Mix of anecdote types as percentages","allOf":[{"$ref":"#/components/schemas/AnecdoteMixDto"}]},"addCallToAction":{"type":"boolean","description":"Whether to add call-to-action in posts","example":true},"bestPostingTimes":{"description":"Preferred posting times","example":["morning","evening"],"type":"array","items":{"type":"string"}},"contentStyle":{"description":"Content style preferences for post formatting","allOf":[{"$ref":"#/components/schemas/ContentStyleDto"}]}},"required":["isEnabled","postsPerWeek","anecdoteMix","addCallToAction","bestPostingTimes"]},"UpdateAutopilotDto":{"type":"object","properties":{"isEnabled":{"type":"boolean","description":"Whether autopilot mode is enabled","example":true},"postsPerWeek":{"type":"number","minimum":1,"maximum":7,"description":"Number of posts to publish per week","example":3},"goal":{"type":"string","description":"User's goal","example":"Grow my network"},"anecdoteMix":{"description":"Mix of anecdote types as percentages","allOf":[{"$ref":"#/components/schemas/AnecdoteMixDto"}]},"addCallToAction":{"type":"boolean","description":"Whether to add call-to-action in posts","example":true},"bestPostingTimes":{"description":"Preferred posting times","example":["morning","evening"],"type":"array","items":{"type":"string"}},"contentStyle":{"description":"Content style preferences for post formatting","allOf":[{"$ref":"#/components/schemas/ContentStyleDto"}]},"generateCarousel":{"type":"boolean","description":"Whether to automatically generate Instagram carousels from autopilot posts","example":false},"generateYoutubeScripts":{"type":"boolean","description":"Whether to automatically generate YouTube scripts","example":false},"generateBlogArticles":{"type":"boolean","description":"Whether to automatically generate blog articles","example":false},"generateShorts":{"type":"boolean","description":"Whether to automatically generate video shorts","example":false},"youtubeScriptAngle":{"type":"string","description":"Editorial angle to use when autopilot generates YouTube scripts","example":"Founder lessons with a tactical, story-first hook"},"blogArticleAngle":{"type":"string","description":"Editorial angle to use when autopilot generates blog articles","example":"SEO article grounded in a personal operator story"},"shortsAngle":{"type":"string","description":"Editorial angle to use when autopilot generates shorts","example":"Fast contrarian lesson with one concrete proof point"},"carouselTemplateId":{"type":"string","format":"uuid","description":"The template ID to use for carousel generation. If not provided, uses the first active template.","example":"123e4567-e89b-12d3-a456-426614174000"},"facebookAutopilot":{"description":"Facebook Page autopilot settings","allOf":[{"$ref":"#/components/schemas/SocialPostAutopilotDto"}]}},"required":["isEnabled","postsPerWeek","goal","anecdoteMix","addCallToAction","bestPostingTimes"]},"CreateUserThemeDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the theme","example":"My Custom Theme"},"colors":{"type":"object","description":"Color palette configuration"},"typography":{"type":"object","description":"Typography configuration"},"styling":{"type":"object","description":"Styling options configuration"},"isDefault":{"type":"boolean","description":"Set as default theme","default":false}},"required":["name","colors","typography","styling"]},"UpdateUserThemeDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the theme"},"colors":{"type":"object","description":"Partial color palette update"},"typography":{"type":"object","description":"Partial typography update"},"styling":{"type":"object","description":"Partial styling options update"},"isDefault":{"type":"boolean","description":"Set as default theme"}}},"DuplicateUserThemeDto":{"type":"object","properties":{"name":{"type":"string","description":"Name for the duplicated theme","example":"My Custom Theme Copy"}}},"ImportUserThemeDto":{"type":"object","properties":{"name":{"type":"string","description":"Name for the imported theme"},"themeData":{"type":"object","properties":{"colors":{"type":"object"},"typography":{"type":"object"},"styling":{"type":"object"}},"required":["colors","typography","styling"],"description":"Theme payload containing colors, typography, and styling exported from YALG.","example":{"colors":{"primary":"#e00036","background":"#ffffff","text":"#111111"},"typography":{"fontFamily":"Inter","headingWeight":700},"styling":{"borderRadius":8,"shadow":"soft"}}}},"required":["name","themeData"]},"CreatePostDto":{"type":"object","properties":{"content":{"type":"string","maxLength":5000,"description":"The content of the LinkedIn post (optional for HOOK_CREATED status)","example":"Just had an amazing experience at the tech conference! Here are my key takeaways..."},"agentCreated":{"type":"boolean","description":"Whether the post was created by an agent","example":true},"imageUrl":{"type":"string","maxLength":255,"description":"URL of an image to include in the post","example":"https://example.com/image.jpg"},"videoUrl":{"type":"string","maxLength":255,"description":"URL of a video to include in the post","example":"https://example.com/video.mp4"},"anecdoteIds":{"description":"UUIDs of the anecdotes this post is based on","example":["987fcdeb-51a2-43d7-8f9e-123456789abc","123e4567-e89b-12d3-a456-426614174000"],"type":"array","items":{"type":"string","format":"uuid"}},"tags":{"description":"Tags associated with the post for categorization","example":["technology","conference","networking","learning"],"type":"array","items":{"type":"string"}},"linkedInUrl":{"type":"string","maxLength":500,"description":"Original LinkedIn post URL","example":"https://www.linkedin.com/feed/update/urn:li:activity:1234567890"},"originalTimestamp":{"format":"date-time","type":"string","description":"Original timestamp of the post (for imported posts)","example":"2023-12-01T10:30:00Z"},"scheduledAt":{"format":"date-time","type":"string","description":"Scheduled publication timestamp for the post","example":"2023-12-01T15:30:00Z"},"publishedAt":{"format":"date-time","type":"string","description":"Actual publication timestamp when the post was published","example":"2023-12-01T15:32:15Z"},"likesCount":{"type":"number","minimum":0,"description":"Number of likes/reactions on the post","example":42},"commentsCount":{"type":"number","minimum":0,"description":"Number of comments on the post","example":8},"sharesCount":{"type":"number","minimum":0,"description":"Number of shares/reposts of the post","example":3},"impressionsCount":{"type":"number","minimum":0,"description":"Number of impressions/views of the post","example":1250},"status":{"enum":["drafted","scheduled","published","failed"],"type":"string","description":"Status of the post","example":"published"},"targetPlatforms":{"type":"array","items":{"type":"string","enum":["linkedin","instagram","facebook"]},"description":"Target platforms for publishing","example":["linkedin","instagram","facebook"]},"instagramFormat":{"enum":["carousel","single"],"type":"string","description":"Instagram post format (carousel or single image)","example":"carousel"},"authorId":{"type":"string","description":"Do not send this field in public API requests. YALG ignores arbitrary owner identifiers and derives the owner from the authenticated API key.","deprecated":true}}},"SchedulePostDto":{"type":"object","properties":{"date":{"type":"string","description":"Date for the scheduled post in YYYY-MM-DD format","example":"2024-01-16"},"time":{"type":"string","description":"Time for the scheduled post in HH:MM format (24-hour)","example":"09:00"},"postId":{"type":"string","format":"uuid","description":"UUID of the post to schedule","example":"123e4567-e89b-12d3-a456-426614174000"}},"required":["date","time","postId"]},"UpdatePostDto":{"type":"object","properties":{"content":{"type":"string","maxLength":5000,"description":"The content of the LinkedIn post (optional for HOOK_CREATED status)","example":"Just had an amazing experience at the tech conference! Here are my key takeaways..."},"agentCreated":{"type":"boolean","description":"Whether the post was created by an agent","example":true},"imageUrl":{"type":"string","maxLength":255,"description":"URL of an image to include in the post","example":"https://example.com/image.jpg"},"videoUrl":{"type":"string","maxLength":255,"description":"URL of a video to include in the post","example":"https://example.com/video.mp4"},"anecdoteIds":{"description":"UUIDs of the anecdotes this post is based on","example":["987fcdeb-51a2-43d7-8f9e-123456789abc","123e4567-e89b-12d3-a456-426614174000"],"type":"array","items":{"type":"string","format":"uuid"}},"tags":{"description":"Tags associated with the post for categorization","example":["technology","conference","networking","learning"],"type":"array","items":{"type":"string"}},"linkedInUrl":{"type":"string","maxLength":500,"description":"Original LinkedIn post URL","example":"https://www.linkedin.com/feed/update/urn:li:activity:1234567890"},"originalTimestamp":{"format":"date-time","type":"string","description":"Original timestamp of the post (for imported posts)","example":"2023-12-01T10:30:00Z"},"scheduledAt":{"format":"date-time","type":"string","description":"Scheduled publication timestamp for the post","example":"2023-12-01T15:30:00Z"},"publishedAt":{"format":"date-time","type":"string","description":"Actual publication timestamp when the post was published","example":"2023-12-01T15:32:15Z"},"likesCount":{"type":"number","minimum":0,"description":"Number of likes on the post","example":42},"commentsCount":{"type":"number","minimum":0,"description":"Number of comments on the post","example":8},"sharesCount":{"type":"number","minimum":0,"description":"Number of shares/reposts of the post","example":15},"impressionsCount":{"type":"number","minimum":0,"description":"Number of impressions/views of the post","example":1250},"status":{"enum":["drafted","scheduled","published","failed"],"type":"string","description":"Status of the post","example":"published"},"targetPlatforms":{"type":"array","items":{"type":"string","enum":["linkedin","instagram","facebook"]},"description":"Target platforms for publishing","example":["linkedin","instagram","facebook"]},"instagramFormat":{"enum":["carousel","single"],"type":"string","description":"Instagram post format (carousel or single image)","example":"carousel"},"isActive":{"type":"boolean","description":"Whether the post is active (visible) or soft-deleted","example":true,"default":true},"authorId":{"type":"string","description":"Do not send this field in public API requests. YALG ignores arbitrary owner identifiers and derives the owner from the authenticated API key.","deprecated":true}}},"MarkPublishedDto":{"type":"object","properties":{"linkedInUrl":{"type":"string","description":"URL LinkedIn du post (si déjà publié manuellement)"}}},"CreateHtmlPostDto":{"type":"object","properties":{"userId":{"type":"string","maxLength":100,"description":"UUID of the user who is creating the post","example":"29c2e5af-33f1-4f9f-ae12-f9da956de4d2","format":"uuid"},"htmlContent":{"type":"string","description":"Raw HTML content of the LinkedIn post div","example":"<div class=\"feed-shared-update-v2__control-menu-container display-flex flex-column flex-grow-1\">...</div>"}},"required":["userId","htmlContent"]},"QueuePostResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Post queued for processing"},"queueId":{"type":"string","example":"post_1704123456789_abc123"}},"required":["success","message","queueId"]},"CreateAnecdoteDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"description":"Title of the anecdote (optional when autoFill is enabled)","example":"How I Learned to Lead a Team"},"content":{"type":"string","description":"The full content/story of the anecdote","example":"Last year, I was tasked with leading a cross-functional team for the first time. Initially, I struggled with delegation and tried to micromanage every detail..."},"type":{"default":"voice","enum":["text","voice"],"type":"string","description":"Type of anecdote","example":"voice"},"transcript":{"type":"string","description":"Transcript of the voice anecdote (for voice type anecdotes)","example":"So I was reflecting on my journey from junior developer to tech lead..."},"audioPath":{"type":"string","maxLength":500,"description":"Path to the audio file on disk (for voice type anecdotes)","example":"/uploads/audio/anecdote-001.mp3"},"storyType":{"enum":["professional_stories","personal_stories","lesson_learned"],"type":"string","description":"Type of story/anecdote (optional when autoFill is enabled)","example":"professional_stories"},"authorId":{"type":"string","format":"uuid","description":"UUID of the user who created this anecdote (will be set from authentication token if not provided)","example":"123e4567-e89b-12d3-a456-426614174000"},"tags":{"description":"Tags for categorizing and searching the anecdote (optional when autoFill is enabled)","example":["leadership","teamwork","management","growth"],"type":"array","items":{"type":"string"}},"contentScopes":{"type":"array","items":{"type":"string","enum":["all","linkedin_post","facebook_post","youtube_script","blog_article","short"]},"description":"Content formats where this anecdote can be used. Use all to make it available everywhere.","example":["youtube_script","blog_article"]},"mood":{"type":"string","maxLength":50,"description":"Mood or tone of the anecdote","example":"reflective","enum":["inspiring","humorous","reflective","educational"]},"context":{"type":"string","maxLength":100,"description":"Context where this anecdote took place","example":"startup","enum":["work","startup","client meeting","conference","personal"]},"lessonLearned":{"type":"string","description":"The key lesson or takeaway from this anecdote","example":"Effective leadership requires trust, clear communication, and empowering team members to make decisions."},"linkedinAngle":{"type":"string","description":"How this anecdote could be positioned for LinkedIn posting","example":"Share this as a leadership lesson with focus on team empowerment and growth mindset."},"priority":{"type":"number","default":1,"minimum":1,"maximum":5,"description":"Priority level for using this anecdote (1 = highest priority, 5 = lowest)","example":1},"isFavorite":{"type":"boolean","default":false,"description":"Whether this anecdote is marked as favorite","example":false},"timeSensitive":{"type":"boolean","default":false,"description":"Whether this anecdote is time-sensitive (contains time-bound information like recent events, dates, achievements that should only be used once)","example":false}},"required":["content"]},"UpdateAnecdoteDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"description":"Title of the anecdote (optional when autoFill is enabled)","example":"How I Learned to Lead a Team"},"content":{"type":"string","description":"The full content/story of the anecdote","example":"Last year, I was tasked with leading a cross-functional team for the first time. Initially, I struggled with delegation and tried to micromanage every detail..."},"type":{"default":"voice","enum":["text","voice"],"type":"string","description":"Type of anecdote","example":"voice"},"transcript":{"type":"string","description":"Transcript of the voice anecdote (for voice type anecdotes)","example":"So I was reflecting on my journey from junior developer to tech lead..."},"audioPath":{"type":"string","maxLength":500,"description":"Path to the audio file on disk (for voice type anecdotes)","example":"/uploads/audio/anecdote-001.mp3"},"storyType":{"enum":["professional_stories","personal_stories","lesson_learned"],"type":"string","description":"Type of story/anecdote (optional when autoFill is enabled)","example":"professional_stories"},"authorId":{"type":"string","format":"uuid","description":"UUID of the user who created this anecdote (will be set from authentication token if not provided)","example":"123e4567-e89b-12d3-a456-426614174000"},"tags":{"description":"Tags for categorizing and searching the anecdote (optional when autoFill is enabled)","example":["leadership","teamwork","management","growth"],"type":"array","items":{"type":"string"}},"contentScopes":{"type":"array","items":{"type":"string","enum":["all","linkedin_post","facebook_post","youtube_script","blog_article","short"]},"description":"Content formats where this anecdote can be used. Use all to make it available everywhere.","example":["youtube_script","blog_article"]},"mood":{"type":"string","maxLength":50,"description":"Mood or tone of the anecdote","example":"reflective","enum":["inspiring","humorous","reflective","educational"]},"context":{"type":"string","maxLength":100,"description":"Context where this anecdote took place","example":"startup","enum":["work","startup","client meeting","conference","personal"]},"lessonLearned":{"type":"string","description":"The key lesson or takeaway from this anecdote","example":"Effective leadership requires trust, clear communication, and empowering team members to make decisions."},"linkedinAngle":{"type":"string","description":"How this anecdote could be positioned for LinkedIn posting","example":"Share this as a leadership lesson with focus on team empowerment and growth mindset."},"priority":{"type":"number","default":1,"minimum":1,"maximum":5,"description":"Priority level for using this anecdote (1 = highest priority, 5 = lowest)","example":1},"isFavorite":{"type":"boolean","default":false,"description":"Whether this anecdote is marked as favorite","example":false},"timeSensitive":{"type":"boolean","default":false,"description":"Whether this anecdote is time-sensitive (contains time-bound information that should only be used once)","example":false},"usageCount":{"type":"number","minimum":0,"description":"Number of times this anecdote has been used in posts","example":3},"isActive":{"type":"boolean","description":"Whether this anecdote is active and available for use","example":true,"default":true}}},"CreatePostJobDto":{"type":"object","properties":{"anecdoteId":{"type":"string","format":"uuid","description":"Identifier of the anecdote to transform into a post.","example":"018f9f41-22a1-74bb-9450-7dd0d21ab8ab"},"platform":{"enum":["linkedin","facebook"],"type":"string"}},"required":["anecdoteId"]},"RegeneratePostGenerationJobDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"description":"Why the post generation job should be regenerated. This helps YALG adjust the next draft.","example":"Make the hook more specific and shorten the conclusion."}},"required":["reason"]},"RejectPostGenerationJobDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"description":"Why the post generation job is being rejected. This reason is saved with the workflow state.","example":"The post does not match the selected anecdote."}},"required":["reason"]},"CarouselTemplateConfigDto":{"type":"object","properties":{"profileImageUrl":{"type":"string","description":"Profile image URL"},"backgroundImageUrl":{"type":"string","description":"Background image URL"},"authorName":{"type":"string","maxLength":50,"description":"Author name displayed in footer"},"badgeText":{"type":"string","maxLength":30,"description":"Badge text","example":"Automatisation"},"primaryColor":{"type":"string","pattern":"/^#[0-9a-fA-F]{6}$/","description":"Primary color (gradient start)","example":"#B58A4E"},"secondaryColor":{"type":"string","pattern":"/^#[0-9a-fA-F]{6}$/","description":"Secondary color (gradient middle)","example":"#FED6A0"},"accentColor":{"type":"string","pattern":"/^#[0-9a-fA-F]{6}$/","description":"Accent color (gradient end)","example":"#936615"},"backgroundColor":{"type":"string","pattern":"/^#[0-9a-fA-F]{6}$/","description":"Background color","example":"#1a1a1a"},"textColor":{"type":"string","pattern":"/^#[0-9a-fA-F]{6}$/","description":"Text color","example":"#ffffff"},"titleFont":{"type":"string","description":"Title font family","example":"League Gothic"},"bodyFont":{"type":"string","description":"Body font family","example":"Manrope"}}},"CreateTemplateDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"description":"Template name","example":"Mon Template Doré"},"config":{"description":"Template configuration (optional - mainly for image URLs)","allOf":[{"$ref":"#/components/schemas/CarouselTemplateConfigDto"}]}},"required":["name"]},"UpdateTemplateDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"description":"Template name","example":"Mon Nouveau Template"},"config":{"description":"Template configuration","allOf":[{"$ref":"#/components/schemas/CarouselTemplateConfigDto"}]}}},"User":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"password":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"profilePicture":{"type":"string"},"linkedinUserId":{"type":"string"},"linkedinUsername":{"type":"string"},"linkedinAccessToken":{"type":"string"},"linkedinRefreshToken":{"type":"string"},"linkedinTokenExpiresAt":{"format":"date-time","type":"string"},"linkedinProfile":{"type":"object"},"instagramUserId":{"type":"string"},"instagramUsername":{"type":"string"},"instagramAccessToken":{"type":"string"},"instagramTokenExpiresAt":{"format":"date-time","type":"string"},"instagramFacebookPageId":{"type":"string"},"facebookPageId":{"type":"string"},"facebookPageName":{"type":"string"},"facebookUserAccessToken":{"type":"string"},"facebookPageAccessToken":{"type":"string"},"facebookTokenExpiresAt":{"format":"date-time","type":"string"},"githubUserId":{"type":"string"},"githubUsername":{"type":"string"},"githubAccessToken":{"type":"string"},"githubTokenExpiresAt":{"format":"date-time","type":"string"},"githubProfile":{"type":"object"},"language":{"type":"string"},"emailAlerts":{"type":"boolean"},"weeklyDigest":{"type":"boolean"},"newComments":{"type":"boolean"},"aiReady":{"type":"boolean"},"marketingEmails":{"type":"boolean"},"plan":{"type":"string"},"billingCycle":{"type":"string"},"nextBillingDate":{"format":"date-time","type":"string"},"paymentMethod":{"type":"object"},"postsGeneratedThisMonth":{"type":"number"},"anecdotesStored":{"type":"number"},"stripeCustomerId":{"type":"string"},"stripeSubscriptionId":{"type":"string"},"stripeDefaultPaymentMethodId":{"type":"string"},"subscriptionStatus":{"type":"string"},"trialStartDate":{"format":"date-time","type":"string"},"trialEndDate":{"format":"date-time","type":"string"},"subscriptionStartDate":{"format":"date-time","type":"string"},"subscriptionEndDate":{"format":"date-time","type":"string"},"currentPeriodStart":{"format":"date-time","type":"string"},"currentPeriodEnd":{"format":"date-time","type":"string"},"cancelAtPeriodEnd":{"type":"boolean"},"paymentMethods":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"last4":{"type":"string"},"brand":{"type":"string"},"expiryMonth":{"type":"number"},"expiryYear":{"type":"number"},"isDefault":{"type":"boolean"}},"required":["id","type","last4","isDefault"]}},"lastInvoiceId":{"type":"string"},"lastPaymentDate":{"format":"date-time","type":"string"},"lastPaymentAmount":{"type":"number"},"failedPaymentAttempts":{"type":"number"},"lastFailedPaymentDate":{"format":"date-time","type":"string"},"usageResetDate":{"format":"date-time","type":"string"},"monthlyUsage":{"type":"object","properties":{"posts":{"type":"number"},"anecdotes":{"type":"number"},"apiCalls":{"type":"number"}},"required":["posts"]},"usageLimits":{"type":"object","properties":{"posts":{"type":"number"},"anecdotes":{"type":"number"},"apiCalls":{"type":"number"},"apiRateLimitPerMinute":{"type":"number"}},"required":["posts","anecdotes"]},"featureAccess":{"type":"object"},"stripeCouponId":{"type":"string"},"discountEnd":{"format":"date-time","type":"string"},"discountPercent":{"type":"number"},"autopilotSettings":{"type":"object","properties":{"isEnabled":{"type":"boolean"},"goal":{"type":"string"},"postsPerWeek":{"type":"number"},"anecdoteMix":{"type":"object","properties":{"personal":{"type":"number"},"professional":{"type":"number"},"lessons":{"type":"number"}}},"addCallToAction":{"type":"boolean"},"bestPostingTimes":{"type":"array","items":{"type":"string"}},"contentStyle":{"type":"object","properties":{"useEmojis":{"type":"boolean"},"useArrowLists":{"type":"boolean"},"useBulletPoints":{"type":"boolean"},"useNumberedLists":{"type":"boolean"},"useLineBreaks":{"type":"boolean"},"useDoubleLineBreaks":{"type":"boolean"},"useBoldText":{"type":"boolean"}}},"generateCarousel":{"type":"boolean"},"generateYoutubeScripts":{"type":"boolean"},"generateBlogArticles":{"type":"boolean"},"generateShorts":{"type":"boolean"},"youtubeScriptAngle":{"type":"string"},"blogArticleAngle":{"type":"string"},"shortsAngle":{"type":"string"},"carouselTemplateId":{"type":"string"},"useAgenticPipeline":{"type":"boolean"},"facebookAutopilot":{"type":"object","properties":{"isEnabled":{"type":"boolean"},"goal":{"type":"string"},"postsPerWeek":{"type":"number"},"anecdoteMix":{"type":"object","properties":{"personal":{"type":"number"},"professional":{"type":"number"},"lessons":{"type":"number"}}},"addCallToAction":{"type":"boolean"},"bestPostingTimes":{"type":"array","items":{"type":"string"}},"contentStyle":{"type":"object","properties":{"useEmojis":{"type":"boolean"},"useArrowLists":{"type":"boolean"},"useBulletPoints":{"type":"boolean"},"useNumberedLists":{"type":"boolean"},"useLineBreaks":{"type":"boolean"},"useDoubleLineBreaks":{"type":"boolean"},"useBoldText":{"type":"boolean"}}}}}},"required":["isEnabled","goal","postsPerWeek","anecdoteMix","addCallToAction","bestPostingTimes","contentStyle","facebookAutopilot"]},"posts":{"type":"array","items":{"type":"object"}},"anecdotes":{"type":"array","items":{"type":"object"}},"themes":{"type":"array","items":{"type":"object"}},"defaultThemeId":{"type":"string"},"styleAnalysis":{"type":"object"},"isActive":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","email","firstName","lastName","language","emailAlerts","weeklyDigest","newComments","aiReady","marketingEmails","plan","billingCycle","postsGeneratedThisMonth","anecdotesStored","subscriptionStatus","cancelAtPeriodEnd","failedPaymentAttempts","featureAccess","posts","anecdotes","themes","isActive","createdAt","updatedAt"]},"CarouselTemplate":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"user":{"$ref":"#/components/schemas/User"},"userId":{"type":"string"},"config":{"type":"object"},"isActive":{"type":"boolean"},"isCustomLayout":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","user","userId","config","isActive","isCustomLayout","createdAt","updatedAt"]},"CarouselLivePreviewDto":{"type":"object","properties":{"config":{"description":"Unsaved template configuration to render as a preview","allOf":[{"$ref":"#/components/schemas/CarouselTemplateConfigDto"}]}}},"GenerateCarouselDto":{"type":"object","properties":{"templateId":{"type":"string","format":"uuid","description":"Template ID to use for generation"},"slideCount":{"type":"number","minimum":2,"maximum":4,"description":"Number of content slides to generate (2-4)"}}},"GenerateCarouselFromContentDto":{"type":"object","properties":{"content":{"type":"string","description":"Content to transform into carousel"},"templateId":{"type":"string","format":"uuid","description":"Template ID to use for generation"},"authorName":{"type":"string","description":"Author name for the carousel"}},"required":["content"]},"CreateCarouselJobDto":{"type":"object","properties":{"postId":{"type":"string","format":"uuid","description":"Identifier of the post to transform into a carousel.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}},"required":["postId"]},"ValidateCarouselJobDto":{"type":"object","properties":{"templateId":{"type":"string","description":"Template ID to use for rendering"}}},"RegenerateCarouselJobDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for regeneration"}},"required":["reason"]},"CreateScriptJobDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the script job"},"brief":{"type":"string","description":"Brief or description for the script"},"selectionMode":{"type":"string","enum":["auto"],"description":"Anecdote selection mode. V1 supports auto only.","default":"auto"}},"required":["title"]},"UpdateScriptJobDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Updated script title"},"brief":{"type":"string","description":"Updated script brief"},"scriptContent":{"type":"string","minLength":1,"maxLength":100000,"description":"Updated script content"}}},"RegenerateScriptJobDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"maxLength":1000,"description":"Why the script job should be regenerated. This helps YALG adjust the next version.","example":"Make the script more concise and add a stronger opener."}},"required":["reason"]},"RejectScriptJobDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"maxLength":1000,"description":"Why the script job is being rejected. This reason is saved with the workflow state.","example":"The script misses the requested angle."}},"required":["reason"]},"UpdateStatusDto":{"type":"object","properties":{"status":{"enum":["CREATED","RUNNING","READY_FOR_VALIDATION","REJECTED","VALIDATED","BLOCKED","THUMBNAIL_CREATING","THUMBNAIL_CREATED","REPURPOSING_IN_PROGRESS","REPURPOSING_COMPLETED","FAILED"],"type":"string"}},"required":["status"]},"CreateShortDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the short"},"brief":{"type":"string","description":"Brief or description for the short"},"selectionMode":{"type":"string","enum":["auto"],"description":"Anecdote selection mode. V1 supports auto only.","default":"auto"}},"required":["title"]},"CreateShortFromScriptJobDto":{"type":"object","properties":{"title":{"type":"string","description":"Optional title override for the short"},"brief":{"type":"string","description":"Optional brief override for the short"},"selectionMode":{"type":"string","enum":["auto"],"description":"Anecdote selection mode. V1 supports auto only.","default":"auto"}}},"GenerateAllShortsErrorDto":{"type":"object","properties":{"shortId":{"type":"string","description":"ID of the short that failed to start generation","format":"uuid"},"error":{"type":"string","description":"Failure reason for this short","example":"Short is not ready for generation"}},"required":["shortId","error"]},"GenerateAllShortsResponseDto":{"type":"object","properties":{"totalStarted":{"type":"number","description":"Number of shorts successfully started","example":3},"totalFailed":{"type":"number","description":"Number of shorts that could not be started","example":1},"errors":{"description":"Per-short failures","type":"array","items":{"$ref":"#/components/schemas/GenerateAllShortsErrorDto"}}},"required":["totalStarted","totalFailed","errors"]},"UpdateShortDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the short"},"brief":{"type":"string","description":"Brief or description for the short"},"content":{"type":"object","description":"Short content (ShortOutput JSON)"},"formattedScript":{"type":"string","description":"Formatted script text"}}},"UpdateShortStatusDto":{"type":"object","properties":{"status":{"enum":["CREATED","RUNNING","READY_FOR_VALIDATION","VALIDATED","THUMBNAIL_CREATING","THUMBNAIL_CREATED","COMPLETED","REJECTED","FAILED"],"type":"string","description":"The new status to set","example":"VALIDATED"}},"required":["status"]},"RegenerateShortDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for regenerating the short"}}},"RejectShortDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for rejecting the short"}}},"CreateBrollJobFromScriptDto":{"type":"object","properties":{"format":{"default":"HORIZONTAL","enum":["HORIZONTAL","VERTICAL","SQUARE","16:9","9:16","1:1"],"type":"string","description":"Video format for B-roll generation. Accepts: HORIZONTAL, VERTICAL, SQUARE or 16:9, 9:16, 1:1"}},"required":["format"]},"CreateBrollJobFromShortDto":{"type":"object","properties":{"format":{"default":"VERTICAL","enum":["HORIZONTAL","VERTICAL","SQUARE","16:9","9:16","1:1"],"type":"string","description":"Video format for B-roll generation. Accepts: HORIZONTAL, VERTICAL, SQUARE or 16:9, 9:16, 1:1"}},"required":["format"]},"RegenerateBrollSceneDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for regeneration"}}},"UpdateStoryboardDto":{"type":"object","properties":{"storyboard":{"type":"object","description":"Updated storyboard JSON"}},"required":["storyboard"]},"GenerateComponentDto":{"type":"object","properties":{"prompt":{"type":"string","minLength":10,"maxLength":2000,"description":"Natural language description of the component to generate","example":"A stat card that displays a percentage with a circular progress indicator"},"category":{"enum":["text","stat","transition","cta","custom"],"type":"string","description":"Category for the component","example":"stat"},"name":{"type":"string","maxLength":200,"description":"Name for the component","example":"Circular Progress Card"},"tags":{"description":"Tags for searchability","example":["stat","progress","circular"],"type":"array","items":{"type":"string"}},"themeId":{"type":"string","format":"uuid","description":"Theme ID to use for generation context"},"isPublic":{"type":"boolean","description":"Whether the component should be public","default":false}},"required":["prompt","category"]},"UpdateComponentDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"description":"Name for the component"},"description":{"type":"string","maxLength":1000,"description":"Description of the component"},"category":{"enum":["text","stat","transition","cta","custom"],"type":"string","description":"Category for the component"},"tags":{"description":"Tags for searchability","type":"array","items":{"type":"string"}},"defaultProps":{"type":"object","description":"Default props for the component"},"isPublic":{"type":"boolean","description":"Whether the component should be public"}}},"UpdateComponentCodeDto":{"type":"object","properties":{"sourceCode":{"type":"string","description":"Updated source code for the component"}}},"DuplicateComponentDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"description":"Name for the duplicated component","example":"Kinetic title card copy"}}},"RegenerateComponentDto":{"type":"object","properties":{"prompt":{"type":"string","maxLength":2000,"description":"Optional prompt override for regenerating the component","example":"Make the animation calmer and keep the same color palette"}}},"CreateYouTubeSuggestionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"description":"Video title","example":"10 Tips to Master TypeScript in 2024"},"description":{"type":"string","description":"Video description","example":"In this video, we explore the best practices for TypeScript development..."},"hook":{"type":"string","description":"Video hook/intro","example":"Are you still writing JavaScript like it's 2015? Here's what you're missing..."},"tags":{"description":"Video tags","example":["typescript","programming","tutorial"],"type":"array","items":{"type":"string"}},"keywords":{"description":"SEO keywords","example":["typescript tutorial","learn typescript","typescript 2024"],"type":"array","items":{"type":"string"}},"category":{"enum":["tutorial","review","vlog","educational","entertainment","news","how_to","interview","documentary","other"],"type":"string","description":"Video category","example":"tutorial"},"estimatedDuration":{"type":"string","description":"Estimated video duration","example":"15-20 minutes"},"targetAudience":{"type":"string","description":"Target audience description","example":"Intermediate JavaScript developers looking to level up"}},"required":["title","description"]},"GenerateSuggestionsDto":{"type":"object","properties":{"topic":{"type":"string","description":"Topic or niche to generate suggestions for","example":"web development"},"count":{"type":"number","minimum":1,"maximum":10,"description":"Number of suggestions to generate","example":5},"targetAudience":{"type":"string","description":"Target audience for the suggestions","example":"beginners"},"category":{"enum":["tutorial","review","vlog","educational","entertainment","news","how_to","interview","documentary","other"],"type":"string","description":"Preferred video category"},"language":{"type":"string","description":"Language for suggestions","example":"fr"}},"required":["topic"]},"UpdateYouTubeSuggestionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"description":"Video title","example":"10 Tips to Master TypeScript in 2024"},"description":{"type":"string","description":"Video description","example":"In this video, we explore the best practices for TypeScript development..."},"hook":{"type":"string","description":"Video hook/intro","example":"Are you still writing JavaScript like it's 2015? Here's what you're missing..."},"tags":{"description":"Video tags","example":["typescript","programming","tutorial"],"type":"array","items":{"type":"string"}},"keywords":{"description":"SEO keywords","example":["typescript tutorial","learn typescript","typescript 2024"],"type":"array","items":{"type":"string"}},"category":{"enum":["tutorial","review","vlog","educational","entertainment","news","how_to","interview","documentary","other"],"type":"string","description":"Video category","example":"tutorial"},"estimatedDuration":{"type":"string","description":"Estimated video duration","example":"15-20 minutes"},"targetAudience":{"type":"string","description":"Target audience description","example":"Intermediate JavaScript developers looking to level up"},"status":{"enum":["pending","approved","rejected","used"],"type":"string","description":"Suggestion status","example":"approved"}}},"UpdateBlogSettingsDto":{"type":"object","properties":{"isEnabled":{"type":"boolean","description":"Enables or disables blog autopilot for the owner.","example":true},"articlesPerWeek":{"type":"number","minimum":1,"maximum":21,"description":"Target number of blog articles to generate per week.","example":2},"articlesPerRun":{"type":"number","minimum":1,"maximum":10,"description":"Maximum number of blog articles to generate in one autopilot run.","example":1},"defaultLanguage":{"type":"string","maxLength":10,"description":"Default output language code for blog articles.","example":"en"},"minSeoScore":{"type":"number","minimum":0,"maximum":100,"description":"Minimum SEO score, from 0 to 100, required for an imported keyword to be eligible.","example":70}}},"AnalyzeBlogSiteDto":{"type":"object","properties":{"siteUrl":{"type":"string","minLength":3,"maxLength":1000,"example":"https://example.com"}},"required":["siteUrl"]},"CreateBlogFuelAnecdoteDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300,"description":"Short internal title for the source anecdote.","example":"The onboarding lesson"},"content":{"type":"string","minLength":1,"description":"Raw story, note, transcript, or observation to use as blog fuel.","example":"A customer got stuck on step one, which showed us the product was explaining itself too late."},"tags":{"maxItems":20,"type":"array","items":{"type":"string"},"description":"Optional labels used to organize and retrieve blog fuel anecdotes.","example":["onboarding","product"]}},"required":["title","content"]},"UpdateBlogFuelAnecdoteDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300,"description":"Updated internal title for the source anecdote.","example":"The onboarding lesson"},"content":{"type":"string","minLength":1,"description":"Updated story, note, transcript, or observation to use as blog fuel.","example":"A customer got stuck on step one, which showed us the product was explaining itself too late."},"tags":{"maxItems":20,"type":"array","items":{"type":"string"},"description":"Replacement labels used to organize and retrieve blog fuel anecdotes.","example":["onboarding","product"]},"isUsed":{"type":"boolean","description":"Marks whether this fuel anecdote has already been used in a generated article.","example":false}}},"CreateBlogArticleDto":{"type":"object","properties":{"topic":{"type":"string","minLength":1,"maxLength":500,"description":"Topic to generate into an SEO blog article"},"angle":{"type":"string","maxLength":2000,"description":"Optional editorial angle"},"selectionMode":{"type":"string","enum":["auto"],"description":"Anecdote selection mode. V1 supports auto only.","default":"auto"},"targetKeywordIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"},"description":"Optional SEO keyword identifiers to use as article targets. Omit this field to let YALG select eligible keywords automatically.","example":["018f9f48-08ab-71c2-887d-bbca79017364"]},"fuelAnecdoteIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"},"description":"Optional blog fuel anecdote identifiers to ground the article in source stories. Omit this field for automatic selection.","example":["018f9f53-7a79-703c-993f-588d176bf5a6"]},"language":{"type":"string","maxLength":10,"description":"Preferred output language code for the generated article.","example":"en"}},"required":["topic"]},"UpdateBlogArticleDto":{"type":"object","properties":{"topic":{"type":"string","minLength":1,"maxLength":500,"description":"Updated article topic or working title.","example":"How founder stories become useful content"},"angle":{"type":"string","maxLength":2000,"description":"Updated editorial angle, positioning, or constraints for the article.","example":"Write for B2B founders who publish on LinkedIn."},"targetKeywordIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"},"description":"Replacement SEO keyword identifiers to target in the article.","example":["018f9f48-08ab-71c2-887d-bbca79017364"]},"fuelAnecdoteIds":{"maxItems":50,"type":"array","items":{"type":"string","format":"uuid"},"description":"Replacement blog fuel anecdote identifiers to use as source material.","example":["018f9f53-7a79-703c-993f-588d176bf5a6"]},"language":{"type":"string","maxLength":10,"description":"Updated output language code.","example":"en"},"articleMarkdown":{"type":"string","description":"Editable Markdown body for the article draft or final article.","example":"# How founder stories become useful content"}}},"UpdateBlogArticleStatusDto":{"type":"object","properties":{"status":{"enum":["CREATED","RUNNING","READY_FOR_VALIDATION","VALIDATED","PUBLISHED","REJECTED","BLOCKED","FAILED"],"type":"string"}},"required":["status"]},"RejectBlogArticleDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"maxLength":1000,"description":"Why the article is being rejected. This reason is saved with the workflow state.","example":"The article does not match the requested positioning."}},"required":["reason"]},"RegenerateBlogArticleDto":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"maxLength":1000,"description":"Why the article should be regenerated. This helps YALG adjust the next draft.","example":"Make the article more tactical and reduce repetition."}},"required":["reason"]},"YalgJsonPayload":{"type":"object","additionalProperties":true,"description":"JSON payload returned by YALG. Some legacy endpoints return dynamic third-party or domain objects; concrete DTOs are used where stable shapes exist."},"YalgErrorResponse":{"type":"object","required":["statusCode","message"],"description":"Standard error payload returned by YALG API endpoints. Validation errors may return `message` as an array of field-level messages.","properties":{"statusCode":{"type":"integer","example":400},"message":{"oneOf":[{"type":"string","example":"Bad request"},{"type":"array","items":{"type":"string"},"example":["field must be a string"]}]},"error":{"type":"string","example":"Bad Request"},"code":{"type":"string","example":"validation_failed","description":"Stable machine-readable error code when the backend can provide one."},"requestId":{"type":"string","example":"req_01HX7Y6D3XQ4J8W9Z0A1B2C3D4","description":"Request correlation identifier. Include this when contacting YALG support."},"retryAfter":{"type":"integer","example":60,"description":"Seconds to wait before retrying. Present on some rate-limit responses."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured details for validation or domain errors."}}},"YalgMutationResult":{"type":"object","description":"Generic result returned by mutation endpoints when the endpoint does not return a full domain object.","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Operation completed successfully"},"id":{"type":"string","format":"uuid","description":"Identifier of the affected resource when available."}},"additionalProperties":true},"YalgCollectionPage":{"type":"object","description":"Paginated collection response. Some legacy list endpoints return an array directly; generated references use `oneOf` where both shapes are possible.","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer","example":42},"page":{"type":"integer","example":1},"limit":{"type":"integer","example":20},"totalPages":{"type":"integer","example":3}},"additionalProperties":true},"YalgApiOwnerProfile":{"type":"object","description":"Authenticated YALG account profile.","properties":{"id":{"type":"string","format":"uuid","description":"User identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"email":{"type":"string","format":"email","example":"creator@yalg.ai"},"firstName":{"type":"string","example":"Nico"},"lastName":{"type":"string","example":"Creator"},"picture":{"type":"string","format":"uri"},"plan":{"type":"string","example":"pro"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgDeveloperUsage":{"type":"object","description":"Developer API quota and usage for the authenticated owner.","properties":{"monthlyQuota":{"type":"integer","example":10000},"monthlyUsed":{"type":"integer","example":382},"monthlyRemaining":{"type":"integer","example":9618},"perMinuteLimit":{"type":"integer","example":120},"currentWindowUsed":{"type":"integer","example":3},"currentWindowRemaining":{"type":"integer","example":117},"periodStart":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"periodEnd":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgUserAccount":{"type":"object","description":"YALG user account profile.","properties":{"id":{"type":"string","format":"uuid","description":"User identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"email":{"type":"string","format":"email","example":"creator@yalg.ai"},"firstName":{"type":"string","example":"Nico"},"lastName":{"type":"string","example":"Creator"},"role":{"type":"string","example":"user"},"plan":{"type":"string","example":"pro"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgAuthSession":{"type":"object","description":"Authentication response with bearer tokens and the authenticated user.","properties":{"accessToken":{"type":"string","description":"Short-lived bearer token.","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"refreshToken":{"type":"string","description":"Refresh token used to obtain a new access token.","example":"refresh_01HX7Y6D3XQ4J8W9Z0A1B2C3D4"},"expiresIn":{"type":"integer","example":3600},"user":{"$ref":"#/components/schemas/YalgUserAccount"}},"additionalProperties":true},"YalgDeveloperApiKey":{"type":"object","description":"Developer API key metadata. The full secret is only returned once at creation.","properties":{"id":{"type":"string","format":"uuid","description":"API key identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"name":{"type":"string","example":"Production backend"},"prefix":{"type":"string","example":"yalg_live"},"publicId":{"type":"string","example":"pk_01HX7Y6D3XQ4J8W9Z0A"},"key":{"type":"string","description":"Full API key secret. Present only immediately after creation.","example":"yalg_live_pk_01HX7Y6D3XQ4J8W9Z0A.secret"},"last4":{"type":"string","example":"9z0a"},"isActive":{"type":"boolean","example":true},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"lastUsedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgOAuthUrl":{"type":"object","description":"OAuth authorization URL response.","properties":{"authUrl":{"type":"string","format":"uri","example":"https://www.linkedin.com/oauth/v2/authorization?..."},"state":{"type":"string","example":"oauth_state_01HX7Y6D3XQ4J8W9Z0A"}},"additionalProperties":true},"YalgSocialAccount":{"type":"object","description":"Connected social account or page.","properties":{"id":{"type":"string","format":"uuid","description":"Social connection identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"platform":{"type":"string","example":"linkedin"},"accountId":{"type":"string","example":"urn:li:person:abc123"},"displayName":{"type":"string","example":"Nico Creator"},"isConnected":{"type":"boolean","example":true},"connectedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgPushToken":{"type":"object","description":"Registered push notification token.","properties":{"id":{"type":"string","format":"uuid","description":"Push token identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"token":{"type":"string","example":"ExponentPushToken[abc123]"},"platform":{"type":"string","example":"ios"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgStripeResource":{"type":"object","description":"Stripe billing resource summary.","properties":{"id":{"type":"string","example":"sub_1234567890"},"status":{"type":"string","example":"active"},"customerId":{"type":"string","example":"cus_1234567890"},"priceId":{"type":"string","example":"price_1234567890"},"url":{"type":"string","format":"uri","example":"https://billing.stripe.com/p/session/test"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgStatusResponse":{"type":"object","description":"Status or progress payload for an asynchronous YALG workflow.","properties":{"status":{"type":"string","example":"running"},"currentStep":{"type":"string","example":"rendering"},"progress":{"type":"number","example":0.65},"message":{"type":"string","example":"Generation is in progress"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgStatisticsSummary":{"type":"object","description":"Aggregated statistics or dashboard metrics.","properties":{"total":{"type":"integer","example":42},"byStatus":{"type":"object","additionalProperties":{"type":"integer"}},"recentItems":{"type":"array","items":{"type":"object","additionalProperties":true}},"generatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgUserTheme":{"type":"object","description":"Reusable YALG writing style theme.","properties":{"id":{"type":"string","format":"uuid","description":"Theme identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"name":{"type":"string","example":"Founder voice"},"description":{"type":"string","example":"Opinionated and direct"},"isDefault":{"type":"boolean","example":false},"config":{"type":"object","additionalProperties":true},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgAnecdote":{"type":"object","description":"Source anecdote used by YALG content workflows.","properties":{"id":{"type":"string","format":"uuid","description":"Anecdote identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"title":{"type":"string","example":"The onboarding lesson"},"content":{"type":"string","example":"A short story that can be turned into content."},"mood":{"type":"string","example":"reflective"},"storyType":{"type":"string","example":"lesson"},"tags":{"type":"array","items":{"type":"string"}},"isFavorite":{"type":"boolean","example":false},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgPost":{"type":"object","description":"Social post managed by YALG.","properties":{"id":{"type":"string","format":"uuid","description":"Post identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"anecdoteId":{"type":"string","format":"uuid","description":"Source anecdote identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"content":{"type":"string","example":"A publishable LinkedIn post generated from an anecdote."},"platform":{"type":"string","example":"linkedin"},"status":{"type":"string","example":"draft"},"scheduledAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"publishedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"likes":{"type":"integer","example":12},"comments":{"type":"integer","example":3},"shares":{"type":"integer","example":1},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgPostGenerationJob":{"type":"object","description":"AI job that turns an anecdote into a post draft.","properties":{"id":{"type":"string","format":"uuid","description":"Job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"status":{"type":"string","example":"pending"},"currentStep":{"type":"string","example":"draft_generation"},"qualityScore":{"type":"number","example":0.91},"riskLevel":{"type":"string","example":"low"},"warnings":{"type":"array","items":{"type":"string"}},"totalTokensUsed":{"type":"integer","example":1284},"startedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"completedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"anecdoteId":{"type":"string","format":"uuid","description":"Source anecdote identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"resultingPostId":{"type":"string","format":"uuid","description":"Generated post identifier, when created.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}},"additionalProperties":true},"YalgCarouselTemplate":{"type":"object","description":"Carousel template configuration.","properties":{"id":{"type":"string","format":"uuid","description":"Template identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"name":{"type":"string","example":"Minimal red"},"config":{"type":"object","additionalProperties":true},"isDefault":{"type":"boolean","example":false},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgCarouselGeneration":{"type":"object","description":"Carousel or carousel-generation job.","properties":{"id":{"type":"string","format":"uuid","description":"Job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"status":{"type":"string","example":"pending"},"currentStep":{"type":"string","example":"draft_generation"},"qualityScore":{"type":"number","example":0.91},"riskLevel":{"type":"string","example":"low"},"warnings":{"type":"array","items":{"type":"string"}},"totalTokensUsed":{"type":"integer","example":1284},"startedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"completedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"postId":{"type":"string","format":"uuid","description":"Source post identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"carouselId":{"type":"string","format":"uuid","description":"Generated carousel identifier, when created.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"}},"additionalProperties":true},"YalgScriptJob":{"type":"object","description":"Long-form script generation job.","properties":{"id":{"type":"string","format":"uuid","description":"Job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"status":{"type":"string","example":"pending"},"currentStep":{"type":"string","example":"draft_generation"},"qualityScore":{"type":"number","example":0.91},"riskLevel":{"type":"string","example":"low"},"warnings":{"type":"array","items":{"type":"string"}},"totalTokensUsed":{"type":"integer","example":1284},"startedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"completedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"title":{"type":"string","example":"Why creators need stories"},"selectedAnecdoteIds":{"type":"array","items":{"type":"string","format":"uuid"}},"thumbnailStatus":{"type":"string","example":"pending"}},"additionalProperties":true},"YalgShort":{"type":"object","description":"Short-form video generation job.","properties":{"id":{"type":"string","format":"uuid","description":"Job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"status":{"type":"string","example":"pending"},"currentStep":{"type":"string","example":"draft_generation"},"qualityScore":{"type":"number","example":0.91},"riskLevel":{"type":"string","example":"low"},"warnings":{"type":"array","items":{"type":"string"}},"totalTokensUsed":{"type":"integer","example":1284},"startedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"completedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"title":{"type":"string","example":"The 30-second lesson"},"sourceScriptJobId":{"type":"string","format":"uuid","description":"Source script job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"thumbnailStatus":{"type":"string","example":"pending"}},"additionalProperties":true},"YalgBrollJob":{"type":"object","description":"B-roll generation and rendering job.","properties":{"id":{"type":"string","format":"uuid","description":"Job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"status":{"type":"string","example":"pending"},"currentStep":{"type":"string","example":"draft_generation"},"qualityScore":{"type":"number","example":0.91},"riskLevel":{"type":"string","example":"low"},"warnings":{"type":"array","items":{"type":"string"}},"totalTokensUsed":{"type":"integer","example":1284},"startedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"completedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"sourceScriptJobId":{"type":"string","format":"uuid","description":"Source script job identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"sourceShortId":{"type":"string","format":"uuid","description":"Source short identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"scenes":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":true},"YalgGeneratedComponent":{"type":"object","description":"Generated visual component.","properties":{"id":{"type":"string","format":"uuid","description":"Component identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"name":{"type":"string","example":"Metric counter"},"category":{"type":"string","example":"chart"},"code":{"type":"string","description":"Generated component source code."},"isPublic":{"type":"boolean","example":false},"isValidated":{"type":"boolean","example":true},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgYoutubeSuggestion":{"type":"object","description":"YouTube suggestion tracked by YALG.","properties":{"id":{"type":"string","format":"uuid","description":"Suggestion identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"title":{"type":"string","example":"How to turn stories into posts"},"url":{"type":"string","format":"uri"},"status":{"type":"string","example":"new"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogSettings":{"type":"object","description":"Blog autopilot settings.","properties":{"enabled":{"type":"boolean","example":true},"siteUrl":{"type":"string","format":"uri","example":"https://yalg.ai"},"cadence":{"type":"string","example":"weekly"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogSiteProfile":{"type":"object","description":"Stored website context for blog generation.","properties":{"siteUrl":{"type":"string","format":"uri","example":"https://yalg.ai"},"audience":{"type":"string","example":"B2B creators and founders"},"positioning":{"type":"string","example":"Turn personal anecdotes into publishable content."},"summary":{"type":"string"},"analyzedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogKeyword":{"type":"object","description":"Imported SEO keyword.","properties":{"id":{"type":"string","format":"uuid","description":"Keyword identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"keyword":{"type":"string","example":"linkedin storytelling"},"score":{"type":"number","example":0.82},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogAnecdote":{"type":"object","description":"Anecdote selected as blog fuel.","properties":{"id":{"type":"string","format":"uuid","description":"Blog anecdote identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"title":{"type":"string","example":"A story about trust"},"content":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogArticle":{"type":"object","description":"Blog article generation job.","properties":{"id":{"type":"string","format":"uuid","description":"Article identifier.","example":"018f9f40-7d7b-7712-9b0f-2e5d9fd5df3f"},"title":{"type":"string","example":"How to make stories useful"},"status":{"type":"string","example":"draft"},"markdown":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-06-20T17:24:39.000Z"}},"additionalProperties":true},"YalgBlogAutopilotRun":{"type":"object","description":"Result of a manual blog autopilot run.","properties":{"status":{"type":"string","example":"queued"},"createdArticleIds":{"type":"array","items":{"type":"string","format":"uuid"}},"skippedReason":{"type":"string","example":"No eligible keyword found"},"message":{"type":"string","example":"Blog autopilot run queued"}},"additionalProperties":true}}}}